Jag försöker prova en sinusvåg och plotta dess frekvenskomponenter, men jag har problem med att implementera den Resultatet av att ta 65536 prover av en cykel av en sinusvåg med maximal amplitud 1 och en frekvens 100 kan ses nedan. Där Y-axeln är detta är storleken på den komplexa Fourier-summan, och x-axeln är provantalet .Hur kan jag se vilken frekvens sinusvågen har från denna plot ?, Jag skulle vilja ha en plot av freq vs Magnitude och inte sampla Number vs magnitude.

Jag förväntade mig en stor ökning av amplitud 1 eller två toppar med amplitud 0,5 vardera, men jag verkar få en stor amplitud, jag vet inte vad jag kan göra fel.

FFT av synd (2 * pi * f * t)

Matlab-kod:

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-implementeringar har ofta en vinst som är proportionell mot $ N $ eller $ \ sqrt {N} $. Ditt resultat är inte ' t orimligt.
  • Om du delar storleken med $ N $ får du två toppar med magnituder på cirka 0,425 vardera (vilket fortfarande är lägre än de förväntade 0,5 Hur ändrar jag x-axeln till frekvens från provnummer?

Svar

Det ser ut som att du får din frekvens i Hertz förvirrad med radianer / sek eftersom du har faktorn $ 2 \ pi $ under både din provtagningsperiod dt och din signal. Jag skrev om lite av din kod för att klargöra vad jag tror att du verkligen vill.

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)") 

Om din samplingsfrekvens är 65536 prover / sekund , och du vill till exempel ha en ton vid 12 KHz, du kan skapa den som visas. Så här är din provperiod 1/65536 sekunder.

Din förväntan att få två spikar med en amplitud på 0,5 var korrekt – bara din genererade ton var inte.

När det gäller att skala x-axeln till att vara i Hertz, skapa bara en vektor med samma antal poäng som ditt FFT-resultat och med ett linjärt steg från $ – fs / 2 $ till $ + fs / 2 $ . Observera också den fftshift jag använde i handlingen. Det beror på att utsignalen från Matlabs FFT-funktion går linjärt från 0 till fs. Jag tycker att det är lättare att visualisera att ha DC-centrerad men det går bra i båda fallen. Utan fftshift skulle faxen -vektorn gå från 0 till fs .

FFT för en 12 KHz-ton

Svar

Vissa FFT kräver att divideras med 1 / N för att representera storleken ”naturligt” (vilket inte är energibesparande ). För att märka X-axeln krävs kunskap om samplingsfrekvensen (Fs). Om känt, då f_x = bin_index * Fs / N, upp till N / 2, sedan speglas för negativa frekvenser. Om frekvensen för en spektral topp (din inmatade sinusvåg) inte är ”t exakt periodisk i FFT-längden (t.ex. ett heltal av cykler), då kommer storleken på det närmaste FFT-resultatfacket att vara mindre och du måste interpolera mellan soptunnorna för att hitta en närmare uppskattning till toppstorleken (paraboliska eller fönster-Sink-kärninterpolationer är vanliga).

Svar

För att lägga till vissa formler till hotpaw2:

Med FFT beräknar du en representation av din signal som

$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$

där $ f_k = \ frac {k} {N} f_s $ för $ k = 0,1, …, N / 2-1 $ och $ f_k = \ frac {kN} {N} f_s $ för $ k = N / 2, …, N-1 $, förutsatt att $ N $ är jämn.

Nu kräver FFT att proverna tas med samplingssteg $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $ och FFT för samplingsmatrisen $ (x_n) _n $ ger den skalade amplitudmatrisen $ (N \ hat x_k) _k $, eftersom $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Omskalningen i s vanligtvis utelämnade från FFT-implementationer som ska hanteras av användaren av FFT-biblioteket.

Svar

FFT tillhandahåller metod att beräkna DFT detta vet du redan. betrakta nu en signal x (n) och dess DFT X (k). om din signal består av N (65536 i ditt fall) sampel kommer X (k) att ge värden vid diskreta frekvenser på 2*pi*k/N. Faktum är att ovanstående DFT X (k) betyder X(2*pi*k/N). så om du hittar X (1) betyder det att du hittar DFT-koefficient vid diskret frekvens på 2 * pi * 1 / N och liknande, X (2) betyder koefficient för 2 * pi * 2 / N och därmed så vidare. Varje koefficient visar bidraget från den frekvensen i den signalen om den är stor, då betyder det att frekvensen utgör den största delen av signalen. så för att plotta fft med avseende på frekvens, ersätt samplingsaxeln med frekvensaxeln med punkter 2*pi*k/N där k = 0 till 65535.FT ger aldrig någon information angående tid. det ger bara frekvensinformation för signal.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *