Creazione di uno spettrogramma


10

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:

  1. Allocare una struttura FFT, cioè. kiss_fft_alloc(N,0,NULL,NULL) Dov'è Nla dimensione della finestra che sto usando. Il buffer di input sarà un array di Nelementi di tipo kiss_fft_scalar. Il buffer di output sarà un array di N/2 + 1elementi di tipo kiss_fft_cpx.
  2. Decodifica N(dimensione finestra) numero di campioni PCM.
  3. 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.
  4. Esegue il windowing (es. Hanning) sul buffer di input.
  5. 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().
  6. Per i N/2valori 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)
  7. Traccia i N/2valori dal passaggio 6.
  8. 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.
  9. Andare al passaggio 5, ripetendo questi passaggi fino a quando non vengono elaborati tutti i campioni.
  10. 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?

X

Grazie in anticipo per tutte le indicazioni che puoi fornire.

Risposte:


8

Mi sembra abbastanza buono. Nel passaggio 3, tuttavia, in realtà si desidera ridimensionare il segnale da -1 a 1, altrimenti si aggiunge DC. Hai menzionato la sottrazione della media: non consiglierei di farlo per uno spettrogramma, dal momento che filtra efficacemente la DC, che lo spettrogramma dovrebbe mostrare se è lì.

La scelta della dimensione di una finestra è tutta una questione di compromessi. Una finestra più grande offre una risoluzione della frequenza più nitida, ma una risoluzione del tempo più sfocata. Una finestra più corta ti darà il contrario: risoluzione del tempo più nitida ma risoluzione della frequenza più sfocata. La scelta appropriata delle dimensioni della finestra dipenderà dai dati che si sta tentando di analizzare. In genere sarà una potenza di 2 solo perché gli FFT tendono ad apprezzare le potenze di 2. Una regola empirica decente è che la tua finestra dovrebbe essere almeno all'incirca il doppio del periodo della frequenza più bassa che vorresti essere in grado di risolvere.

Potresti chiederti se è possibile affrontare meglio questo compromesso, e ci sono tecniche per questo: generalmente implicano il calcolo di spettrogrammi con diverse dimensioni FFT contemporaneamente e la loro combinazione. Ci sono alcune buone informazioni visive su questa pagina web: http://www.izotope.com/tech/aes_adapt/

Se la dimensione della finestra è troppo piccola, due frequenze molto vicine potrebbero essere indistinguibili l'una dall'altra poiché entrambe finiscono nello stesso cestino FFT. Se la dimensione della finestra è troppo grande, due eventi ravvicinati nel tempo potrebbero essere combinati o un transitorio acuto potrebbe trasformarsi in un attacco graduale. Dai un'occhiata a quella pagina web che ho pubblicato per alcuni modi per visualizzarlo.

Una finestra di dimensioni maggiori non riduce necessariamente il numero di FFT. Hai scelto di calcolare uno spettrogramma usando una trasformata di Fourier di breve durata in cui vi è una sovrapposizione della metà della dimensione FFT. Se lo desideri, potresti utilizzare un fattore di sovrapposizione più elevato. Scegliere una dimensione della finestra è molto più una questione di compromesso tempo / frequenza rispetto a quanti FFT devi calcolare. Nel progettare uno spettrogramma (o qualsiasi STFT), puoi pensare di scegliere la dimensione della finestra e la dimensione del luppolo , la distanza tra i blocchi, come parametri indipendenti.

Quando lo traccia, il tempo è in genere sull'asse x, la frequenza è sull'asse y (di solito una scala logaritmica, scala Mel, ecc. Piuttosto che una scala lineare), quindi le magnitudini sono rappresentate con intensità di colore, cioè i colori molto scuri corrispondono a piccole magnitudini e i colori molto luminosi corrispondono a grandi magnitudini.


Il tuo link sembra essere morto. Potresti aggiornarlo?
Daniel Wolf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.