2013-07-04 4 views
1

Я выполняю FFT-IFFT, чтобы вывести 50 Гц и его гармоники из моего сигнала, используя Matlab. Для этого я разбиваю свой сигнал на окна с 1024 образцами и выполняю БПФ на нем. Я тоже перекрываю 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); 

Поблагодарив вас в ожидании, Elen Че

ответ

1

Если все, что вы делаете фильтрацию, то вы не должны быть создания перекрывающихся входных окон.

Как только вы исправили это, тогда общий метод восстановления - overlap-and-add.

+0

ОК, я ожидал, что ... Удалите DC? –

+0

@ElenChe: Это зависит от вас;) –

2

Фильтрация в частотной области в лучшем случае сложна и опасна в худшем случае. Лучший способ - использовать фильтр во временной области. У меня есть roughly outlined the reasons here.

Если вы пытаетесь устранить шум мощности на частоте 50 Гц от звука, лучше использовать фильтр с надрезом. Попробуйте фильтр Chebyshev band-stop второго порядка, который, как я считаю, может быть легко разработан в MATLAB. Вы также можете попробовать фильтр полос остановки Баттерворта 3-го или 4-го порядка. (эти заказы и типы находятся совсем близко от моей головы, основываясь на некотором опыте). Вы будете использовать одну полосу для каждой гармоники, и вы можете использовать Matlab functions that apply the filter non-causally, так что это не повлияет на фазу ваших данных.

+0

Я не хотел погружаться в фильтры, но, похоже, мне нужно это сделать, особенно после того, как я попробовал FFT-IFFT и не справился. поэтому, с фильтрами, просто чтобы убедиться, что я правильно понимаю. Если я хочу отфильтровать 50 Гц, моя полоса пропускания может начинаться с 48 Гц, а полоса пропускания - 52 Гц. Так ли это работает? и в Matlab помочь написано, мне нужны коэффициенты. Не могли бы вы быть настолько добрыми, чтобы указать мне источник, где я могу прочитать об этом. Спасибо вам всем! –

+0

Matlab имеет встроенные функции для проектирования многих фильтров. Например, вы можете использовать функцию cheby2 для создания фильтра Chebyshev band-stop type 2: http://www.mathworks.com/help/signal/ref/cheby2.html –

+0

Спасибо! Надеюсь, я с этим справимся! –

Смежные вопросы