为何Matlab设计的FIR滤波器输入DC信号时输出异常偏小?
FIR滤波器输入DC信号输出极小的问题分析
问题描述
用户使用MATLAB设计了一款自定义幅度响应的FIR滤波器,代码如下:
N = 40; fs = 20 * 10 ^ 9; freq = [0, 1 * 10 ^ 9, 2 * 10 ^ 9, 3 * 10 ^ 9, 5 * 10 ^ 9, 7.5 * 10 ^ 9, 10 * 10 ^ 9] mag = [1, 1, 1, 0.3, 0.1, 0.005, 0.001] d = fdesign.arbmag('N,F,A', N, freq, mag, fs); W = [1, 1, 1, 1, 1, 1, 1]; fir = design(d, 'equiripple', 'weights', W, 'SystemObject', true); sents = ones(1, 300) * 1.0; rcvds = fir(sents); % plot figure(1) stem(sents) hold on stem(rcvds) legend('sents', 'received')
预期滤波器具备低通特性,输入全1的DC信号后,输出却极小。但用freqz查看幅频响应显示设计正常,需排查异常原因。
原因分析
- 滤波器暂态过程未结束:这里创建的是
dsp.FIRFilter系统对象,这类对象默认初始状态为全0。当输入DC信号时,滤波器需要经过一段暂态过程才能进入稳态——具体来说,需要至少N个样本(N=40)的输入,滤波器的抽头才能被完全“填充”,之后的输出才会趋近于幅频响应在0Hz处的幅值。用户只观察了前300个输出,但前40个样本属于暂态响应,幅值自然很小,容易造成“输出极小”的误判。 - 可视化范围的误导:用
stem同时绘制输入和输出时,暂态部分的小幅值会掩盖后续的稳态输出,导致整体看起来输出异常。
验证与解决方法
可以通过以下方式验证稳态输出:
reset(fir); % 重置滤波器初始状态 sents = ones(1, 1000); % 输入更长的序列 rcvds = fir(sents); figure(2) stem(rcvds(50:end)); % 跳过前50个暂态样本,查看稳态部分 title('滤波器稳态输出');
此时就能看到输出趋近于DC增益对应的数值,符合幅频响应的设计结果。
内容的提问来源于stack exchange,提问作者Kera
相关产品推荐
相关产品推荐

