2011-10-19 25 views
2

我有一个问题的理解从MATLAB信号中的一些代码片段处理工具箱FIR2()函数:傅立叶时移在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的结果是对称的如果我离开傅里叶时移码完好无损,ifft的结果在ht [nn]周围不再是对称的,但它在ht [nn/2]和ht [3 * nn/4]周围有两个对称的组。 ],而ht [nn]周围的两个部分在情节中看起来真的不同。但是ht [nn]之后的所有内容都会被丢弃,所以如果我需要最终的输出是对称的,那么我必须离开傅立叶时间偏移。

为什么傅立叶时间偏移需要?我可以在我的C++应用程序中用一些更简单的算法替换它,它不使用复数,并且仍然在ht [nn/2]周围出现nn个对称点,所以我可以在ht [nn]之后丢弃所有的东西?

P.S.我只看过有无傅里叶时间转换的情节,并注意到我可以通过将第二个结果nn/2移到右边来获得相同的结果。因此,理论上我可以避免在我的C++应用程序中使用傅里叶时间偏移,但只需将nn/2的实际结果向右移动,然后在nn后丢弃所有内容。我对吗?是否安全?

回答

3

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

如果每个<Hd(F)则 所得h(n)将在原点为中心指定了零相移。因此,需要最少 延迟的g = (M-1)/2样本才能使滤波器成为因果关系。通过 DTFT的时移特性,这对应于|Hd(F)|的 乘以exp(-j*g*2*pi*F)

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