Ho un file audio e sto iterando attraverso il file e prendendo 512 campioni ad ogni passaggio e quindi passandoli attraverso un FFT.Conversione di un FFT in uno spettogramma
Ho i dati fuori come un blocco 514 fluttua a lungo (utilizzando IPP ippsFFTFwd_RToCCS_32f_I) con componenti reali e immaginari interfogliati.
Il mio problema è che cosa faccio con questi numeri complessi una volta che li ho? Al momento sto facendo per ogni valore
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt((realValue * realValue) + (imagValue * imagValue));
Questo dà qualcosa di leggermente utilizzabile, ma io preferirei qualche modo di ottenere i valori nel range da 0 a 1. Il problema con lui è che sopra le cime finiscono per tornare come circa 9 o più. Ciò significa che le cose si saturano brutalmente e poi ci sono altre parti dello spettrogramma che si mostrano a malapena nonostante il fatto che sembrano essere piuttosto forti quando eseguo l'audio attraverso lo spettrogramma dell'audizione. Ammetto pienamente di non essere sicuro al 100% dei dati restituiti dalla FFT (oltre a rappresentare i valori di frequenza del blocco lungo 512 di esempio che sto passando). Soprattutto mi manca la comprensione di ciò che rappresenta esattamente il numero del compex.
Qualsiasi consiglio e aiuto sarebbe molto apprezzato!
Modifica: solo per chiarire. Il mio grosso problema è che i valori FFT restituiti non hanno senso senza una qualche idea di cosa sia la scala. Qualcuno può indicarmi di elaborare quella scala?
Edit2: ottengo veramente bello che cercano risultati facendo quanto segue:
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while(count2 < max2)
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f(sqrtf((realValue * realValue) + (imagValue * imagValue)) * rcpVerticalZoom) + 1.0f) * 0.5f;
buffer[count2 >> 1] = value;
count2 += 2;
}
Al mio occhio questo sembra ancora meglio rispetto alla maggior parte delle implementazioni spettrogramma ho guardato.
C'è qualcosa di MAIORNO che non va in quello che sto facendo?
Stai facendo la cosa giusta per ottenere la grandezza del numero complesso. Hai solo bisogno di scoprire la scala di questi numeri (complessi) (0-1, 0-255, ..?), Vedi i documenti della tua funzione FFT per quello.Se l'intervallo è troppo grande per i tuoi gusti, prendere un log() della magnitudine dovrebbe aiutare, come suggerito di seguito. – Wim
Probabilmente non è importante per il tuo utilizzo, ma potresti anche normalizzare i valori del dominio della frequenza (cioè i valori che ottieni dalla FFT) dividendoli per la larghezza FFT. (cioè più è ampia la FFT, maggiori saranno i valori nei vari intervalli di frequenza) –