You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:15:16