Matlab filtre Passe-Bas à l'aide de la fft
J'ai mis en place un simple filtre passe-bas dans matlab à l'aide d'un en avant et en arrière de la fft.
Il fonctionne sur le principe, mais le minimum et le maximum des valeurs de différer de l'original.
signal = data;
%% fourier spectrum
% number of elements in fft
NFFT = 1024;
% fft of data
Y = fft(signal,NFFT)/L;
% plot(freq_spectrum)
%% apply filter
fullw = zeros(1, numel(Y));
fullw( 1 : 20 ) = 1;
filteredData = Y.*fullw;
%% invers fft
iY = ifft(filteredData,NFFT);
% amplitude is in abs part
fY = abs(iY);
% use only the length of the original data
fY = fY(1:numel(signal));
filteredSignal = fY * NFFT; % correct maximum
clf; hold on;
plot(signal, 'g-')
plot(filteredSignal ,'b-')
hold off;
l'image qui en résulte ressemble à ceci
Ce que je fais mal? Si je normaliser à la fois les données du signal filtré semble correct.
votre filtre doit être symétrique que le signal est. pourquoi attendez-vous min et max à ne pas changer? il n'y a aucune raison de le faire.
Notez que d'essayer d'appliquer un "mur de briques" filtre comme ceci dans le domaine de fréquence produira méchant artefacts - vous besoin d'utiliser une fonction lisse dans le domaine des fréquences (typiquement une fonction de fenêtre). Notez également que votre filtre de gain n'est pas normalisée, et comme @thang notes, votre filtre doit être symétrique, sinon vous obtiendrez complexe domaine de temps de sortie de données.
Notez que d'essayer d'appliquer un "mur de briques" filtre comme ceci dans le domaine de fréquence produira méchant artefacts - vous besoin d'utiliser une fonction lisse dans le domaine des fréquences (typiquement une fonction de fenêtre). Notez également que votre filtre de gain n'est pas normalisée, et comme @thang notes, votre filtre doit être symétrique, sinon vous obtiendrez complexe domaine de temps de sortie de données.
OriginalL'auteur Matthias Pospiech | 2015-03-02
Vous devez vous connecter pour publier un commentaire.
Juste de nous rappeler comment MATLAB magasins de la fréquence de contenu pour
Y = fft(y,N)
:Y(1)
est le décalage constantY(2:N/2 + 1)
est l'ensemble des fréquences positivesY(N/2 + 2:end)
est l'ensemble des fréquences négatives... (normalement, nous affichons cette gauche de l'axe vertical)Afin de faire un vrai filtre passe-bas, nous devons préserver à la fois le positif faible fréquences et la faible négatif fréquences.
Voici un exemple de le faire avec un multiplicative rectangle filtre dans le domaine fréquentiel, comme vous l'avez fait:
Le plein passe-bas fitler fait un meilleur travail, mais vous remarquerez que la reconstruction est un peu "ondulé". C'est parce que la multiplication par un rectangle en fonction de la fréquence de domaine est le même que pour un produit de convolution avec une fonction sinc dans le domaine temporel. Produit de Convolution avec une sinc fucntion remplace chaque point avec un très inégale de la moyenne pondérée de ses voisins, d'où le "vague" d'effet.
Un filtre gaussien a plus agréable passe-bas filtre de propriétés, car la transformée de fourier d'une gaussienne est une gaussienne. Une gaussienne se désintègre à zéro joliment afin de ne pas inclure de loin les voisins de la moyenne pondérée des cours de convolution. Voici un exemple avec un filtre gaussien de préserver la positif et négatif de fréquences:
Comme vous pouvez le voir, la reconstruction est beaucoup mieux de cette façon.
OriginalL'auteur eigenchris