使用Kaiser窗设计FIR低通滤波器出现频率响应全NaN问题求助
Kaiser窗FIR低通滤波器频率响应NaN问题解决
核心问题排查点
- 阶数与Beta参数计算错误:若阻带衰减或过渡带宽的单位/公式出错,会生成异常的窗函数或滤波器系数,直接导致NaN。
- 理想冲激响应的0/0未处理:理想低通的冲激响应在中心采样点会出现$\sin(0)/0$的情况,必须手动替换为极限值$\omega_c/\pi$,否则直接产生NaN。
- freqz参数误用:FIR滤波器的传递函数分母为1,若freqz输入参数不规范(比如漏写分母),可能引发计算异常。
修正后的可运行代码
% 给定设计参数 wp = 0.4*pi; ws = 0.6*pi; delta1 = 0.01; delta2 = 0.001; % 计算阻带衰减与过渡带宽 A = -20*log10(delta2); delta_w = ws - wp; % 计算Kaiser窗的阶数N和beta参数 N = ceil((A - 7.95)/(2.285*delta_w)); beta = 0.5842*(A-21)^0.4 + 0.07886*(A-21); alpha = N/2; % 生成理想低通冲激响应(处理0/0情况) n = 0:N; h_ideal = zeros(1, length(n)); wc = (wp + ws)/2; % 取通阻带中点为截止频率 for idx = 1:length(n) k = n(idx) - alpha; if k == 0 h_ideal(idx) = wc/pi; else h_ideal(idx) = sin(wc*k)/(pi*k); end end % 施加Kaiser窗得到FIR系数 window = kaiser(N+1, beta); h = h_ideal .* window; % 计算并验证频率响应 [H, w] = freqz(h, 1, 1024); if any(isnan(H)) error('仍存在NaN,请检查参数计算'); else disp('频率响应计算正常'); % 绘制幅频特性 figure; plot(w/pi, 20*log10(abs(H))); xlabel('归一化频率 (\times\pi rad/sample)'); ylabel('幅度 (dB)'); title('Kaiser窗FIR低通滤波器幅频响应'); grid on; end
关键修正说明
- 强制处理了理想冲激响应的中心采样点,避免0/0导致的NaN
- 严格按照Kaiser窗的标准公式计算阶数和beta参数,确保窗函数生成正常
- freqz明确指定分母为1(FIR滤波器特性),并指定1024点FFT计算,避免默认参数的潜在问题
内容的提问来源于stack exchange,提问作者Shepard Merose
相关产品推荐
相关产品推荐

