首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于巴特沃斯滤波器设计的MATLAB -输入频率

用于巴特沃斯滤波器设计的MATLAB -输入频率
EN

Stack Overflow用户
提问于 2012-11-08 06:29:32
回答 1查看 3.6K关注 0票数 2

我很难用“纽扣”和“黄油”函数计算巴特沃斯系数。我的目标是过滤掉我构造的时间序列中的噪声。该时间序列具有红色噪声分量和频率为0.3 Hz的正弦信号。时间序列的采样频率为10 Hz。

在关于“http://www.mathworks.com/help/signal/ref/buttord.html”的文档之后,我为规范计算了n,Wn (遵循文档的示例1):

代码语言:javascript
复制
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个样本):

代码语言:javascript
复制
freqz(b,a,512,sfreq)

其图显示过渡带在1~4 Hz之间!

我对过滤器的理解是:

  • 0.3赫兹信号
  • >> 0.3Hz噪声
  • 通过从0到0.33赫兹的所有信号
  • 衰减0.36赫兹以外的一切

您的帮助将不胜感激!

数据可以在这里下载: http://dl.dropbox.com/u/1918592/detrendedTS.mat 列1是时间变量,第2列是数据变量

我去了一个线性拟合(Matlab‘下降趋势’),以消除一些走开的红色噪声行为。

EN

回答 1

Stack Overflow用户

发布于 2012-11-08 10:42:12

您发布的代码生成了第57次(!)命令筛选器执行要执行的操作。freqz命令确实显示了该过滤器是有效的,但是如果不首先使用tf2sos将其转换为二阶部分,那么尝试直接实现这样一个高阶过滤器无疑会导致严重的数值错误。这可能就是你只看到零的原因。如果将滤波器系数转换为二阶段,然后级联滤波器,则应该使用freqz命令实际得到过滤器输出。

你之所以得到如此高的过滤顺序,首先是因为你把开始和停止的波段放置得非常近。对于简单的低通巴特沃斯滤波器来说,buttord函数的使用是完全不必要的.就用..。

代码语言:javascript
复制
[b,a] = butter(n,cut/(sfreq/2));

..。只要选择n给你你想要的滚滚(6,12,18 dB等等)。。)。只有在使用双精度数据表示时,n才会遇到问题,但是您可能会发现一个相对较小的筛选顺序将完成您想要的工作。

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

https://stackoverflow.com/questions/13283706

复制
相关文章

相似问题

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