web-dev-qa-db-fra.com

Tracer la FFT sur l'octave

Je sais que la FFT change une fonction dans le domaine temporel en une fonction indiquée dans le domaine fréquentiel.

Cependant, lorsque j'essaie de tracer ledit graphique dans le domaine fréquentiel, je ne peux le faire fonctionner correctement qu'en utilisant le temps comme axe X, alors qu'il était évidemment censé ne pas être cela, mais la fréquence.

De plus, je ne peux obtenir les amplitudes que celles du signal d'origine en divisant l'axe des y par un certain nombre entier. Pourquoi donc?

Voici mon code

t=0:0.001:2

x=2*sin(20*pi*t) + sin(100*pi*t)
subplot(2,1,1)
plot(1000*t,x)
grid
xlabel("Time in milliseconds")
ylabel("Signal amplitude")

subplot(2,1,2)
y=fft(x)
plot(1000*t,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")

et graphiques.

enter image description here

Veuillez aider = (

13
Gabriel Maia

Relation de fréquence (mise à l'échelle de l'axe des x)

La fréquence de chacune des valeurs produites par la FFT est liée linéairement à l'indice de la valeur de sortie à travers:

f(i) = (i-1)*sampling_frequency/N

Où N est le nombre de points FFT (c'est-à-dire N=length(y)). Dans votre cas, N=2001.

On peut déduire la fréquence d'échantillonnage de votre définition de t comme 1/T où T est l'intervalle de temps d'échantillonnage (T = 0,001 dans votre cas). La fréquence d'échantillonnage est donc de 1000 Hz.

Notez que puisque la valeur de t(i) est également liée linéairement à l'index i, via

t(i) = (i-1)*0.001

il est possible (mais pas nécessairement conseillé, car cela ne ferait qu'obscurcir votre code) de définir f = 1000*t*sampling_frequency/N. Notez que le terme sampling_frequency/N Vous manquait, ce qui entraînait des tonalités affichées à la mauvaise fréquence (d'après la définition de x, il devrait y avoir des pics à 10 Hz et 50 Hz et les alias correspondants à 990 Hz. et 950 Hz).

Relation d'amplitude (mise à l'échelle de l'axe y)

Notez que la relation observée n'est qu'approximative, donc ce qui suit n'est pas une preuve mathématique, mais simplement un moyen intuitif de visualiser la relation entre les amplitudes de tonalité du domaine temporel et les valeurs de crête du domaine fréquentiel .

Simplifier le problème sur un seul ton:

x = A*sin(2*pi*f*t)

L'amplitude approximative du pic correspondant pourrait être dérivée en utilisant théorème de Parseval :

enter image description here

Dans le domaine temporel (le côté gauche de l'équation), l'expression est approximativement égale à 0.5*N*(A^2).

Dans le domaine fréquentiel (le côté droit de l'équation), en faisant les hypothèses suivantes:

  • effets de fuite spectrale sont négligeables
  • le contenu spectral de la tonalité est contenu dans seulement 2 cases (à la fréquence f et la fréquence crénelée correspondante sampling_frequency-f) représentent la somme (toutes les autres cases étant ~ 0). Notez que cela n'est généralement valable que si la fréquence de tonalité est un multiple exact (ou presque exact) de sampling_frequency/N.

l'expression sur le côté droit est approximativement égale à 2*(1/N)*abs(X(k))^2 pour une valeur de k correspondant au pic à la fréquence f.

La combinaison des deux donne abs(X(k)) ~ 0.5*A*N. En d'autres termes, l'amplitude de sortie montre un facteur d'échelle de 0.5*N (Ou environ 1000 dans votre cas) par rapport à l'amplitude du domaine temporel, comme vous l'aviez observé.

L'idée s'applique toujours avec plus d'un ton (bien que l'hypothèse de fuite spectrale négligeable finisse par s'effondrer).

15
SleuthEye

Il a été suggéré par les autres réponses qu'il y a des réponses en fréquence dans cet exemple à 950Hz et 990Hz. Il s'agit d'un malentendu sur la façon dont le code FFT utilise les indices. Ces pointes "haute fréquence" sont en fait de -50Hz et -10Hz.

Le domaine fréquentiel s'étend de -N/2 * fréquence_échantillonnage/N à + N/2 * fréquence_échantillonnage/N. Mais pour des raisons historiques, la convention est que les N/2 premières informations sont les fréquences positives, le milieu est la fréquence zéro et les N/2 dernières informations sont les fréquences négatives dans l'ordre inverse. Pour un spectre de puissance, il n'est pas nécessaire d'afficher plus que les premières informations 1 + N/2.

Cette convention est extrêmement déroutante, car j'ai dû la déduire de Press et al. Recettes numériques et en codant la transformation rapide de Hartley à la main, il y a de nombreuses années lorsque j'ai utilisé la FFT, antérieure à l'édition bêta-test de Matlab 1.0 que Cleve Moler a distribuée à certains chanceux doctorants :-)

5
Will Zimmerman