我在从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之后丢弃所有内容。我对吗?这样做安全吗?
答案 0 :(得分:3)
根据this paper,因果滤波器设计需要时移。引用,
如果为每个
<Hd(F)
指定零相移,那么 结果h(n)
将以原点为中心。因此最低限度 需要g = (M-1)/2
个样本的延迟才能使过滤器产生因果关系。通过 DTFT的时移属性,这对应于 将|Hd(F)|
乘以exp(-j*g*2*pi*F)
。
换句话说,你可以绕过频域时移并仍然得到正确的过滤器,但它根本不会是因果关系。它将具有对称性,并以原点为中心。