我正在尝试在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中执行此操作。
答案 0 :(得分:0)
我对你想要做的事情有一个完美无效的想法。但是,代码和概念中存在 HUGE 问题:
黄油频率必须是采样频率的一半。因此你 正在实现2000Hz的15Hz和500Hz采样,这肯定不是你所需要的,
您正在使用filter
-zero,极点,过滤器提供ZPK
命令 -
结构,'filter'命令接收B
和A
TF
多项式。这可能导致不可预测的错误结果,
当f0
为f1
时,您无法在f1
和fs/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]);
或其他关闭,而不是非常奈奎斯特切割。
这是一个校正版本,适用于30Hz和950Hz之间的采样滤波器,采样频率为2000Hz:
{{1}}
问候!...