Pourquoi devrais-je émettre un signal zéro avant de prendre la transformée de Fourier?

77

En réponse à une question précédente , il a été déclaré qu'il fallait

touchez les signaux d’entrée (ajoutez des zéros à la fin de sorte qu’au moins la moitié de l’onde soit "vierge")

Quelle en est la raison?

Jonas
la source
Cela dépend de ce que vous faites. Cela aurait pu être un commentaire sur ma réponse. J'ai ajouté une explication à cela.
endolith
@endolith: J'ai d'abord pensé le formuler comme commentaire, mais je pense que la question pourrait être d'intérêt général et qu'il serait dommage qu'une bonne réponse soit enterrée quelque part dans les commentaires. Si vous n'êtes pas d'accord, je vais supprimer cette question.
Jonas
9
C'est une question très générale. Vous pouvez utiliser le pad zéro pour créer quelque chose comme une puissance de 2, vous pouvez faire en sorte que la transformation circulaire se comporte comme une transformation non circulaire, vous pouvez le faire pour rééchantillonner un signal, pour changer la résolution de fréquence, etc., etc.
endolith
Également lié: dsp.stackexchange.com/questions/331/…
finnw le

Réponses:

82

Le remplissage zéro permet d'utiliser une FFT plus longue, ce qui produira un vecteur de résultat FFT plus long.

Un résultat FFT plus long a plus de cases de fréquence qui sont plus espacées en fréquence. Mais ils fourniront essentiellement le même résultat qu’une interpolation Sinc de haute qualité d’une FFT plus courte, non complétée de zéro, des données originales.

Cela pourrait donner un spectre d'aspect plus lisse lorsque tracé sans interpolation supplémentaire.

Bien que cette interpolation ne soit d'aucune utilité pour la résolution ou la résolution des fréquences adjacentes ou adjacentes, elle pourrait faciliter la résolution visuelle du pic d'une seule fréquence isolée ne présentant aucun signal ou bruit adjacent significatif dans le spectre. . Statistiquement, la densité plus élevée des résultats FFT rendra probablement plus probable le fait que le récepteur de l'amplitude du pic est plus proche de la fréquence d'une sinusoïde à fréquence d'entrée isolée aléatoire et sans autre interpolation (parabolique, etc.).

Mais, essentiellement, zéro remplissage avant une DFT / FFT est une méthode efficace en calcul pour interpoler un grand nombre de points.

Le remplissage par zéro pour la corrélation croisée, l'auto-corrélation ou le filtrage par convolution est utilisé pour ne pas mélanger les résultats de convolution (en raison d'une convolution circulaire). Le résultat complet d'une convolution linéaire est plus long que l'un des deux vecteurs d'entrée. Si vous ne fournissez pas la place nécessaire pour mettre fin à ce résultat de convolution plus long, la convolution rapide FFT ne fera que mélanger le résultat avec votre résultat désiré. Le remplissage à zéro fournit un tas de zéros dans lesquels mélanger le résultat le plus long. Et il est beaucoup plus facile de décomposer quelque chose qui a été mélangé / sommé avec un vecteur de zéros.

hotpaw2
la source
12
Le dernier paragraphe est la réponse clé à la question initiale, même si je pense que cela pourrait être exposé plus clairement. Le remplissage à zéro dans le contexte de la corrélation ou de la convolution peut être effectué pour garantir que la mise en œuvre du processus dans le domaine fréquentiel génère des résultats linéaires au lieu d' une convolution / corrélation circulaire . Toutefois, cela n’est pas une obligation si vous êtes prêt à effectuer des travaux de comptabilité de côté, comme dans les algorithmes de chevauchement et d’ajout de chevauchement.
Jason R
4
@Jason R: En fait, ce sont deux convolution circulaire. Une FFT normale (non élaguée) effectue toutes les multiplications et ajoute une partie enveloppante du résultat. C'est simplement que dans le cas suffisamment nul, toutes ces multiplications et tous les ajouts ont la valeur zéro, donc personne ne se soucie du rien qui est calculé et encapsulé dans le cercle.
hotpaw2
9
En effet; La multiplication des TFD de deux signaux implémente toujours la convolution circulaire. J'aurais dû le formuler différemment: vous remplissez des zéros à la fin d'un signal pour vous assurer que le résultat obtenu en les convoquant de manière circulaire est identique à ce que vous obtenez si vous les convolez linéairement (en supposant que la convolution linéaire soit ce que vous voulez, généralement le cas).
Jason R
27

