Matlab Butterworth过滤器返回NaN

时间:2014-04-09 23:29:42

标签: matlab filter

我正在尝试在Matlab中应用butterworth过滤器。我按如下方式设置了过滤器:

[z,p,k] = butter(5,[30/2000,1000/2000]); 

即。切断低于30 Hz和高于1000 Hz(以2000 Hz采样)

输入数据是较大矩阵中的列,A。

然后我按如下方式应用过滤器:

M=filter(z,p,A(:,2));

并且还尝试过:

M=filtfilt(z,p,A(:,2));

A有1577563行。过滤器返回实际值到行~1700左右,但之后条目为NaN。我已经尝试从A(:,2)中提取选择的值,这些值在M中生成NaN,但是就这些值而言,这些返回数字,所以我假设它与A的长度有关,而不是具体的值。这似乎是过滤函数的不稳定性,因为NaN的起点在不同的测试中有所不同。

我尝试过减少订单,但是使用第二级甚至是第一级过滤器获得了类似的结果。

如果有办法,我很乐意在A(:,2)中上传数据,但我不知道如何在StackExchange中执行此操作。

1 个答案:

答案 0 :(得分:0)

我对你想要做的事情有一个完美无效的想法。但是,代码和概念中存在 HUGE 问题:

  1. 黄油频率必须是采样频率的一半。因此你 正在实现2000Hz的15Hz和500Hz采样,这肯定不是你所需要的,

  2. 您正在使用filter -zero,极点,过滤器提供ZPK命令 - 结构,'filter'命令接收BA TF 多项式。这可能导致不可预测的错误结果,

  3. f0f1时,您无法在f1fs/2之间设置带通 奈奎斯特,半采样率,f0。如果是这样,请使用f1=900并设置 过滤器为高通!如果你还需要带通,请选择 x = randn(500,1); % Input to the filter [b,a] = butter(5,[30/2000,950/2000]*2); y=filter(b,a,x); fvtool(b,a); plot([x y]); 或其他关闭,而不是非常奈奎斯特切割。

  4. 这是一个校正版本,适用于30Hz和950Hz之间的采样滤波器,采样频率为2000Hz:

    {{1}}

    问候!...