我很难用“纽扣”和“黄油”函数计算巴特沃斯系数。我的目标是过滤掉我构造的时间序列中的噪声。该时间序列具有红色噪声分量和频率为0.3 Hz的正弦信号。时间序列的采样频率为10 Hz。
在关于“http://www.mathworks.com/help/signal/ref/buttord.html”的文档之后,我为规范计算了n,Wn (遵循文档的示例1):
Wp = 0.33/(sfreq/2); Ws = 0.37/(sfreq/2);
passripp = 0.1; stopatten = 40;
[n,Wn] = buttord(Wp,Ws,passripp,stopatten);
[b,a] = butter(n,Wn);
y_butter = filter(b,a,timeseries(:,2));用时间绘制y_butter只会给我任何地方的零!
我试图使用“freqz”检查滤波器的频率响应(使用512个样本):
freqz(b,a,512,sfreq)其图显示过渡带在1~4 Hz之间!
我对过滤器的理解是:
您的帮助将不胜感激!
数据可以在这里下载: http://dl.dropbox.com/u/1918592/detrendedTS.mat 列1是时间变量,第2列是数据变量。
我去了一个线性拟合(Matlab‘下降趋势’),以消除一些走开的红色噪声行为。
发布于 2012-11-08 10:42:12
您发布的代码生成了第57次(!)命令筛选器执行要执行的操作。freqz命令确实显示了该过滤器是有效的,但是如果不首先使用tf2sos将其转换为二阶部分,那么尝试直接实现这样一个高阶过滤器无疑会导致严重的数值错误。这可能就是你只看到零的原因。如果将滤波器系数转换为二阶段,然后级联滤波器,则应该使用freqz命令实际得到过滤器输出。
你之所以得到如此高的过滤顺序,首先是因为你把开始和停止的波段放置得非常近。对于简单的低通巴特沃斯滤波器来说,buttord函数的使用是完全不必要的.就用..。
[b,a] = butter(n,cut/(sfreq/2));..。只要选择n给你你想要的滚滚(6,12,18 dB等等)。。)。只有在使用双精度数据表示时,n才会遇到问题,但是您可能会发现一个相对较小的筛选顺序将完成您想要的工作。
https://stackoverflow.com/questions/13283706
复制相似问题