39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
from os import path
|
|
import subprocess
|
|
import json
|
|
|
|
import numpy as np
|
|
np.set_printoptions(linewidth=240)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(metavar='test_data_directory', dest='dir', help='Directory with test data .bin files')
|
|
default_binary = path.abspath(path.join(path.dirname(__file__), '../build/tools/freq_meas_test'))
|
|
parser.add_argument(metavar='test_binary', dest='binary', nargs='?', default=default_binary)
|
|
parser.add_argument('-d', '--dump', help='Write raw measurements to JSON file')
|
|
args = parser.parse_args()
|
|
|
|
bin_files = [ path.join(args.dir, d) for d in os.listdir(args.dir) if d.lower().endswith('.bin') ]
|
|
|
|
savedata = {}
|
|
for p in bin_files:
|
|
output = subprocess.check_output([args.binary, p], stderr=subprocess.DEVNULL)
|
|
measurements = np.array([ float(value) for _offset, value in [ line.split() for line in output.splitlines() ] ])
|
|
savedata[p] = list(measurements)
|
|
|
|
# Cut off first and last sample for mean and RMS calculations as these show boundary effects.
|
|
measurements = measurements[1:-1]
|
|
mean = np.mean(measurements)
|
|
rms = np.sqrt(np.mean(np.square(measurements - mean)))
|
|
|
|
print(f'{path.basename(p):<60}: mean={mean:<8.4f}Hz rms={rms*1000:.3f}mHz')
|
|
|
|
if args.dump:
|
|
with open(args.dump, 'w') as f:
|
|
json.dump(savedata, f)
|
|
|