2013-07-04 99 views
1

我使用Matlab執行FFT-IFFT以從我的信號中取出50 Hz及其諧波。 爲此,我將信號分解成1024個樣本的窗口,並對其執行FFT。我也做了50%的重疊。 FFT完成後,我取出這些諧波,並進行IFFT以獲得濾波數據。 我的問題是: 如何總結所有與重疊的窗口來獲取信號?FFT-IFFT。如何總結IFFT後的最終信號?

我的代碼如下。正如你所看到的,我在每個窗口上執行FFT-IFFT,並且不知道如何將所有窗口重新組合在一起。

[y, Fs, nbits] = wavread([fileName]);     %read the data 
[noSamples, noChannels] = size(y); 
N = 1024;             %window length 2^10 
winLength=N; 
Fres = Fs/N;            % resolution frequency 
nofWins = floor(noSamples/winLength);      % No of full windows 
noWins = round((100/50)*nofWins - 1);      % rounded no of windows 
yPaddedLength = floor(noWins*0.5*winLength + winLength); % padding wth 0 
yZeroPadded =[y zeros(1, (yPaddedLength - noSamples))]; % padded signal y 
nofWinsPadded = round(yPaddedLength/winLength); 
noWinsPadded = round((100/50)*nofWinsPadded - 1);   % no of padded windows 

odd = true; 
for k = 1:(noWinsPadded-1) 
    j = floor(0.5*k); 
    at = j*winLength + 1; 
    overlapWinLength=floor(0.5*winLength); 
    range = at:(at + winLength - 1); 

if odd 
    data = yZeroPadded(range, 1); 
    data_sum=sum(data);         % from now on - to perform 
                  % DC removal 
    data_average=data_sum/N; 
    data=data-data_average; 

else 
    data = yZeroPadded(range+overlapWinLength, 1); 
    data_sum=sum(data); 
    data_average=data_sum/N; 
    data=data-data_average; 
end; 

odd=~odd; 
    spectrum = fft(data); 
    F=length(spectrum); 
    F=spectrum; 
    F(10:11)=zeros;       % FFT No equals to zero removes harmonics 
    F(17:18)=zeros       % and so on 
filtered_signal=IFFT(F); 

感謝你在期待, 埃倫車

回答

1

如果你正在做的是過濾,那麼你不應該創建重疊的輸入窗口。

修復該問題後,重構的常用方法是overlap-and-add

+0

好吧,我預計... ...我應該刪除DC嗎? –

+0

@ElenChe:這取決於你;) –

2

頻域過濾最多是棘手的,最壞的情況是危險的。更好的方法是使用時域濾波器。我有roughly outlined the reasons here

如果您試圖從音頻中消除50Hz線路功率嗡嗡聲,更好的方法是使用陷波濾波器。嘗試使用二階Chebyshev帶阻濾波器,我相信它可以在MATLAB中輕鬆設計。你也可以嘗試一個3階或4階巴特沃斯帶阻濾波器。 (根據一些經驗,這些訂單和類型剛剛脫離我的頭頂)。您將爲每個諧波使用一個頻段,並且您可以使用Matlab functions that apply the filter non-causally,因此它不會影響數據的相位。

+0

我不想潛入過濾器,但似乎我需要這樣做,特別是在我嘗試FFT-IFFT並且沒有管理之後。所以,使用過濾器,只是爲了確保我正確理解它。如果我想過濾掉50 Hz,我的阻帶可以從48 Hz開始,通帶爲52 Hz。它是這樣工作嗎?並在Matlab幫助寫它我需要coefficioents。你能不能請我指出一個我可以閱讀這些信息的來源。謝謝你們! –

+0

Matlab內置有用於設計許多濾波器的函數。例如,您可以使用cheby2函數來設計切比雪夫帶阻2型濾波器:http://www.mathworks.com/help/signal/ref/cheby2.html –

+0

謝謝!希望我會用它來管理! –