Jeg prøver å prøve en sinusbølge og plotte dens frekvenskomponenter, men jeg har problemer med å implementere den Resultatet av å ta 65536 prøver av en syklus av en sinusbølge med maks amplitude 1 og en frekvens 100 kan sees nedenfor. Der Y-aksen er dette størrelsen på den komplekse Fourier-summen, og x-aksen er prøvenummeret. .Hvordan kan jeg se hvilken frekvens sinusbølgen har fra dette plottet ?, Jeg vil gjerne ha et plot av freq vs Magnitude og ikke prøve Number vs magnitude.
Jeg forventet en stor amplitude 1 eller to pigger med amplitude 0,5 hver, men jeg ser ut til å få en stor amplitude, jeg vet ikke hva jeg kan gjøre galt.
Matlab-kode:
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);
Kommentarer
- FFT-implementeringer har ofte en gevinst proporsjonal med $ N $ eller $ \ sqrt {N} $ i seg. Resultatet ditt er ikke ' t urimelig.
- Å dele størrelsen med $ N $ gir to pigger med størrelsesorden rundt 0,425 hver (som fortsatt er lavere enn forventet 0,5 Hvordan endrer jeg x-aksen til frekvens fra eksemplet nummer?
Svar
Det ser ut som om du forveksler frekvensen din i Hertz med radianer / sek, siden du har faktoren $ 2 \ pi $ i begge prøvetidsperioder dt og signalet ditt. Jeg skrev om litt av koden din for å avklare hva jeg egentlig vil.
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)")
Hvis samplingsfrekvensen din er 65536 prøver / sekund , og du vil for eksempel ha en tone ved 12 KHz, du kan lage den som vist. Så her er prøveperioden din 1/65536 sekunder.
Forventningen din om å få to pigger med en amplitude på 0,5 hver var riktig – bare den genererte tonen din var ikke.
Når det gjelder å skalere x-aksen til å være i Hertz, er det bare å lage en vektor med samme antall poeng som FFT-resultatet ditt og med en lineær økning fra $ – fs / 2 $ til $ + fs / 2 $ . Legg også merke til fftshift jeg brukte i handlingen. Det er fordi utgangen fra Matlabs FFT-funksjon går lineært fra 0 til fs. Jeg synes det er lettere å visualisere å ha DC-sentrert, men uansett er det bra. Uten fftshift ville faxis vektoren gå fra 0 til fs .
Svar
Noen FFT krever deling med 1 / N for å representere størrelsen «naturlig» (som ikke er energibesparende ). For å merke X-aksen, må du vite samplingsfrekvensen (Fs). Hvis kjent, så er f_x = bin_index * Fs / N, opp til N / 2, deretter speilet for negative frekvenser. Hvis frekvensen til en spektral topp (din inngangs sinebølge) ikke er «t nøyaktig periodisk i FFT-lengden (f.eks. Et heltall av sykluser), så vil størrelsen på den nærmeste FFT-resultatbeholderen være mindre, og du må interpolere mellom søppelkassene for å finne et nærmere estimat til toppstørrelsen (parabolske eller vindu-sink-kjerninterpolasjoner er vanlige).
Svar
For å legge til noen formler til svaret på hotpaw2:
Med FFT beregner du en representasjon av signalet ditt som
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
der $ f_k = \ frac {k} {N} f_s $ for $ k = 0,1, …, N / 2-1 $ og $ f_k = \ frac {kN} {N} f_s $ for $ k = N / 2, …, N-1 $, forutsatt $ N $ jevn.
Nå krever FFT at prøvene tas med prøvetakingstrinn $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, og FFT for prøven array $ (x_n) _n $ gir den skalerte amplitude array $ (N \ hat x_k) _k $, siden $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Omskalering i s vanligvis utelatt av FFT-implementeringene som skal behandles av brukeren av FFT-biblioteket.
Svar
FFT gir metode av databehandling DFT dette vet du allerede. vurder nå et signal x (n) og dets DFT X (k). hvis signalet ditt består av N (65536 i ditt tilfelle) prøver, vil X (k) gi verdier ved diskrete frekvenser på 2*pi*k/N
. Faktisk betyr ovenstående DFT X (k) X(2*pi*k/N)
. så hvis du finner X (1), betyr det at du finner DFT-koeffisient ved diskret frekvens på 2 * pi * 1 / N og lik, X (2) betyr koeffisient for 2 * pi * 2 / N og dermed så videre. Hver koeffisient viser bidraget til den frekvensen i signalet, hvis det er stort, betyr det at frekvensen utgjør hoveddelen av signalet. så for å plotte fft med hensyn til frekvens, erstatt prøveakse med frekvensakse med punkter 2*pi*k/N
der k = 0 til 65535.FT gir aldri noen informasjon om tid. det gir bare frekvensinformasjon om signal.