You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matlab中Kaiser窗FIR滤波器归一化角频率转Hz后截止频率异常问询

解决Matlab Kaiser窗FIR滤波器截止频率与实际响应不匹配的问题

我刚碰到好几个类似的问题,你这个情况一看就是归一化频率和物理频率的映射环节出了疏漏——明明用kaiserord()算出的归一化截止频率wn=0.34对应预期的42.5Hz,但绘图时-3dB点跑到100Hz以上,大概率是转换公式错了,或者设计与绘图时的采样频率没对齐,我给你一步步拆解:

先搞懂Matlab里的频率映射规则

Matlab中FIR滤波器设计用的归一化频率wn,是把Nyquist频率(也就是采样频率的一半,Fs/2)映射为1。所以正确的转换关系是:

实际截止频率(Hz) = wn * (Fs/2)

反过来,如果你已知想要的物理截止频率f_c,归一化频率应该是:

wn = f_c / (Fs/2)

从你的数据反推,0.34*(Fs/2)=42.5,那你的采样频率Fs应该是250Hz,这个先记下来,后面要全程保持一致。

问题的核心原因

你看到-3dB点偏移,大概率是这两个坑之一:

  1. 绘图时横轴转换错误:用freqz()默认输出的是归一化角频率(范围0到π),如果直接乘以Fs而不是Fs/(2π),就会把频率放大一倍甚至更多;
  2. 设计与绘图的采样频率不一致:比如设计时用的Fs=250Hz,但绘图时误设成了其他值,导致横轴刻度完全错了。

具体解决步骤

1. 确保滤波器设计时的频率参数正确

kaiserord()时,通带/阻带的频率参数必须是归一化到π的值,比如你要42.5Hz的截止频率(Fs=250Hz),那:

Fs = 250;
f_c = 42.5;
wn = f_c / (Fs/2); % 得到0.34,和你之前的结果一致
% 然后用wn去调用kaiserord和fir1
[N, Wn, beta, ftype] = kaiserord([...], [...], [...], [...]); % 填你的通阻带参数
b = fir1(N, Wn, ftype, kaiser(N+1, beta));

2. 正确绘制带Hz横轴的幅度响应

别再手动瞎转换了,直接用freqz()的参数指定采样频率,或者按正确公式转换:

方法一:让freqz直接输出Hz刻度
freqz(b, 1, 1024, Fs); % 1024是点数,Fs=250
grid on;

这样出来的图横轴直接就是Hz,不用再手动计算。

方法二:手动转换横轴(适合自定义绘图)
[h, w] = freqz(b, 1, 1024);
f = w/(2*pi)*Fs; % 关键!把归一化角频率w转成物理频率
mag_db = 20*log10(abs(h)/max(abs(h)));

plot(f, mag_db);
xlabel('频率 (Hz)');
ylabel('幅度 (dB)');
grid on;
ylim([-60 5]); % 可选,方便看-3dB点

3. 验证实际的-3dB截止频率

可以加一段代码自动找到-3dB点,确认是否符合预期:

idx = find(mag_db <= -3, 1, 'first');
f_3db = f(idx);
fprintf('实际-3dB截止频率:%.2f Hz\n', f_3db);

正常情况下这个值应该接近42.5Hz,误差是Kaiser窗设计的正常波动。

最后总结

你现在的问题就是频率转换时的公式错误,或者采样频率没统一。只要把这两点修正,-3dB点就会回到你预期的42.5Hz位置了。

内容的提问来源于stack exchange,提问作者AAA

火山引擎 最新活动