matlab - 使用过滤器对象和 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');
这是我得到的结果:
解决方案
这是由来自 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)
推荐阅读
- angular - 如何在 Angular 模板驱动的表单中对验证消息进行单元测试
- python - 如何使用可逆方法将 3 个矩阵组合成 1 个矩阵?
- javascript - 事件监听器来操作尚不存在的元素
- python - 如何在 Python 中提升 Decimal 模块
- android - AndroidX 中的 MotionLayout
- java - QueueManager 未连接给定异常:MQJE001:
- java - 配置 Tomcat Classloader 在其他位置之前查看随附的 jar 文件
- python-3.x - 添加自定义页面字段 wagtail api 返回相关字段的空数组
- c - gcc:错误:/e:/source codes/C/Practice/helloWorld.c:无效参数
- windows - 如何检查连接在 VBScript 中是否具有有效的目的地?