我试图使用Python中的Butterworth过滤器,如这条线中所描述的那样:
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y在不应用过滤器的情况下,我的数据的FFT输出给出了以下图:

但是,在应用上面的过滤器之后:
lowcut = 1.0
highcut = 50.0
x2_Vtcr = butter_bandpass_filter(x_Vtcr, lowcut, highcut, fs, order=4)其中fs是作为FFT得到的采样频率(在我的例子中是1000):

看起来滤波器把频率移到左边,而我没有得到它应该在哪里的峰值。知道为什么会发生这种事吗?
以防万一我把数据文件(第二列)放在哪里。DC很强,所以在FFT之后,第一个元素不应该包含在图中。
谢谢!
发布于 2014-11-05 14:54:46
上面的两个功能在这里似乎工作得很好。这是在您的fs=250中采样并使用您提到的两种功能进行滤波的白噪声信号的一个例子,其通带在1Hz到50 Hz之间,就像您所做的那样:
from numpy import random, arange
from numpy.fft import rfft, rfftfreq
fs = 250.
t = arange(0., 30., 1 / fs)
x_Vtcr = random.randn(len(t))
hat_x_Vtcr = rfft(x_Vtcr)
freqs = rfftfreq(x_Vtcr.size, 1 / fs)
plt.plot(freqs, abs(hat_x_Vtcr), 'b')
lowcut, highcut = 1.0, 50.0
x2_Vtcr = butter_bandpass_filter(x_Vtcr, lowcut, highcut, fs, order=4)
hat_x2_Vtcr = rfft(x2_Vtcr)
plt.plot(freqs, abs(hat_x2_Vtcr), 'r')由此产生的PSD对我来说很好(红色是过滤的):

我猜你的错误在别的地方?请将您的代码与上述代码段进行比较。您可能还希望下次阅读这。
编辑:回复评论。
它确实也适用于您的数据。我做了:
datafile=loadtxt('V.dat')
x_Vtcr=datafile[:,1]
x_Vtcr-=x_Vtcr.mean()然后我运行上面的脚本,当然没有生成x_Vtcr数据的行。得到的过滤输出如下:

https://stackoverflow.com/questions/26757271
复制相似问题