Ho cercato di elaborare la logica per questo compito e ho in programma di utilizzare il pacchetto sorgente KissFFT per eseguire la trasformata di Fourier veloce. Per favore fatemi sapere se questo sembra giusto:
- Allocare una struttura FFT, cioè.
kiss_fft_alloc(N,0,NULL,NULL)
Dov'èN
la dimensione della finestra che sto usando. Il buffer di input sarà un array diN
elementi di tipokiss_fft_scalar
. Il buffer di output sarà un array diN/2 + 1
elementi di tipokiss_fft_cpx
. - Decodifica
N
(dimensione finestra) numero di campioni PCM. - Per ogni campione PCM, media l'ampiezza di ciascun canale (campioni non firmati) e scala da 0 a 2 (divisione per 65536,0), memorizzando il risultato nel buffer di input.
- Esegue il windowing (es. Hanning) sul buffer di input.
- Esegue una trasformata veloce di Fourier sul buffer di input, memorizzandola nel buffer di output. Dal momento che sto usando valori reali come input, posso usare
kiss_fftr()
. - Per i
N/2
valori di output, ottenere l'entità quadrata dei dati trasformati e convertire i valori nella scala dB con la seguente formula:10 * log10 (re * re + im * im)
- Traccia i
N/2
valori dal passaggio 6. - Eliminare la prima metà del buffer di input, decodificando i campioni PCM (dimensione finestra / 2) successivi ed eseguendo il ridimensionamento e il windowing ai dati. Ciò dovrebbe far scorrere efficacemente la finestra di input ed evitare di ripetere la matematica su campioni PCM elaborati.
- Andare al passaggio 5, ripetendo questi passaggi fino a quando non vengono elaborati tutti i campioni.
- Liberare la memoria utilizzata da
kiss_fft_alloc()
.
Mi è stato suggerito di sottrarre un valore dalla finestra di input prima di eseguire la FFT, in modo che il valore DC risultante abbia una grandezza di zero. Devo sottrarre la media o la media dai dati di input?
Inoltre, quali sono le cose che devo considerare quando scelgo una dimensione della finestra? Oltre a questo deve essere un numero pari secondo le istruzioni di KissFFT, c'è un vantaggio nell'uso di una finestra di piccole dimensioni, ad es. fornirà un grafico migliore? Suppongo che una finestra di grandi dimensioni riduca il numero di FFT da eseguire, è l'unico vantaggio dell'uso di una finestra di grandi dimensioni?
Grazie in anticipo per tutte le indicazioni che puoi fornire.