cog/Frameworks/libsidplay/sidplay-residfp-code/fc-curves/scripts/find-center-freq.py

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()