gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:10:40 25 4
gpt4 key购买 nike

我在理解 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] 周围以对称性得到 nn 个点,以便我可以在 ht[nn] 之后扔掉所有东西?

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

最佳答案

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

If a zero phase shift was specified for each <Hd(F) then the resulting h(n) would be centered at the origin. Hence a minimum delay of g = (M-1)/2 samples is needed to make the filter causal. By the time-shift property of the DTFT, this corresponds to multiplication of |Hd(F)| by exp(-j*g*2*pi*F).



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

关于matlab - 傅立叶时移在 Matlab fir2() 函数中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7819864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com