2012-11-08 75 views
2

我很难用'buttord'和'butter'函数来计算巴特沃思系数。我的目标是过滤掉我构建的时间序列中的噪音。时间序列具有红色噪声分量和频率为0.3Hz的正弦信号。 时间序列的采样频率为10 Hz。MATLAB - 巴特沃思滤波器设计的输入频率

继 'buttord' 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之间的!

我的过滤器后面的理解是:在

  • 信号以0.3赫兹
  • 噪声>> 0.3赫兹
  • 通过一切从0到0.33赫兹
  • 衰减一切从超出
  • 0.36赫兹

您的帮助将不胜感激!

数据可以在这里下载:http://dl.dropbox.com/u/1918592/detrendedTS.mat的“TS”是时间可变的,第2栏是数据可变

我去趋势的线性拟合(Matlab的消除趋势')以除去一些步入式的1列远离红色噪音行为。

回答

3

您发布的代码会生成第57个(!!!!)顺序过滤器,以执行您想要执行的操作。 freqz命令的确显示这个过滤器是有效的,但是试图直接实现这样一个高阶过滤器而没有首先使用tf2sos将其转换为二阶部分将毫无疑问地导致严重的数字错误。这可能就是为什么你只看到零。如果将滤波器系数转换为二阶部分,然后级联滤波器,则实际上应该使用freqz命令获得滤波器输出。

您首先得到如此高的过滤顺序的原因是因为您已经非常密切地放置了起始和停止带。对于简单的低通巴特沃斯滤波器,使用buttord函数是完全不必要的。只需使用...

[b,a] = butter(n,cut/(sfreq/2)); 

...随便挑n给你你想要的滚降(6,12,18分贝等)。在使用双精度数据表示法时,只有当n变为大约10时,才会遇到问题,但您可能会发现相对较小的过滤器顺序可以完成您想要的工作。

+0

谢谢您的回复。 你简单的低通就足够了,但对于未来的工作,我仍然想让buttord工作。'sos,g] = tf2sos(b,a)',然后级联滤波器'Hd = dfilt.df2sos(sos,g)',然后应用滤波器ybutter = filter(Hd,timeseries)仍然给我零。 频率响应'freqz(Hd)'采用标准化单位,我不知道如何解释。 – janon128

+0

好的,很酷。修正你的时间系列代码(它给了我一个错误),我会帮助更多:) – learnvst

+0

我正在使用的(detrended)时间系列可在这里: http://dl.dropbox.com/u/ 1918592/detrendedTS.mat 其中第一列是时间数据,第二列是生成的数据。 – janon128