Zrozumienie przykład Matlab FFT

Jestem nowy w matlab i FFT i chcę zrozumieć Matlab FFT przykład . Na razie mam dwa główne pytania:

1) Dlaczego oś x (częstotliwość) kończy się na 500? Skąd mam wiedzieć, że nie ma więcej częstotliwości, czy są po prostu ignorowane?

2) Skąd mam wiedzieć, że częstotliwości są od 0 do 500? Czy FFT nie powinno mi powiedzieć, w jakich granicach są częstotliwości? Czy FFT zwraca tylko wartość amplitudy bez częstotliwości?

Thanks for any / align = "left" /


Przykład w pytaniu:

Rozważmy dane pobrane przy częstotliwości 1000 Hz. W tym celu należy utworzyć sygnał zawierający sinusoidę 50 Hz o amplitudzie 0,7 i sinusoidę 120 Hz o amplitudzie 1 i uszkodzić go jakimś zerowym szumem losowym:
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)')

domena czasu

Konwertując na dziedzinę częstotliwości, Dyskretna transformata Fouriera hałaśliwego sygnału y znajduje się przyjmując szybką transformatę Fouriera (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)|')

dziedzina częstotliwości

 42
Author: stefan.at.wpf, 2012-05-25

4 answers

1) Dlaczego oś x (częstotliwość) kończy się na 500? Skąd mam wiedzieć, że nie ma więcej częstotliwości, czy są po prostu ignorowane?

Kończy się na 500Hz, ponieważ jest to Częstotliwość Nyquista sygnału przy próbkowaniu z częstotliwością 1000Hz. Zobacz ten wiersz w przykładzie Mathworks:

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

Oś częstotliwości drugiego wykresu wynosi od 0 do Fs / 2, czyli połowę częstotliwości próbkowania. Częstotliwość Nyquista to zawsze połowa częstotliwości próbkowania, ponieważ powyżej że, aliasing występuje: Ilustracja aliasingowa

Sygnał "zwija się" z powrotem i wydaje się być jakąś częstotliwością na lub poniżej 500Hz.

2) Skąd mam wiedzieć, że częstotliwości są od 0 do 500? Czy FFT nie powinno mi powiedzieć, w jakich granicach są częstotliwości?

Ze względu na "składanie" opisane powyżej (Częstotliwość Nyquista jest również powszechnie znana jako" składana częstotliwość"), fizycznie niemożliwe jest pojawienie się częstotliwości powyżej 500Hz w FFT; wyższe częstotliwości będą "składane" do tyłu i pojawiają się jako niższe częstotliwości.

Czy FFT zwraca tylko wartość amplitudy bez częstotliwości?

Tak, Funkcja MATLAB FFT zwraca tylko jeden wektor amplitud. Jednak mapują do punktów częstotliwości, które mu przekazujesz.

Daj mi znać, co wymaga wyjaśnienia, żebym mógł ci pomóc.
 35
Author: kevlar1818,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 18:48:26

Są tu pewne nieporozumienia.

Częstotliwości powyżej 500 mogą być reprezentowane w wyniku FFT o długości 1000. Niestety wszystkie te częstotliwości są składane razem i mieszane w pierwszych pojemnikach wyników 500 FFT. Tak więc zwykle nie chcesz podawać FFT sygnału zawierającego jakiekolwiek częstotliwości z lub powyżej połowy częstotliwości próbkowania, ponieważ FFT nie będzie się tym przejmował i po prostu połączy wysokie częstotliwości z niskimi (aliasing), co sprawi, że wynik będzie bezużyteczny. Dlatego dane powinny być filtrowane w trybie dolnoprzepustowym, zanim zostaną pobrane i przekazane do FFT.

FFT zwraca amplitudy bez częstotliwości, ponieważ częstotliwości zależą nie tylko od długości FFT, ale także od częstotliwości próbkowania danych, które nie są częścią samego FFT ani jego wejścia. Możesz podawać dane FFT o tej samej długości przy dowolnej częstotliwości próbkowania, dzięki czemu uzyskasz z nich dowolny zakres częstotliwości.

Powodem, dla którego wykresy wyniku kończą się na 500 jest to, że dla dowolnych rzeczywistych danych wejściowych częstotliwości powyżej połowy długości FFT są tylko lustrzanymi powtórzeniami (złożonymi sprzężonymi) danych w pierwszej połowie. Ponieważ są to duplikaty, większość ludzi po prostu je ignoruje. Po co tworzyć duplikaty? FFT oblicza drugą połowę wyniku dla osób, które karmią złożone dane FFT (zarówno z rzeczywistymi, jak i wyimaginowanymi składnikami), co tworzy dwie różne połówki.

 10
Author: hotpaw2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 21:10:42

Wygląda na to, że musisz trochę poczytać o tym, czym jest FFT (np. http://en.wikipedia.org/wiki/FFT ). ale aby odpowiedzieć na twoje pytania:

Dlaczego oś x (częstotliwość) kończy się na 500?

ponieważ wektor wejściowy ma długość 1000. Ogólnie rzecz biorąc, FFT o długości-N fali wejściowej spowoduje wektor wyjściowy długości-N. Jeśli przebieg wejściowy jest rzeczywisty, to wyjście będzie symetryczne, więc pierwsze 501 punktów jest wystarczy.

Edytuj: (nie zauważyłem, że przykład wypełnił wektor domeny czasowej.)

Częstotliwość sięga 500 Hz, ponieważ kształt fali w obszarze czasowym jest deklarowany jako częstotliwość próbkowania 1 kHz. Twierdzenie Nyquista mówi, że sygnał z częstotliwością próbkowania {[2] } może obsługiwać (rzeczywisty) sygnał o maksymalnej przepustowości fs/2.

Skąd mam wiedzieć, że częstotliwości są od 0 do 500?

Patrz wyżej.

Czy FFT nie powinno mi powiedzieć, w jakich granicach są częstotliwości?

Nie.

Czy FFT zwraca tylko wartość amplitudy bez częstotliwości?

FFT po prostu przypisuje amplitudę (i fazę) do każdego pojemnika częstotliwości.
 2
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-25 18:48:32

Powodem, dla którego Twoja oś X wykreśla częstotliwości Tylko do 500 Hz jest twoje polecenie ' f = Fs / 2*linspace(0,1,nfft/2+1);'. Twoje Fs to 1000. Jeśli więc podzielisz go przez 2 i pomnożysz przez wartości z zakresu od 0 do 1, to zwróci wektor o długości NFFT / 2+1. Wektor ten składa się z równomiernie rozłożonych wartości częstotliwości, w zakresie od 0 do Fs / 2 (tj. 500 Hz). Ponieważ wykreśl używając ' wykreśl (f, 2 * abs (Y (1: NFFT/2+1)))' limit osi X wynosi 500 Hz.

 -1
Author: xyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 05:36:36