Jeg prøver at prøve en sinusbølge og plotte dens frekvenskomponenter, men jeg har problemer med at implementere den Resultatet af at tage 65536 prøver af en cyklus af en sinusbølge med maks. Amplitude 1 og en frekvens 100 kan ses nedenfor. Hvor Y-aksen er dette størrelsen af den komplekse Fourier-sum, og x-aksen er prøve nummeret. .Hvordan kan jeg se, hvilken frekvens sinusbølgen har fra dette plot ?, Jeg vil gerne have et plot af freq vs Magnitude og ikke prøve Number vs magnitude.
Jeg forventede en stor amplitude 1 eller to spidser med amplitude 0,5 hver, men jeg ser ud til at få en stor amplitude, jeg ved ikke, hvad jeg måske gør forkert.
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, der er proportional med $ N $ eller $ \ sqrt {N} $. Dit resultat er ikke ' t urimeligt.
- Hvis du deler størrelsen med $ N $, får du to pigge med størrelser på omkring 0,425 hver (hvilket stadig er lavere end forventet 0,5 Hvordan ændrer jeg x-aksen til frekvensen fra prøve nummeret?
Svar
Det ser ud som om du “bliver din frekvens i Hertz forvekslet med i radianer / sek, da du har faktoren $ 2 \ pi $ i både din prøveperiode dt og dit signal. Jeg omskrev lidt af din kode for at afklare, hvad jeg tror, du virkelig vil have.
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 din samplingsfrekvens er 65536 prøver / sekund , og du vil f.eks. have en tone ved 12 KHz, du kan oprette den som vist. Så her er din prøveperiode 1/65536 sekunder.
Din forventning om at få to spidser med en amplitude på 0,5 hver var korrekt – bare din genererede tone var ikke.
Hvad angår skalering af x-aksen til at være i Hertz, skal du bare oprette en vektor med samme antal point som dit FFT-resultat og med en lineær stigning fra $ – fs / 2 $ til $ + fs / 2 $ . Bemærk også den fftshift, jeg brugte i plottet. Det skyldes, at output fra Matlabs FFT-funktion går lineært fra 0 til fs. Jeg finder det lettere at visualisere at have DC-centreret, men begge veje er fint. Uden fftshift ville faxis vektoren gå fra 0 til fs .
Svar
Nogle FFTer kræver deling med 1 / N for at repræsentere størrelsen “naturligt” (hvilket ikke er energibesparende ). For at mærke X-aksen kræves det at kende samplingshastigheden (Fs). Hvis det er kendt, så f_x = bin_index * Fs / N, op til N / 2, derefter spejlet for negative frekvenser. Hvis frekvensen af en spektral top (din input sinusbølge) ikke er “t nøjagtigt periodisk i FFT-længden (f.eks. Et heltal af cykler), så vil størrelsen på den nærmeste FFT-resultatbakke være mindre, og du bliver nødt til at interpolere mellem skraldespandene for at finde et nærmere estimat til topstørrelsen (parabolsk eller vindues-Sink-kerneinterpolationer er almindelige).
Svar
For at tilføje nogle formler til svaret på hotpaw2:
Med FFT beregner du en repræsentation af dit signal som
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
hvor $ 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 $, forudsat at $ N $ er ens.
Nu kræver FFT, at prøverne tages med prøvetagningstrin $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, og FFT for sample array $ (x_n) _n $ giver det skalerede amplitude array $ (N \ hat x_k) _k $, da $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Omskalering i s normalt udeladt af FFT-implementeringerne, der skal behandles af brugeren af FFT-biblioteket.
Svar
FFT giver metode computing DFT dette ved du allerede. overvej nu et signal x (n) og dets DFT X (k). hvis dit signal består af N (65536 i dit tilfælde) prøver, så vil X (k) give værdier ved diskrete frekvenser på 2*pi*k/N
. Faktisk betyder ovenstående DFT X (k) X(2*pi*k/N)
. så hvis du finder X (1), betyder det, at du finder DFT-koefficient ved diskret frekvens på 2 * pi * 1 / N og ligner, X (2) betyder koefficient for 2 * pi * 2 / N og dermed så videre. Hver koefficient viser bidrag fra denne frekvens i signalet, hvis det er stort, betyder det, at frekvensen udgør hoveddelen af signalet. så for at plotte fft med hensyn til frekvens skal du erstatte prøveakse med frekvensakse med punkter 2*pi*k/N
hvor k = 0 til 65535.FT aldrig giver nogen information om tid. det giver bare frekvensinformation for signal.