首页 > 解决方案 > 使用过滤器对象和 b,a 系数的结果非常不同

问题描述

我正在比较使用 MATLABfilter对象的数字滤波的输出和使用函数的 ba 系数tf,它们确实不同。如果有人能指出我正确的方向,我将不胜感激。这是我的结果和测试脚本(下载data.txt):

srate=64;
freqrange=[0.4 3.5];
file='data.txt';
load(file);
file=split(file,'.');
file=file{1};
data=eval(file);

st=srate*60;
ed=srate*60*2;
data=data(st:ed);%1 minute data
m=numel(data);

x=data;
R=0.1;%10% of signal
Nr=50;
NR=min(round(m*R),Nr);%At most 50 points
x1=2*x(1)-flipud(x(2:NR+1));%maintain continuity in level and slope
x2=2*x(end)-flipud(x(end-NR:end-1));
x=[x1;x;x2];

[xx,dbp]=bandpass(x,freqrange,srate);%same result if use filter(dbp,xx)
data_fil=xx(NR+1:end-NR);

[b,a]=dbp.tf;
xx=filter(b,a,x);
data_fil_ba=xx(NR+1:end-NR);

f=figure;
s(1)=subplot(2,1,1,'Parent',f);
plot(s(1),[data data_fil])
title(s(1),'dbp')
s(2)=subplot(2,1,2,'Parent',f);
plot(s(2),[data data_fil_ba])
title(s(2),'ba')
linkaxes(s,'x');

这是我得到的结果:

过滤输出

标签: matlabfilteringsignal-processingbandpass-filter

解决方案


这是由来自 Matlab文档[b,a]的滤波器表示中的数值不稳定性引起的:

传递函数语法的数值不稳定性

通常,使用[z,p,k]语法来设计 IIR 滤波器。要分析或实现您的过滤器,您可以将[z,p,k]输出与zp2sos. 如果您使用[b,a]语法设计过滤器,您可能会遇到数字问题。这些问题是由于舍入误差造成的,并且可能在 n 低至 4 时发生。

查看带有 的滤波器fvtool,您会看到(digitalFilter对象的)第一个图是平滑的,而第二个图是用传递函数表示生成的,在较低频率范围内非常不稳定。这个滤波器的幅度甚至超过 0 dB,这意味着滤波器不稳定并且会放大这些频率。这就是为什么你的结果会爆炸的原因,它达到了 ~10^92。

解决方案是简单地不使用传递函数 ( [b,a]) 表示,而是使用digitalFilter, or[z,p,k]表示。有关为什么要小心切换过滤器/模型表示的更多信息,请参见此处。

在此处输入图像描述

代码

srate=64;
freqrange=[0.4 3.5];
[~,dbp]=bandpass(rand(100,1),freqrange,srate);
[b,a]=dbp.tf;
fvtool(dbp)
fvtool(b,a)

推荐阅读