Încerc să probez o undă sinusoidală și să trasez componentele de frecvență ale acesteia, dar am probleme cu implementarea acesteia Rezultatul prelevării a 65536 de probe dintr-un ciclu al unei unde sinusoidale cu amplitudine maximă 1 și o frecvență 100 poate fi văzut mai jos. Unde axa Y este magnitudinea sumei Fourier complexe, iar axa x este numărul eșantionului .Cum pot vedea ce frecvență are unda sinusoidală din acest grafic ?, aș dori să am un grafic de frecvență față de magnitudine și nu eșantion număr vs magnitudine.
Mă așteptam la o creștere mare de amplitudine 1 sau 2 vârfuri de amplitudine 0,5 fiecare, dar parcă primesc o amplitudine mare, nu știu ce aș face greșit.
Cod 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);
Comentarii
- Implementările FFT au adesea un câștig proporțional cu $ N $ sau $ \ sqrt {N} $ în ele. Rezultatul dvs. nu este ' t nerezonabil.
- Împărțirea magnitudinii cu $ N $ dă două vârfuri cu magnitudini de aproximativ 0,425 fiecare (care este încă mai mică decât 0,5 așteptate ). Cum schimb axa x în frecvență din numărul eșantionului?
Răspuns
Se pare ca și cum ați obține frecvența în Hertz confundată cu în radiani / sec, deoarece aveți factorul $ 2 \ pi $ atât în perioada de eșantionare dt și semnalul dvs. Am rescris un pic din codul dvs. pentru a clarifica ceea ce cred că doriți cu adevărat.
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)")
Dacă frecvența dvs. de eșantionare este de 65536 mostre / secundă și doriți, de exemplu, un ton la 12 KHz, îl puteți crea așa cum se arată. Așadar, perioada de eșantionare este de 1/65536 secunde.
Așteptarea dvs. de a obține două vârfuri cu o amplitudine de 0,5 fiecare a fost corect – doar tonul generat nu a fost.
În ceea ce privește scalarea axei x pentru a fi în Hertz, trebuie doar să creați un vector cu același număr de puncte ca rezultatul FFT și cu o creștere liniară de la $ – fs / 2 $ la $ + fs / 2 $ . Rețineți și schimbarea pe care am folosit-o în complot. Asta pentru că ieșirea funcției FFT a lui Matlab merge liniar de la 0 la fs. Mi se pare mai ușor să vizualizez având DC centrat, dar oricare dintre ele este în regulă. Fără schimbul de frecvențe, vectorul faxis ar merge de la 0 la fs .
Răspuns
Unele FFT necesită împărțirea la 1 / N pentru a reprezenta magnitudinea „natural” (care nu conservă energia) ). Pentru a eticheta axa X necesită cunoașterea ratei de eșantionare (Fs). Dacă este cunoscut, atunci f_x = bin_index * Fs / N, până la N / 2, apoi reflectat pentru frecvențe negative. Dacă frecvența unui vârf spectral (unde sinusoidală de intrare) nu este „t exact periodică în lungimea FFT (de exemplu, un număr întreg de cicluri), atunci magnitudinea celui mai apropiat coș de rezultate FFT va fi mai mică și va trebui să interpolați între coșuri pentru a găsi o estimare mai apropiată de magnitudinea maximă (interpolările kernelului parabolice sau cu ferestre sunt comune).
Răspuns
Pentru a adăuga formule som la răspunsul hotpaw2:
Cu FFT calculați o reprezentare a semnalului dvs. ca
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
unde $ f_k = \ frac {k} {N} f_s $ pentru $ k = 0,1, …, N / 2-1 $ și $ f_k = \ frac {kN} {N} f_s $ pentru $ k = N / 2, …, N-1 $, presupunând că $ N $ este egal.
Acum FFT cere ca eșantioanele să fie luate cu pasul de eșantionare $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, iar FFT-ul matricei $ $ (x_n) _n $ oferă matricea de amplitudine scalată $ (N \ hat x_k) _k $, deoarece $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Rescalarea i De obicei, sunt lăsate în afara implementărilor FFT pentru a fi tratate de către utilizatorul bibliotecii FFT.
Răspuns
FFT oferă metoda de calcul DFT asta știți deja. ia în considerare acum un semnal x (n) și DFT-ul său X (k). dacă semnalul dvs. constă din N (65536 în cazul dvs.) eșantioane, X (k) va furniza valori la frecvențe discrete de 2*pi*k/N
. De fapt, DFT X (k) de mai sus înseamnă X(2*pi*k/N)
. deci, dacă găsiți X (1), atunci înseamnă că găsiți un coeficient DFT la o frecvență discretă de 2 * pi * 1 / N și similar, X (2) înseamnă coeficient pentru 2 * pi * 2 / N și deci așa mai departe. Fiecare coeficient arată contribuția acelei frecvențe în acel semnal dacă este mare atunci înseamnă că frecvența constituie o parte majoră a semnalului. deci, pentru reprezentarea fft în ceea ce privește frecvența, înlocuiți axa eșantionului cu axa de frecvență cu puncte 2*pi*k/N
unde k = 0 până la 65535.FT nu furnizează niciodată informații cu privire la timp. semnal.