簡體   English   中英

MATLAB:使用帶有IIR濾波器的FFT / IFFT在頻域中進行濾波

[英]MATLAB: filter in the frequency domain using FFT/IFFT with an IIR filter

我正在嘗試使用FFT和逆FFT(IFFT)在Matlab中過濾(真實)信號。 我有一個IIR濾波器(系數“ b”和“ a”)。 我期望(大約嗎?)的結果與我剛才做的事情一樣:

filteredSignal = filter(b,a,signal);

這就是我所做的:

NFFT = length(signal);
FFTsignal = fft(signal, NFFT);
FilterFreqResponse = freqz(b,a,NFFT);
FFTfilteredSignal = FFTsignal .* FilterFreqResponse;
filteredSignal = ifft(FFTfilteredSignal, NFFT);

這里的問題是結果信號( filteredSignal )很復雜。 我想要一個真實的信號(作為我的輸入信號)。 filter功能還返回真實信號。 所以...我在做什么錯? 是否可以將基於FFT的濾波與IIR濾波器一起使用? 我的意思是:我的濾波器的頻率響應相對於原點不是對稱的,所以我的濾波信號的頻譜也不是對稱的……所以時域中的濾波信號不能是真實的……?

PS:ifft函數中有一個“對稱”選項:

filteredSignal = ifft(FFTfilteredSignal, NFFT, 'symmetric');

如果執行此操作,則filteredSignal現在是真實的...但是與我直接使用“ filter”功能獲得的信號明顯不同(在幅度和相位上)。 而且這個“對稱”選項顯然會丟棄虛部,或者類似的東西,所以我猜想使用它可能不是一個好主意。

在此先多謝! (對不起,我的英語)

僅使用結果的真實部分是不正確的,

您的答案很復雜的原因是沒有對稱地執行逐點乘法:即,要使答案有意義,矢量FilterResponse必須相對於其中心元素對稱。 您應該只將濾波器響應建立到Fs / 2(即較小的矢量),然后編寫一些邏輯以共軛對稱地將其應用於鏡像頻率。 或者,Matlab可以通過以下FilterFreqResponse = freqz(b,a,NFFT,'whole')自動為您完成此操作: FilterFreqResponse = freqz(b,a,NFFT,'whole')

只有那時,“對稱”選項才應與ifft一起使用,因為它的目的是防止在您創建的對稱之間可能存在小的數值誤差。

使用逆FFT的實部:

filteredSignal = real(ifft(FFTfilteredSignal, NFFT));

您的FilterFreqResponse在被評估NFFT僅圍繞單位圓的上半部分等間隔點。 您是否嘗試過FilterFreqResponse = freqz(b,a,NFFT,'whole')

頻域中的乘法是時域中的循環卷積。 要消除圓形卷積偽像,您需要在FFT之前將信號以濾波器響應的長度為零進行填充,鏡像頻率響應濾波器,以使其在復數之前是復共軛對稱的(也許使兩個矢量的長度為2N情況),則在IFFT之后,丟棄添加的填充,或保留該填充以進行其他重疊添加/保存處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM