web-dev-qa-db-fra.com

Comprendre l'exemple de Matlab FFT

Je suis nouveau sur Matlab et FFT et je veux comprendre le exemple de Matlab FFT . Pour l'instant j'ai deux questions principales:

1) Pourquoi l’axe des x (fréquence) se termine-t-il à 500? Comment puis-je savoir qu'il n'y a pas plus de fréquences ou sont-elles simplement ignorées?

2) Comment savoir si les fréquences sont comprises entre 0 et 500? La FFT ne devrait-elle pas me dire dans quelles limites se trouvent les fréquences? La FFT ne renvoie-t-elle que la valeur d'amplitude sans la fréquence?

Merci pour tout indice!


Exemple en question:

Considérer les données échantillonnées à 1000 Hz. Créez un signal contenant une sinusoïde de 50 Hz d’amplitude 0,7 et de 120 Hz d’amplitude 1 et corrigez-le avec un bruit aléatoire de moyenne nulle:

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); 
y = x + 2*randn(size(t));     % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

time domain

En convertissant dans le domaine fréquentiel, la transformée de Fourier discrète du signal bruyant y est trouvée en prenant la transformée de Fourier rapide (FFT):

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

frequency domain

45
stefan.at.wpf

1) Pourquoi l’axe des x (fréquence) se termine-t-il à 500? Comment puis-je savoir qu'il n'y a pas plus de fréquences ou sont-elles simplement ignorées?

Il se termine à 500Hz car c’est la fréquence de Nyquist du signal lorsqu’il est échantillonné à 1000Hz. Regardez cette ligne dans l'exemple Mathworks:

f = Fs/2*linspace(0,1,NFFT/2+1);

L'axe de fréquence du deuxième tracé va de 0 à Fs/2, soit la moitié de la fréquence d'échantillonnage. La fréquence de Nyquist est toujours égale à la moitié de la fréquence d'échantillonnage, car au-dessus, aliasing se produit: Aliasing illustration

Le signal se "replierait" sur lui-même et apparaîtrait comme une fréquence égale ou inférieure à 500Hz.

2) Comment savoir si les fréquences sont comprises entre 0 et 500? La FFT ne devrait-elle pas me dire dans quelles limites se trouvent les fréquences?

En raison du "pliage" décrit ci-dessus (la fréquence de Nyquist est également communément appelée "fréquence de pliage"), il est physiquement impossible que des fréquences supérieures à 500 Hz apparaissent dans la FFT; les fréquences les plus hautes se "replient" et apparaissent comme des fréquences plus basses.

La FFT ne renvoie-t-elle que la valeur d'amplitude sans la fréquence?

Oui, la fonction MATLAB FFT ne renvoie qu'un vecteur d'amplitudes. Cependant, ils correspondent aux points de fréquence que vous y passez.

Faites-moi savoir ce qui doit être clarifié afin que je puisse vous aider davantage.

37
kevlar1818

Il y a quelques idées fausses ici.

Les fréquences supérieures à 500 peuvent doivent être représentées dans un résultat FFT de longueur 1000. Malheureusement, ces fréquences sont toutes pliées et mélangées dans les 500 premiers résultats FFT. Donc, normalement, vous ne voulez pas alimenter une FFT avec un signal contenant des fréquences égales ou supérieures à la moitié du taux d'échantillonnage, car la FFT s'en foutra et mélangera simplement les hautes fréquences avec les basses (repliement du spectre), ce qui rend le résultat plus joli. beaucoup inutile. C'est pourquoi les données doivent être filtrées par un filtre passe-bas avant d'être échantillonnées et transmises à une FFT.

La FFT renvoie des amplitudes sans fréquence car les fréquences dépendent non seulement de la longueur de la FFT, mais également de la fréquence d'échantillonnage des données, qui ne font pas partie de la FFT ni de son entrée. Vous pouvez alimenter des données FFT de même longueur à n’importe quelle fréquence d’échantillonnage, ce qui permet d’extraire n’importe quelle plage de fréquences.

La raison pour laquelle le graphique de résultat se termine à 500 est que, pour toute entrée de données réelle, les fréquences supérieures à la moitié de la longueur de la FFT ne sont que des répétitions en miroir (complexes conjuguées) des données dans la première moitié. Comme ce sont des doublons, la plupart des gens les ignorent. Pourquoi tracer des doublons? La FFT calcule l’autre moitié du résultat pour les personnes alimentant les données complexes de la FFT (avec des composants réels et imaginaires), ce qui crée deux moitiés différentes.

10
hotpaw2

Il semble que vous ayez besoin de connaissances de base sur ce qu'est une FFT (par exemple, http://en.wikipedia.org/wiki/FFT ). Mais pour répondre à vos questions:

Pourquoi l'axe des x (fréquence) se termine-t-il à 500?

Parce que le vecteur d'entrée est de longueur 1000. En général, la FFT d'une forme d'onde en longueur -N donnera un vecteur en sortie de longueur -N. Si le signal d'entrée est réel, le signal de sortie sera symétrique, de sorte que les 501 premiers points sont suffisants.

Edit: (Je n'ai pas remarqué que l'exemple complétait le vecteur de domaine temporel.)

La fréquence passe à 500 Hz car la forme d'onde du domaine temporel est déclarée avec une fréquence d'échantillonnage de 1 kHz. Le théorème d'échantillonnage de Nyquist stipule qu'un signal avec une fréquence d'échantillonnage fs peut prendre en charge un signal (réel) avec une largeur de bande maximale de fs/2.

Comment savoir si les fréquences sont comprises entre 0 et 500?

Voir au dessus.

La FFT ne devrait-elle pas me dire dans quelles limites se trouvent les fréquences?

Non.

La FFT ne renvoie-t-elle que la valeur d'amplitude sans la fréquence?

La FFT affecte simplement une amplitude (et une phase) à chaque groupe de fréquences.

1