Pourquoi est-ce une mauvaise idée de filtrer en mettant à zéro les bacs FFT?

72

Il est très facile de filtrer un signal en effectuant une FFT, en mettant à zéro certains des bacs, puis en effectuant une IFFT. Par exemple:

t = linspace(0, 1, 256, endpoint=False)
x = sin(2 * pi * 3 * t) + cos(2 * pi * 100 * t)
X = fft(x)
X[64:192] = 0
y = ifft(X)

La composante haute fréquence est complètement supprimée par ce filtre FFT "brickwall".

Mais j'ai entendu dire que ce n'est pas une bonne méthode à utiliser.

  • Pourquoi est-ce généralement une mauvaise idée?
  • Y a-t-il des circonstances dans lesquelles c'est un bon ou bon choix?

[ comme suggéré par les pichenettes ]

endolithe
la source

Réponses:

74

La remise à zéro des cases dans le domaine fréquentiel équivaut à la multiplier par une fenêtre rectangulaire dans le domaine fréquentiel. Multiplier par une fenêtre dans le domaine fréquentiel équivaut à une convolution circulaire par la transformation de cette fenêtre dans le domaine temporel. La transformation d'une fenêtre rectangulaire est la fonction Sinc ( ). Notez que la fonction Sinc comporte de nombreuses grandes ondulations et étendues qui s’étendent sur toute la largeur de l’ouverture du domaine temporel. Si un filtre de domaine temporel pouvant générer toutes ces ondulations (sonneries) est une "mauvaise idée", il en va de même pour la remise à zéro des bacs.sin(ωt)/ωt

Ces ondulations seront les plus grandes pour tout contenu spectral "compris entre les intervalles" ou non périodique entier dans la largeur d'ouverture de la FFT. Ainsi, si vos données d'entrée FFT d'origine constituent une fenêtre sur des données quelque peu non périodiques dans cette fenêtre (par exemple, la plupart des signaux du "monde réel" échantillonnés de manière non synchrone), ces artefacts particuliers seront alors produits par la mise à zéro des tranches.

Une autre façon de voir les choses est que chaque résultat FFT représente une certaine fréquence d'onde sinusoïdale dans le domaine temporel. Ainsi, la remise à zéro d’une case produira le même résultat que la soustraction de cette onde sinusoïdale ou, de manière équivalente, l’ajout d’une onde sinusoïdale d’une fréquence centrale de la case FFT exacte mais avec la phase opposée. Notez que si la fréquence d’un contenu dans le domaine temporel n’est pas purement un entier périodique dans la largeur de la FFT, essayer de l’annuler en ajoutant l’inverse d’une onde sinusoïdale périodique d’entiers exactement entiers produira non pas du silence, mais plutôt quelque chose qui ressemble davantage à une note "beat" (onde sinusoïdale modulée par AM d'une fréquence différente). Encore une fois, probablement pas ce qui est voulu.

Inversement, si votre signal de domaine temporel d'origine est constitué de quelques sinusoïdes pures non modulées qui sont exactement entières périodiques dans la largeur d'ouverture de la FFT, la remise à zéro des corbeilles FFT supprimera celles désignées sans artefacts.

hotpaw2
la source
3
Cette réponse contient de bonnes choses, mais je préférerais mettre davantage l'accent sur l'effet Gibbs.
Jim Clay
4
Une tentative pour obtenir une réponse à l'effet Gibbs a déjà été demandée ici: dsp.stackexchange.com/questions/1144/…
hotpaw2
@ hotpaw2 C'est une bonne explication. Cependant, j'ai besoin d'une référence à cela et j'ai du mal à en identifier un. C'est la raison pour laquelle nous filtrons le domaine temporel plutôt que de travailler dans le domaine fréquentiel. (En outre, le domaine temporel peut être en temps réel.) Cependant, personne ne semble commencer par le dire!
Hugh
Comment cela peut-il être lié à la méthode de fenêtre pour la conception de filtres?
Filipe Pinto
Comparez la transformation d'une fenêtre de Von Hann (et autres) avec celle d'une fenêtre rectangulaire. Réponse de filtre bien meilleure en général, en particulier entre les cases FFT de la bande d'arrêt. En général, la réduction à zéro brusque des bacs est pire que la non-réduction à zéro à proximité des transitions.
hotpaw2
3