Avant de décider de mettre votre signal dans le domaine temporel à zéro-pad, vous devez prendre en compte quelques éléments. Vous n'aurez peut-être pas besoin de mettre le signal à zéro du tout!

1) Allongez les données du domaine temporel (pas le remplissage nul) pour obtenir une meilleure résolution dans le domaine fréquentiel.

2) Augmentez le nombre de points FFT au-delà de la longueur de signal de votre domaine temporel (zéro remplissage) si vous souhaitez une meilleure définition des compartiments FFT, sans pour autant vous acheter une résolution plus vraie. Vous pouvez également patiner pour obtenir une puissance de 2 points FFT.

3) Lorsque vous manipulez les points FFT (au point précédent), assurez-vous que vos points de fréquence se trouvent là où vous le souhaitez. L'espacement des points est , où est la fréquence d'échantillonnage et le nombre de points FFT.fs/NfsN

Il y a quelques belles figures illustrant ces points sur http://www.bitweenie.com/listings/fft-zero-padding/

Une dernière chose à mentionner: si vous utilisez le pavé numérique dans le domaine temporel et que vous souhaitez utiliser une fonction de fenêtrage, veillez à bien le visualiser avant le pavé zéro. Si vous appliquez la fonction window après zéro padding, vous n'accomplirez pas ce que la fenêtre est censée accomplir. Plus précisément, vous aurez toujours une transition nette du signal à zéro au lieu d’une transition en douceur vers zéro.

utilisateur19460
la source
8

En général, la mise à zéro avant la TFD équivaut à une interpolation, ou à un échantillonnage plus fréquent, dans le domaine transformé.

Voici une rapide visualisation du fonctionnement du contraire. Si vous échantillonnez un signal avec une bande passante limitée dans le temps à un débit plus élevé, vous obtenez un spectre plus «réduit», c'est-à-dire un spectre avec plus de zéros aux deux extrémités. En d’autres termes, vous pouvez obtenir plus d’échantillons dans le temps en mettant simplement à zéro la fréquence après DFT, puis en IDFT le résultat à zéro.

Le même effet est inversé lorsque le remplissage à zéro se produit dans le temps. Tout cela parce que la reconstruction de signal parfaite est possible tant qu'un signal est limité en bande et échantillonné au moins au taux de Nyquist.

Le terme "résolution" dépend de la façon dont vous le définissez. Pour moi, cela signifie à quel point les deux points d'observation adjacents en temps ou en fréquence peuvent être discriminés de manière fiable (statistiquement). Dans ce cas, la résolution dépend en fait de la taille de la DFT due aux fuites spectrales. C'est-à-dire que la taille de la fenêtre est plus petite, que le signal transformé est plus flou ou taché, et inversement. Cela diffère de la fréquence d'échantillonnage ou de ce que je nomme «définition». Par exemple, vous pouvez avoir une image très floue échantillonnée à un taux élevé (haute définition), mais vous ne pouvez toujours pas obtenir plus d'informations qu'un échantillonnage à un taux inférieur. En résumé, le remplissage à zéro n'améliore pas du tout la résolution car vous ne gagnez pas plus d'informations qu'auparavant.

M. T
la source
6

Si l'on s'intéresse au spectre de la fonction de fenêtrage utilisée pour isoler l'échantillon temporel, le remplissage à zéro augmentera la résolution en fréquence de la fonction de fenêtrage.

Si le signal de temps est , où est la fonction de fenêtrage, le spectre global est alors , où annule la convolution. w ( t ) X ( f ) * W ( f ) *x(t)w(t)w(t)X(f)W(f)

