diff --git a/gstlal/python/reference_psd.py b/gstlal/python/reference_psd.py index 8c62a93bcc786a15cf1925a000fb1319a313d425..bd6cd35f7cb4321d1cd8c96c25acc3d84fa71311 100644 --- a/gstlal/python/reference_psd.py +++ b/gstlal/python/reference_psd.py @@ -608,3 +608,41 @@ def interpolate_psd(psd, deltaF): sampleUnits = psd.sampleUnits, data = psd_data ) + + +def movingmedian(psd, window_size): + data = numpy.copy(psd.data) + for i in range(window_size, len(data)-window_size): + data[i] = numpy.median(data[i-window_size:i+window_size]) + return laltypes.REAL8FrequencySeries( + name = psd.name, + epoch = psd.epoch, + f0 = psd.f0, + deltaF = psd.deltaF, + sampleUnits = psd.sampleUnits, + data = data + ) + + +def polyfit(psd, minsample, maxsample, order, verbose = False): + # f / f_min between f_min and f_max, i.e. f[0] here is 1 + f = numpy.arange(maxsample - minsample) * psd.deltaF + 1 + data = psd.data[minsample:maxsample] + + logf = numpy.linspace(numpy.log(f[0]), numpy.log(f[-1]), 100000) + interp = interpolate.interp1d(numpy.log(f), numpy.log(data)) + data = interp(logf) + p = numpy.poly1d(numpy.polyfit(logf, data, order)) + if verbose: + print >> sys.stderr, "\nFit polynomial is: \n\nlog(PSD) = \n", p, "\n\nwhere x = f / f_min\n" + data = numpy.exp(p(numpy.log(f))) + olddata = psd.data + olddata[minsample:maxsample] = data + return laltypes.REAL8FrequencySeries( + name = psd.name, + epoch = psd.epoch, + f0 = psd.f0, + deltaF = psd.deltaF, + sampleUnits = psd.sampleUnits, + data = olddata + )