Ik probeer een sinusgolf te bemonsteren en de frequentiecomponenten ervan uit te zetten, maar ik heb problemen met het implementeren ervan Het resultaat van het nemen van 65536 samples van één cyclus van een sinusgolf met maximale amplitude 1 en een frequentie 100 is hieronder te zien. Waar de Y-as de grootte is van de complexe Fourier-som en de x-as het monsternummer .Hoe kan ik zien welke frequentie de sinusgolf heeft van deze grafiek ?, ik zou graag een grafiek willen hebben van freq versus magnitude en niet van voorbeeldgetal versus magnitude.
Ik verwachtte een grote piek van amplitude 1 of 2 pieken met amplitude 0,5 elk, maar ik krijg blijkbaar een grote amplitude, ik weet niet wat ik fout zou kunnen doen.
Matlab-code:
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);
Reacties
- FFT-implementaties hebben vaak een winst die evenredig is met $ N $ of $ \ sqrt {N} $. Uw resultaat is niet ' t onredelijk.
- Het delen van de magnitude door $ N $ geeft twee pieken met magnitudes van elk ongeveer 0,425 (wat nog steeds lager is dan de verwachte 0,5 Hoe verander ik de x-as naar frequentie van het voorbeeldnummer?
Antwoord
Het ziet er alsof je je frequentie in Hertz verward krijgt met in radialen / sec, aangezien je de factor $ 2 \ pi $ hebt in je steekproefperiode dt en je signaal. Ik heb een stukje van je code herschreven om te verduidelijken wat ik denk dat je echt wilt.
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)")
Als je samplefrequentie 65536 samples / seconde is , en je wilt bijvoorbeeld een toon op 12 KHz, dan kun je die creëren zoals getoond. Dus hier is je sampleperiode 1/65536 seconden.
Je verwachting om twee pieken te krijgen met elk een amplitude van 0,5 was correct – alleen je gegenereerde toon was dat niet.
Wat betreft het schalen van de x-as naar Hertz, maak gewoon een vector met hetzelfde aantal punten als uw FFT-resultaat en met een lineaire toename van $ – fs / 2 $ tot $ + fs / 2 $ . Let ook op de fftshift die ik in de plot heb gebruikt. Dat komt doordat de output van Matlabs FFT-functie lineair gaat van 0 naar fs. Ik vind het gemakkelijker om te visualiseren dat DC gecentreerd is, maar hoe dan ook, het is prima. Zonder de fftshift zou de faxis -vector van 0 naar fs gaan.
Answer
Sommige FFTs moeten gedeeld worden door 1 / N om de magnitude “natuurlijk” weer te geven (wat niet energiebesparend is ). Om de X-as te labelen, moet u de bemonsteringssnelheid (Fs) kennen. Indien bekend, dan f_x = bin_index * Fs / N, tot N / 2, dan gespiegeld voor negatieve frequenties. Als de frequentie van een spectrale piek (uw invoersinusgolf) niet “t exact periodiek is in de FFT-lengte (bijv. Een geheel getal aantal cycli), dan zal de grootte van de dichtstbijzijnde FFT-resultatenbak kleiner zijn, en moet u tussen de bakken interpoleren om een betere schatting van de piekgrootte te vinden (parabolische of windowed-Sinc-kernelinterpolaties zijn gebruikelijk).
Answer
Om enkele formules toe te voegen aan het antwoord van hotpaw2:
Met de FFT berekent u een weergave van uw signaal als
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
waarbij $ f_k = \ frac {k} {N} f_s $ voor $ k = 0,1, …, N / 2-1 $ en $ f_k = \ frac {kN} {N} f_s $ voor $ k = N / 2, …, N-1 $, uitgaande van $ N $ even.
Nu vereist de FFT dat de monsters worden genomen met bemonsteringsstap $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, en de FFT van de sample-array $ (x_n) _n $ geeft de geschaalde amplitude-array $ (N \ hat x_k) _k $, aangezien $ \ sum_ {k = 0} ^ {N-1} 1 = N $. De herschaling i s meestal weggelaten uit de FFT-implementaties die door de gebruiker van de FFT-bibliotheek moeten worden afgehandeld.
Antwoord
FFT biedt methode van het berekenen van DFT dit weet je al. Beschouw nu een signaal x (n) en zijn DFT X (k). als uw signaal bestaat uit N (65536 in uw geval) samples, dan geeft X (k) waarden op discrete frequenties van 2*pi*k/N
. In feite betekent de bovenstaande DFT X (k) X(2*pi*k/N)
. dus als u X (1) vindt, betekent dit dat u de DFT-coëfficiënt vindt met een discrete frequentie van 2 * pi * 1 / N en vergelijkbaar, X (2) betekent een coëfficiënt voor 2 * pi * 2 / N enzovoort. Elke coëfficiënt toont de bijdrage van die frequentie in dat signaal als deze groot is, betekent dit dat de frequentie het grootste deel van het signaal uitmaakt. dus voor het plotten van fft met betrekking tot frequentie vervangt u de monsteras door de frequentie-as met punten 2*pi*k/N
waar k = 0 tot 65535.FT nooit enige informatie over de tijd geeft. het geeft alleen frequentie-informatie van de signaal.