【发布时间】:2011-10-19 10:26:33
【问题描述】:
我在理解 Matlab Signal processing Toolbox 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] 对称的 nn 个点,以便我可以在 ht[nn] 之后丢弃所有内容?
附:我只是查看了有和没有傅立叶时移的图,并注意到我可以通过将第二个结果 nn/2 向右移动来获得相同的结果。所以理论上我可以避免在我的 C++ 应用程序中使用傅立叶时移,但只需将 ifft 的实际结果向右移动 nn/2,然后在 nn 之后丢弃所有内容。我对吗?这样做安全吗?
【问题讨论】:
标签: matlab signal-processing fft