2013-07-04 3 views
1

J'effectue FFT-IFFT afin de retirer 50 Hz et ses harmoniques de mon signal, en utilisant Matlab. Pour ce faire, je divise mon signal en fenêtres de 1024 échantillons et j'effectue une FFT. Je fais également un chevauchement de 50%. Une fois la FFT terminée, je retire ces harmoniques et je fais IFFT pour obtenir des données filtrées. Ma question est: Comment résumer toutes ces fenêtres avec des chevauchements pour obtenir un signal?FFT-IFFT. Comment résumer le signal final après IFFT?

mon code est ci-dessous. Comme vous pouvez le voir, j'effectue FFT-IFFT sur chaque fenêtre et je ne sais pas comment reconstituer toutes les fenêtres.

[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); 

vous remerciant par avance, Elen Che

Répondre

1

Si tout ce que vous faites est le filtrage, alors vous ne devriez pas créer des fenêtres d'entrée qui se chevauchent.

Une fois que vous avez corrigé cela, une méthode courante à reconstruire est overlap-and-add.

+0

ok, je m'attendais à ce que ... Dois-je supprimer DC? –

+0

@ElenChe: C'est à vous de;) –

2

Filtrage dans le domaine fréquentiel est au mieux délicat et dangereux au pire. Une meilleure méthode consiste à utiliser un filtre de domaine temporel. J'ai roughly outlined the reasons here.

Si vous essayez d'éliminer les bourdonnements d'alimentation secteur de 50 Hz de l'audio, une meilleure approche consiste à utiliser un filtre coupe-bande. Essayez un deuxième filtre à bande de Chebyshev, qui, je crois, peut être facilement conçu en MATLAB. Vous pouvez également essayer un filtre à bande Butterworth de 3ème ou 4ème ordre. (Ces ordres et types sont juste au dessus de ma tête basé sur une certaine expérience). Vous utiliserez une bande pour chaque harmonique et vous pourrez utiliser Matlab functions that apply the filter non-causally, cela n'affectera donc pas la phase de vos données.

+0

Je ne voulais pas plonger dans les filtres, mais il semble que je dois faire cela, surtout après avoir essayé FFT-IFFT et ne pas gérer. donc, avec les filtres, juste pour m'assurer que je le comprends correctement. Si je veux filtrer 50 Hz, ma bande d'arrêt peut commencer à 48 Hz et la bande passante à 52 Hz. Est-ce que ça fonctionne comme ça? et dans l'aide de Matlab il est écrit que j'ai besoin de coefficioents. Pourriez-vous s'il vous plaît être si gentil de me signaler une source où je peux lire à ce sujet. Merci à tous! –

+0

Matlab a des fonctions intégrées pour concevoir de nombreux filtres. Par exemple, vous pouvez utiliser la fonction cheby2 pour créer un filtre de type 2 à bande interdite Chebyshev: http://www.mathworks.com/help/signal/ref/cheby2.html –

+0

Merci! J'espère que je vais gérer avec ça! –

Questions connexes