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

如何基于两个脉冲响应的差异创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:57:02