2011-10-19 27 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)

換句話說,你可以繞過頻域時移並仍然得到正確的濾波器,但它不會是因果關係。它將以對稱爲中心,並以原點爲中心。