如何基于两个脉冲响应的差异创建FIR滤波器?
问题描述
我正尝试基于两个脉冲响应(IR)的幅度差对应的传递函数,创建FIR滤波器及相关波形。已录制两个IR,但始终无法得到正确的校正系数:
- 最初采用减法运算得到的结果明显错误,幅度衰减异常
- 按建议改为除法后,频域结果符合目标曲线,但校正曲线的时域FIR波形出现异常(时域波形表现为非因果、拖尾严重的形态)
代码实现
% 定义采样频率 close all [x1,fs] = audioread('711_Tap1024.wav'); [x2,fs] = audioread('5128_Tap1024.wav'); Nfft = length(x1); % 频率向量(假设频率已归一化,或需按fs/2归一化) f = linspace(0, fs, Nfft); f = f'; % 定义目标曲线 x1FR = 20*log10(abs(fft(x1,Nfft))); x2FR = 20*log10(abs(fft(x2,Nfft))); targetCurve = x1FR-x2FR; targetCurve = targetCurve*-1; % 定义或导入频率响应H1和H2 % H1 = abs(fft(x1,Nfft)); % H2 = abs(fft(x2,Nfft)); H1 = fft(x1,Nfft); H2 = fft(x2,Nfft); % 计算频率响应的商(替代减法) %H_diff = H1-H2; H_diff = H2./H1; % 逆FFT得到脉冲响应 y = real(ifft(H_diff,Nfft)); % 归一化脉冲响应 y = 0.99*y/max(abs(y)); % 将脉冲响应保存为WAV文件 audiowrite('impulse_response_diff.wav', y, fs); % 绘制脉冲响应(可选) figure; plot(y) % 绘制校正曲线的频域结果 y_new=abs(fft(y,Nfft)); y_new= 20*log10(y_new); figure plot(f(1:Nfft/2), x1FR(1:Nfft/2)); hold on plot(f(1:Nfft/2), x2FR(1:Nfft/2)); hold on plot(f(1:Nfft/2), targetCurve(1:Nfft/2)); hold on plot(f(1:Nfft/2), y_new(1:Nfft/2)); xlim([20 20000]) xticks([100 1000 10000]) grid on set(gca, 'XScale', 'log') xlabel ('频率 (Hz)'); ylabel ('幅度'); legend('H1', 'H2', '目标曲线','校正曲线')
内容的提问来源于stack exchange,提问作者lordinfamous
相关产品推荐
相关产品推荐