Si votre fonction de fenêtrage est un simple rectangle (une extraction d'un ensemble de valeurs de . Alors est la fonction de synchronisation. Ainsi, par exemple, si Nfft est identique à la largeur de votre rectangle et vous aviez une sinusoïde précisément à l'une des fréquences de la corbeille, puis les échantillons de la fonction de synchronisation qui sembleraient centrés sur cette corbeille tombent exactement au passage à zéro de l'heure creuse, et vous ne voyez pas la forme de la synchronisation dans Si vous mettez maintenant vos données à zéro dans la FFTX ( f )x(t)X(f), vous verrez des échantillons à des endroits autres que le sommet et le passage à zéro, révélant ainsi la forme de la fonction de synchronisation dans le spectre résultant. Alors, à quoi sert le zéro-padding? Il est certainement utile à des fins pédagogiques de révéler la nature de la transformation discrète des signaux en fenêtre, ce qui est le cas habituel. Dans la pratique, cela pourrait être utile dans tous les cas où vous êtes intéressé par la forme spectrale d'une enveloppe isolée chevauchant une onde porteuse.

Paul
la source
4

Il peut y avoir différentes raisons à cela en fonction des processus effectués avant et après la transformation de Fourier. La raison la plus courante est d’obtenir une résolution de fréquence supérieure dans toute transformation résultante. Autrement dit, plus le nombre d'échantillons utilisés dans votre transformation est grand, plus la largeur de bande dans le spectre de puissance résultant est étroite. Rappelez-vous: binwidth = sample_frequency / transform_size (souvent appelée taille de la fenêtre). Vous pouvez imaginer à partir de cela que lorsque vous augmentez la taille de votre transformation, binwidth diminue (= meilleure résolution en fréquence). Le zéro de remplissage est un moyen d'augmenter la taille de la transformation sans introduire de nouvelles informations dans le signal.

Alors pourquoi ne pas simplement prendre une plus grande transformation sans zéro padding? Cela ne produirait-il pas le même effet? Bonne question. Dans de nombreux cas, vous souhaiterez peut-être analyser un flux de données de domaine temporel, pour lequel vous utiliserez peut-être une transformation de Fourier à court terme (stft). Cela implique de transformer tous les N échantillons en transformée en fonction de la résolution temporelle requise pour caractériser les modifications du spectre de fréquences. C'est ici que se trouve le problème. Une fenêtre trop grande et vous perdrez la résolution temporelle, une fenêtre trop petite et vous perdrez la résolution de fréquence. La solution consiste alors à prendre de petites fenêtres dans le domaine temporel vous donnant une bonne résolution temporelle, puis à les régler à zéro pour vous donner une bonne résolution fréquentielle. J'espère que cela vous est utile

Mise à jour
Je n'ai pas bien expliqué cela. J'aurais dû mieux le préciser. En se référant à une transformation fenêtrée, vous n'obtenez effectivement aucune résolution de fréquence «réelle», mais à des fins de visualisation (lecture du spectre de puissance avec l'œil), elle peut fournir des résultats plus clairs. En utilisant le taux d’échantillonnage critique, chaque lobe latéral occupe une seule case, ce qui, en fonction de la technique de représentation graphique, peut être trompeur. Le remplissage à zéro fournit un spectre de fréquence interpolé qui peut être plus révélateur. De plus, si vous utilisez une méthode de sélection de pics simple pour l'estimation de fréquence, l'effet d'interpolation spectrale du remplissage à zéro vous donnera un échantillon spectral plus proche du pic réel du lobe principal. Ce lien fournit des diagrammes utiles: http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html

Dan Barry
la source
9
Cette réponse n'est pas correcte. Le remplissage à zéro n'améliore pas du tout la résolution de fréquence; il interpole simplement entre les sorties de la plus petite transformation. Vous pouvez considérer le remplissage à zéro comme l'ajout de plusieurs bandes de fréquences ayant la même bande passante que pour la transformation plus petite; par conséquent, du point de vue de la banque de filtres, leurs bandes passantes se chevauchent.
Jason R
1
Si cela aide à comprendre: Vous pouvez également faire le contraire: prendre la FFT d'un signal, puis ajouter le résultat à zéro et inverser la FFT. Cela aura pour effet d'interpoler le signal d'origine. Mais bien entendu, le signal sera toujours le même, avec la même bande passante Nyquist. L'interpolation ne vous donnera pas plus d'informations sur les fréquences que ce qui était à l'origine.
endolith
1
@Jason R - Vous avez raison, ma réponse était trompeuse, j'ai tenté de clarifier ce qui précède dans le message d'origine. Je n'aurais pas dû dire que le remplissage à zéro augmente la résolution en fréquence.
Dan Barry
2

Je ne les ai pas vues mentionnées dans les bonnes réponses précédentes. Je vais donc ajouter les raisons supplémentaires suivantes pour le remplissage à zéro:

Les algorithmes Radix-2 sont plus efficaces, de sorte que le zéro atteint la puissance voisine de 2 (ou 4 dans certains cas pour Radix-4), ou plus significativement, l’évitement de facteurs premiers importants peut améliorer les performances en temps réel. De plus, lors de l’utilisation de la FFT à des fins d’analyse, un remplissage nul est souvent utilisé pour calculer des échantillons de la DTFT, par exemple pour déterminer la réponse en fréquence d’une FIR: comparer fft ([1 1 1 1]) à fft ([1 1 1 1], 512) identique à freqz ([1 1 1 1]).

Dan Boschen
la source