我在尝试在MATLAB中创建/使用过滤器时遇到了麻烦,这种过滤器在非常低的频率下足够准确。
我对5到50Hz之间的一系列信号很感兴趣,高频段并不是太值得关注,我真正想做的是滤除5Hz以下的任何信号。然而,我发现Butterworth滤波器在滤波方面做得很少,它只是将信号衰减到正常信号的一半左右。
我尝试了两种方法。一个是使用MATLABs过滤工具fdatool
,另一个是下面的手动方法:
filtLow = 5;
filtHigh = 50;
Fs = 1000;
[b, a] = butter(1, filtLow/(Fs/2), 'high');
y = filtfilt(b, a, data);
或
[b, a] = butter(1, [filtLow/(Fs/2), filtHigh/(Fs/2)]);
y = filtfilt(b, a, data);
任何人都可以给我一个建议或代码,可能会给我更好的结果吗?
答案 0 :(得分:1)
如果你想要5-50Hz范围内的信号,那么你的滤波器的顺序很可能会很高。此外,尽管通带中的线性相位和平坦频率响应没有从通带到拒绝的最佳滚降,但是一个butterworth滤波器。如果你可以稍微扭曲,椭圆形或贝塞尔滤波器会让你更加紧凑。另外,如果你使用5 Hz作为截止频率,理论上它应该是-3 dB点,这就是为什么你看到1/2的衰减。你需要考虑一些规范。
您认为这可以确定所需的可实现的衰减。现在,它看起来好像你想在一个频率上无限衰减。不幸的是,您需要确定设计可接受的频率范围内的衰减。
我在高通部分试了手,想出了以下内容:
Fs = 1000;
BW = Fs/2;
% get the recommended order and cutoff for high pass
[n,Wc] = buttord(10/BW,5/BW,3,10);
% get the butterworth filter
[b,a] = butter(n,Wc);
% get the frequency response
[H,W] = freqz(b,a);
% plot the low end of the response
plot( BW*W(1:10)/pi, 20*log10(abs(H(1:10))) )
给我 - >
这似乎很合理。