傅立叶时移在Matlab fir2()函数中有什么作用?

时间:2011-10-19 10:26:33

标签: matlab signal-processing fft

我在从Matlab信号处理工具箱fir2()函数中理解一些代码片段时遇到了问题:

% My comment: at this point vector H contains nn+1 (nn is an even number) points (double numbers) of amplitudes for a dense frequency grid


% Fourier time-shift.
dt = 0.5 .* (nn - 1);
rad = -dt .* sqrt(-1) .* pi .* (0:npt-1) ./ (npt-1);
H = H .* exp(rad);
%My comment: now H contains nn+1 complex numbers 


%My comment: creates a horizontal mirror with 2*nn points    
Hconj = [H conj(H(npt-1:-1:2))];   % Fourier transform of real series.
ht = real(ifft(Hconj));            % Symmetric real series.

%My comment: throws away the half after ht[nn]
b = ht(1:nn);         % Raw numerator.
wind = hamming(nn);
b = b .* wind(:).';   % Apply window.

令我困惑的是: - 如果我注释掉傅立叶时移,ifft的结果是围绕ht [nn]对称的 - 如果我保留傅里叶时移代码完整,ifft的结果不再围绕ht [nn]对称,但它有两个对称的组围绕ht [nn / 2]和ht [3 * nn / 4],而两个部分围绕ht [nn]在情节中看起来真的不同。但是ht [nn]之后的所有内容都被丢弃了,所以如果我需要最终输出是对称的,我必须离开傅里叶时移。

为什么需要傅立叶时移?我可以用我的C ++应用程序中的一些更简单的算法替换它,它不使用复数并且仍然在ht [nn / 2]周围找到对称点,所以我可以扔掉ht [nn]之后的所有内容吗?

P.S。我只是看了有和没有傅里叶时移的情节,并注意到我可以通过将第二个结果nn / 2向右移动得到相同的结果。所以从理论上讲,我可以避免在我的C ++应用程序中使用傅里叶时移,只需将ifft的实际结果向右移动nn / 2,然后在nn之后丢弃所有内容。我对吗?这样做安全吗?

1 个答案:

答案 0 :(得分:3)

根据this paper,因果滤波器设计需要时移。引用,

  

如果为每个<Hd(F)指定零相移,那么   结果h(n)将以原点为中心。因此最低限度   需要g = (M-1)/2个样本的延迟才能使过滤器产生因果关系。通过   DTFT的时移属性,这对应于   将|Hd(F)|乘以exp(-j*g*2*pi*F)

换句话说,你可以绕过频域时移并仍然得到正确的过滤器,但它根本不会是因果关系。它将具有对称性,并以原点为中心。