首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蟒蛇中的Butterworth滤波器

蟒蛇中的Butterworth滤波器
EN

Stack Overflow用户
提问于 2014-11-05 12:30:31
回答 1查看 5.7K关注 0票数 1

我试图使用Python中的Butterworth过滤器,如这条线中所描述的那样:

代码语言:javascript
复制
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输出给出了以下图:

但是,在应用上面的过滤器之后:

代码语言:javascript
复制
lowcut = 1.0
highcut = 50.0
x2_Vtcr = butter_bandpass_filter(x_Vtcr, lowcut, highcut, fs, order=4)

其中fs是作为FFT得到的采样频率(在我的例子中是1000):

看起来滤波器把频率移到左边,而我没有得到它应该在哪里的峰值。知道为什么会发生这种事吗?

以防万一我把数据文件(第二列)放在哪里。DC很强,所以在FFT之后,第一个元素不应该包含在图中。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-11-05 14:54:46

上面的两个功能在这里似乎工作得很好。这是在您的fs=250中采样并使用您提到的两种功能进行滤波的白噪声信号的一个例子,其通带在1Hz到50 Hz之间,就像您所做的那样:

代码语言:javascript
复制
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对我来说很好(红色是过滤的):

我猜你的错误在别的地方?请将您的代码与上述代码段进行比较。您可能还希望下次阅读

编辑:回复评论。

它确实也适用于您的数据。我做了:

代码语言:javascript
复制
datafile=loadtxt('V.dat')
x_Vtcr=datafile[:,1]
x_Vtcr-=x_Vtcr.mean()

然后我运行上面的脚本,当然没有生成x_Vtcr数据的行。得到的过滤输出如下:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26757271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档