Sto provando a campionare unonda sinusoidale e tracciarne i componenti di frequenza, ma ho problemi a implementarla Il risultato del prelievo di 65536 campioni di un ciclo di unonda sinusoidale con ampiezza massima 1 e frequenza 100 può essere visto di seguito. Dove lasse Y è lampiezza della somma di Fourier complessa e lasse x è il numero del campione .Come posso vedere quale frequenza ha londa sinusoidale da questo grafico ?, Vorrei avere un grafico di freq vs grandezza e non campionare numero vs magnitudine.
Mi aspettavo un grande picco di ampiezza 1 o 2 picchi di ampiezza 0,5 ciascuno, ma mi sembra di ottenere una grande ampiezza, non so cosa potrei fare di sbagliato.
Codice 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);
Commenti
- Le implementazioni FFT spesso hanno un guadagno proporzionale a $ N $ o $ \ sqrt {N} $ in esse. Il risultato non è ' t irragionevole.
- Dividendo la grandezza per $ N $ si ottengono due picchi con magnitudo di circa 0,425 ciascuno (che è comunque inferiore allo 0,5 previsto ). Come faccio a modificare lasse x in frequenza dal numero di campione?
Risposta
Sembra come te “stai confondendo la tua frequenza in Hertz con in radianti / sec poiché hai il fattore di $ 2 \ pi $ in entrambi i periodi di campionamento dt e il tuo segnale. Ho riscritto un po del tuo codice per chiarire cosa penso tu voglia veramente.
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)")
Se la tua frequenza di campionamento è 65536 campioni / secondo , e se ad esempio vuoi un tono a 12 KHz, puoi crearlo come mostrato. Quindi qui il tuo periodo di campionamento è 1/65536 secondi.
La tua aspettativa di ottenere due picchi con unampiezza di 0,5 ciascuno era corretto – solo il tono generato non lo era.
Per quanto riguarda il ridimensionamento dellasse x in Hertz, crea un vettore con lo stesso numero di punti del risultato FFT e con un incremento lineare da $ – fs / 2 $ a $ + fs / 2 $ . Nota anche il fftshift che ho usato nella trama. Questo perché loutput della funzione FFT di Matlab va linearmente da 0 a fs. Trovo più facile visualizzare la DC centrata, ma in entrambi i casi va bene. Senza fftshift il vettore faxis andrebbe da 0 a fs .
Risposta
Alcune FFT richiedono la divisione per 1 / N per rappresentare la grandezza “naturalmente” (che non preserva ). Per etichettare lasse X è necessario conoscere la frequenza di campionamento (Fs). Se noto, f_x = bin_index * Fs / N, fino a N / 2, quindi replicato per frequenze negative. Se la frequenza di un picco spettrale (londa sinusoidale in ingresso) non è “t esattamente periodica nella lunghezza FFT (ad es. Un numero intero di cicli), quindi la grandezza del bin dei risultati FFT più vicino sarà più piccola e sarà necessario interpolare tra i bin per trovare una stima più vicina alla magnitudo del picco (le interpolazioni del kernel Sinc paraboliche o con finestre sono comuni).
Risposta
Per aggiungere alcune formule alla risposta di hotpaw2:
Con la FFT si calcola una rappresentazione del segnale come
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
dove $ f_k = \ frac {k} {N} f_s $ per $ k = 0,1, …, N / 2-1 $ e $ f_k = \ frac {kN} {N} f_s $ per $ k = N / 2, …, N-1 $, assumendo $ N $ pari.
Ora la FFT richiede che i campioni vengano presi con il passo di campionamento $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, e la FFT dellarray campione $ (x_n) _n $ fornisce larray di ampiezza scalato $ (N \ hat x_k) _k $, poiché $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Il riscalaggio i Di solito le implementazioni FFT vengono escluse dallutente della libreria FFT.
Risposta
FFT fornisce il metodo di calcolo DFT questo lo sai già. si consideri ora un segnale x (n) e il suo DFT X (k). se il segnale è costituito da N (65536 nel tuo caso) campioni, X (k) fornirà valori a frequenze discrete di 2*pi*k/N
. In effetti, la DFT X (k) sopra significa X(2*pi*k/N)
. quindi se stai trovando X (1), significa che stai trovando il coefficiente DFT alla frequenza discreta di 2 * pi * 1 / N e simile, X (2) significa coefficiente per 2 * pi * 2 / N e quindi così via. Ogni coefficiente mostra il contributo di quella frequenza in quel segnale se è grande, significa che la frequenza costituisce la parte principale del segnale. quindi, per tracciare fft rispetto alla frequenza, sostituire lasse campione con lasse della frequenza avente punti 2*pi*k/N
dove k = da 0 a 65535.FT non fornisce mai alcuna informazione sul tempo. Fornisce solo informazioni sulla frequenza del segnale.