【问题标题】:What does Fourier time-shift do in Matlab fir2() function?傅里叶时移在 Matlab fir2() 函数中做了什么?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多