97 lines
2.7 KiB
Python
Executable File
97 lines
2.7 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import os, sys, math, glob
|
|
|
|
def read_xy_file(filename, offset):
|
|
f = file(filename)
|
|
vals = []
|
|
for line in f:
|
|
x, y = line.split()
|
|
x = float(x)
|
|
y = float(y)
|
|
vals.append([x, y + offset(x, y)])
|
|
return vals
|
|
|
|
def main():
|
|
fftdir = sys.argv[1]
|
|
fnlp = "%s/lp_%%04d.wav.fft" % fftdir
|
|
fnhp = "%s/hp_%%04d.wav.fft" % fftdir
|
|
|
|
cutoffs = [];
|
|
for x in range(0, 2047):
|
|
if not os.path.exists(fnlp % x):
|
|
continue
|
|
cutoffs.append(x)
|
|
|
|
result = []
|
|
for cf in cutoffs:
|
|
|
|
# no correction function, but we should also dump
|
|
# the difference between lp and hp.
|
|
lp = read_xy_file(fnlp % cf, lambda x, y: 0)
|
|
hp = read_xy_file(fnhp % cf, lambda x, y: 0)
|
|
|
|
noise_threshold = 3
|
|
cf_est = 0
|
|
cf_n = 0
|
|
|
|
lens = range(len(lp))
|
|
for i in lens:
|
|
if lp[i][0] != hp[i][0]:
|
|
raise RuntimeError, "invalid content in cf %d" % cf
|
|
|
|
# zrx has a weird chip with freq ~ 140 Hz!
|
|
if lp[i][0] < 120 or lp[i][0] > 20000:
|
|
continue
|
|
|
|
# disregard video signal spikes and some side spikes, unknown
|
|
# origin... the 4900 Hz spike seems to multiply
|
|
if lp[i][0] > 4500 and lp[i][0] < 4600:
|
|
continue
|
|
if lp[i][0] > 4800 and lp[i][0] < 4900:
|
|
continue
|
|
if lp[i][0] > 6650 and lp[i][0] < 6750:
|
|
continue
|
|
if lp[i][0] > 9740 and lp[i][0] < 9860:
|
|
continue
|
|
if lp[i][0] > 15600 and lp[i][0] < 15800:
|
|
continue
|
|
if lp[i][0] > 19500 and lp[i][0] < 19650:
|
|
continue
|
|
if lp[i][0] > 20150 and lp[i][0] < 20250:
|
|
continue
|
|
if lp[i][0] > 10050 and lp[i][0] < 10150:
|
|
continue
|
|
|
|
if abs(lp[i][1] - hp[i][1]) > noise_threshold:
|
|
continue
|
|
|
|
# this is ad-hoc weighing method. The values closer to crossing
|
|
# point get more weight. The right model might be logarithmic, not ** 2.
|
|
weight = noise_threshold - abs(lp[i][1] - hp[i][1]);
|
|
weight = weight ** 2
|
|
cf_est += weight * lp[i][0];
|
|
cf_n += weight;
|
|
|
|
# dump average
|
|
if cf_n == 0:
|
|
cf_n = 1
|
|
source = "%d,%d" % (cf, cf_est / cf_n)
|
|
result.append(source)
|
|
|
|
for i in range(len(result)):
|
|
print result[i].replace(",", " ")
|
|
return
|
|
|
|
print "[FilterMeasurement]"
|
|
print "type=1"
|
|
print "points=%d" % len(result)
|
|
for i in range(len(result)):
|
|
print "point%d=%s" % (i+1, result[i])
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
|
|
|