为什么在计算滤波器系统的脉冲响应时我会在最后得到一个“尾巴”

问题描述

我测量了系统输入(粉红噪声)和输出的时间信号。我需要计算系统的 TF 及其脉冲响应。

为了计算 TF,我可以在 Matlab 中直接执行 TF = tfestimate(in,out) 或计算 fft后执行 TF = fft(out)./fft(in)在这一点上,一切都对我来说是清楚的和预期的,但是当我通过执行 ifft(fft(out)./fft(in)) 计算系统的脉冲响应时,我得到最后有尾部的脉冲响应。我在想我的测量可能有问题,并决定在 matlab 中重复实验,合成指数啁啾并将其通过具有以下脉冲响应计算的滤波器。然后我在最后得到了“相同”的故事: Impulse response with a "tail" at the end

请看下面的代码

t = 0:1/48000:10;
fo = 1;
f1 = 24000;
x = chirp(t,fo,10,f1,'logarithmic');
x = x(:);
y = lowpass(x,1000,48000);
y = y(:);

% playing with FFT length here
% nfft=length(x)*2-1;
% nfft = 4*1024;
nfft=length(x);

tf = tfestimate(x,y,hann(nfft),nfft/2,nfft,48000); 
if mod(length(tf),2)==0 % iseven
    tf_sym = conj(tf(end:-1:2));
else
    tf_sym = conj(tf(end-1:-1:2));
end

ir_from_tfestimate = ifft([tf; tf_sym]);

in = fft(x,nfft);
out = fft(y,nfft);
tf1 = out./in;
ir_from_fft = ifft(tf1);

figure
stem(ir_from_tfestimate)
hold on
stem(ir_from_fft)
set(gca,'XScale','log')
  1. 所以我想知道这个故事的本质是什么?也许有一个 我的代码有误?我在谷歌上搜索这个问题/解释,但没有找到任何东西

  2. 这与我如何定义 nfft 以及点数的正确选择有关吗? 我们能说如果nfft定义不正确,脉冲响应就不会正确吗?

  3. 当我尝试恢复从 tfestimate 获得的频谱的对称部分时,我是否正确执行:?

if mod(length(tf),2)==0 % iseven
tf_sym = conj(tf(end:-1:2));
else; tf_sym = conj(tf(end-1:-1:2));end

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)