Próbuję pobrać próbkę fali sinusoidalnej i wykreślić jej składowe częstotliwości, ale mam problemy z jej implementacją Wynik pobrania 65536 próbek jednego cyklu przebiegu sinusoidalnego o maksymalnej amplitudzie 1 i częstotliwości 100 można zobaczyć poniżej. Gdzie oś Y to wielkość zespolonej sumy Fouriera, a oś x to numer próbki Jak mogę zobaczyć, jaką częstotliwość ma fala sinusoidalna na tym wykresie? Chciałbym mieć wykres freq vs Magnitude, a nie próbkę Number vs wielkość.
Spodziewałem się jednego dużego skoku amplitudy 1 lub 2 piki o amplitudzie 0,5 każdy, ale wydaje mi się, że uzyskuje dużą amplitudę, nie wiem, co robię źle.
Kod Matlab:
Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform);
Komentarze
- Implementacje FFT często mają zysk proporcjonalny do $ N $ lub $ \ sqrt {N} $ w nich. Twój wynik nie jest ' nieracjonalny.
- Dzielenie wielkości przez $ N $ daje dwa skoki o wielkości około 0,425 każdy (co jest nadal niższe niż oczekiwane 0,5 ) .Jak zmienić oś x na częstotliwość z numeru próbki?
Odpowiedź
Wygląda tak jak ty „mylisz częstotliwość w hercach z radianami / s, ponieważ masz współczynnik $ 2 \ pi $ w obu okresach próbkowania dt i Twój sygnał. Przepisałem fragment Twojego kodu, aby wyjaśnić, czego naprawdę chcesz.
Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)")
Jeśli częstotliwość próbkowania wynosi 65536 próbek na sekundę i potrzebujesz na przykład tonu o częstotliwości 12 kHz, możesz go utworzyć tak, jak pokazano. Więc tutaj okres próbkowania to 1/65536 sekundy.
Twoje oczekiwanie uzyskania dwóch impulsów o amplitudzie 0,5 każdy dobrze – po prostu wygenerowany ton nie był.
Jeśli chodzi o wyskalowanie osi X do herców, po prostu utwórz wektor z taką samą liczbą punktów jak wynik FFT i z liniowym przyrostem od $ – fs / 2 $ do $ + fs / 2 $ . Zwróć też uwagę na przesunięcie fftshift, którego użyłem na wykresie. Dzieje się tak dlatego, że wynik funkcji FFT Matlaba zmienia się liniowo od 0 do fs. Łatwiej jest mi wyobrazić sobie wyśrodkowanie DC, ale tak czy inaczej jest w porządku. Bez przesunięcia fftshift wektor faxis zmieniłby się z 0 na fs .
Odpowiedź
Niektóre FFT wymagają dzielenia przez 1 / N, aby przedstawić wielkość „naturalnie” (co nie oszczędza energii ). Oznaczenie osi X wymaga znajomości częstotliwości próbkowania (Fs). Jeśli jest znany, to f_x = bin_index * Fs / N, aż do N / 2, a następnie lustrzane odbicie dla ujemnych częstotliwości. Jeśli częstotliwość piku widmowego (wejściowej fali sinusoidalnej) nie jest „t dokładnie okresowa w długości FFT (np. Liczba całkowita cykli), wtedy wielkość najbliższego przedziału wyników FFT będzie mniejsza i będziesz musiał dokonać interpolacji między przedziałami, aby znaleźć bliższe oszacowanie wielkości piku (powszechne są interpolacje paraboliczne lub okienkowe jądra Sinc).
Odpowiedź
Aby dodać jakieś formuły do odpowiedzi hotpaw2:
Za pomocą FFT obliczasz reprezentację swojego sygnału jako
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
gdzie $ f_k = \ frac {k} {N} f_s $ dla $ k = 0,1, …, N / 2-1 $ i $ f_k = \ frac {kN} {N} f_s $ dla $ k = N / 2, …, N-1 $, zakładając $ N $ parzyste.
Teraz FFT wymaga, aby próbki były pobierane z krokiem próbkowania $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, a FFT tablicy próbki $ (x_n) _n $ daje skalowaną tablicę amplitud $ (N \ hat x_k) _k $, ponieważ $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Przeskalowanie i s zwykle pomijane w implementacjach FFT, którymi zajmuje się użytkownik biblioteki FFT.
Odpowiedź
FFT zapewnia metodę obliczania DFT to już wiesz. rozważmy teraz sygnał x (n) i jego DFT X (k). jeśli twój sygnał składa się z N (65536 w twoim przypadku) próbek, to X (k) dostarczy wartości przy dyskretnych częstotliwościach 2*pi*k/N
. W rzeczywistości powyższe DFT X (k) oznacza X(2*pi*k/N)
. więc jeśli znajdujesz X (1), oznacza to, że znajdujesz współczynnik DFT przy dyskretnej częstotliwości 2 * pi * 1 / N i podobnie, X (2) oznacza współczynnik dla 2 * pi * 2 / N i tak dalej. Każdy współczynnik pokazuje udział tej częstotliwości w tym sygnale, jeśli jest duży, to oznacza, że częstotliwość stanowi większą część sygnału. więc do wykreślania fft w odniesieniu do częstotliwości, zamień oś próbki na oś częstotliwości zawierającą punkty 2*pi*k/N
, gdzie k = 0 do 65535.FT nigdy nie dostarcza żadnych informacji dotyczących czasu. sygnał.