Cette question m'a également dérouté pendant longtemps. L'explication de @ hotpaw2 est bonne. Vous pouvez être intéressé par l'expérience simple utilisant matlab.

https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html


informations mises à jour.

Pour vérifier que ce fait est simple, il suffit d'observer avec prudence le spectre de réponse impulsionnelle d'un filtre passe-bande idéal (?) Qui met à zéro les bacs FFT. Pourquoi dois-je ajouter l'adverbe "avec précaution"? Si nous utilisons simplement la même taille de la FFT pour observer la réponse de l'impulsion, nous serons trompés comme le montre la figure 1 . Néanmoins, si nous ajoutons l'ordre de DFT lors de l'observation de la sortie du filtre, c'est-à-dire que nous complétons à zéro la réponse impulsionnelle, nous pouvons trouver ce que l'on appelle le phénomène de Gibbs, des ondulations dans le domaine fréquentiel, comme illustré à la Fig . 2 .

Les résultats proviennent en fait de l'effet de fenêtrage. Si vous voulez bien comprendre le problème, veuillez vous reporter au chapitre 7.6 et au chapitre 10.1 à 10.2 de la bible de DSP (1). En résumé, trois points essentiels sont notés ici.

  1. La taille de la fenêtre et l'ordre de DFT (FFT) sont totalement indépendants. Ne les mélangez pas ensemble.
  2. Les propriétés de la fenêtre (type / taille) dominent la forme de DTFT. (Par exemple, le lobe principal plus large conduit à une bande passante plus large en réponse en fréquence.)
  3. DFT est juste l'échantillonnage de DTFT dans le domaine fréquentiel. De plus, plus l'ordre de la TFD est élevé, plus son spectre est dense.

Ainsi, à l'aide du spectre plus dense de la figure 2 , nous pouvons voir à travers le masque du filtre passe-bande idéal (faux).

entrez la description de l'image iciFaussement Freq. Réponse.

entrez la description de l'image iciPhénomène Gibbs en Freq. Réponse.

(1) Alan V. Oppenheim et Ronald W. Schafer. 2009. Discrete-Time Signal Processing (3 e éd.). Prentice Hall Press, rivière Upper Saddle, NJ, États-Unis.

fps = 15;

LPF = 1;
HPF = 2;

n = -511:512;
n0 = 0;
imp = (n==n0);

NyquistF = 1/2*fps;

%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);  
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];

% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];

N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');


N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');

%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)

    N = length(input_signal);
    n = 0:1:N-1;
    freq = ( n .* fs) ./ N;

    filered_signal = zeros(N, 1);

    for i = 1:N
        if freq(i) > w1 & freq(i) < w2
            filered_signal(i) = input_signal(i);
        end

    end
end
Po-wei Huang
la source
Cela peut-il être converti en un commentaire?
endolith
Désolé je n'ai pas assez de réputation. L'explication dans l'URL est également écrite par moi-même. Je veux juste fournir un code de test qui permet de visualiser la mauvaise influence de l’ondulation.
Po-wei Huang
1

La FFT donne une résolution temporelle médiocre, c’est-à-dire qu’elle ne donne pas d’information à quel moment cette fréquence particulière existe. Il donne des informations sur les composantes de fréquence existantes pour une durée de signal donnée.

En mettant à zéro les bacs dans la FFT, la résolution après IFFT dans le domaine temporel est médiocre.

Itta Gouthami
la source
Cependant, il y a des difficultés de calcul pour un très long signal à prendre fft puis ifft. Pour éviter les zitters / sonneries, le filtrage d'un signal doit passer en douceur d'une bande passante à l'autre.
Itta Gouthami
"La FFT donne une résolution temporelle médiocre" La FFT ne donne aucune résolution temporelle, il s'agit d'une transformation de domaine spectral et donc, comme on le verra plus tard, ne donne que des informations sur les composantes fréquentielles d'un signal.
EdParadox
La résolution fournie par une FFT est la longueur de sa fenêtre. Tout ce qui se trouve en dehors de la fenêtre de la FFT n'est pas résolu comme étant à l'intérieur de la fenêtre de la FFT.
hotpaw2