Frequenze più basse più forti in FFT?


15

Sto calcolando FFT dall'ingresso del microfono. Ho notato che le frequenze più basse sembrano sempre avere più potenza (dB più alti) rispetto alle frequenze più alte.

  1. Ho tagliato i dati in frame di 24576 byte (4096 * 6).
  2. Applica la finestra di Hamming: input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. Esegui tramite FFTW Process1D().
  4. Converti da numeri complessi: output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
  5. Media di 6 valori per ottenere una FFT completa di 4096 byte.
  6. Dipingi un'immagine carina (colori associati a una tavolozza).

La media (punto 5) viene eseguita per ridurre il rumore FFT.

Come l'immagine mostra sia con l'audio sia con il microfono spento c'è più energia (e più rumore) nelle frequenze più basse. Questo indica che non è solo un problema mic / sub.

Le mie domande:
1. È previsto? Perché?
2. Qualche modo standard per risolvere questo problema? Sembra quasi che un po 'di magia Math.Tan () possa sollevarlo dove appartiene.

Il mio obiettivo è essere in grado di identificare le prime 5 frequenze senza che le frequenze più basse vincano per impostazione predefinita.

FFT


Prova prima la finestra di Hamming corretta per vedere se un frammento di finestra rotto è ciò che causa questo rumore a bassa frequenza.
hotpaw2,

@Tedd Hansen, come sei arrivato a "identificare le prime 5 frequenze senza frequenze più basse" - le prime 5 da bande ponderate di 1/3 d'ottava ??
denis,

Risposte:


12

Sì, è molto atteso. Quello che vedi è un " rosa spettro ", cioè energia costante per larghezza di banda relativa, rispetto a " bianco " che è energia costante per larghezza di banda assoluta. Per i segnali rosa l'energia tra 1-2kHz è la stessa di 2-4kHz (ognuno rappresenta un raddoppio della larghezza di banda o una "ottava".

La maggior parte dei segnali audio naturali (voce, musica, film, ecc.) Ha uno spettro rosa. Inoltre, la maggior parte dei rumori di fondo acustici (rumore del microfono, rumore HVAC, fluttuazioni della pressione dell'aria, sfondo generico) tendono ad essere rosa o ancor più inclinati verso le frequenze più basse.

Anche i sistemi uditivi umani funzionano in questo modo. Nell'orecchio interno i segnali audio sono suddivisi in bande di larghezza di banda relativa costante (chiamate "bande critiche") che sono all'incirca le stesse di uno spettro di terza ottava.

Il modo migliore per guardare i dati dello spettro audio è di tracciarli su una scala di frequenza logaritmica.


L'affermazione secondo cui "i segnali audio naturali hanno uno spettro rosa" non tiene conto della scala temporale. Per molto tempo (~ 10 secondi) sono d'accordo, e certamente per diversi minuti questa affermazione tende ad essere vera. Ma gli spettri qui sono calcolati su 0,55 sec. Se l'input è, ad esempio, la musica, mi aspetterei una struttura molto più tonale.
MTRW

2
la "tonalità" influisce maggiormente sulla struttura fine dello spettro. La forma complessiva (in termini di energia per ottava) sarà ancora prevalentemente rosa per la musica a meno che non sia qualcosa come "solo per triangolo e piatto crash"
Hilmar,

1
@mtrw: Un'onda quadra è certamente un tono, ma le armoniche ad alta frequenza continuano a cadere ad una frequenza 1 / f.
endolith,

8

Nel passaggio 2, la formula dovrebbe essere input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));, dov'è Nil numero di campioni nel buffer, nel tuo caso 24576.

Nei passaggi 4 e 5, farei la media bin-wise sui valori di grandezza quadrata, non sui valori dB. Di 'che hai le magnitudini al quadrato [4,6]. La loro media è 5, 10*log10(5) ~= 6.99. La media di 10*log10(4)ed 10*log10(6)è 6.90.

Il primo problema potrebbe essere la causa del bias verso le basse frequenze, in quanto causerà perdite spettrali e le basse frequenze otterranno più contaminazione dalla linea DC (che è inevitabilmente una stima scadente). Il secondo problema probabilmente non farà alcuna differenza sulle basse frequenze, ma penso che si avvicini all'intento della tua misurazione.


fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]4610log10(5)(10log10(4)+10log10(6))/2

Nella tua spiegazione sopra, credo che tu voglia una larghezza della finestra (N) di 4096, poiché questa è la larghezza della FFT applicata. Questa finestra dovrebbe essere applicata ai 4096 campioni trasformati prima di ogni fft.
Jacob,

@Jacob - l'OP sta calcolando la FFT di 6 * 4096 punti, quindi una media di 6 bin adiacenti per ridurre fino a 4096 punti.
fino al

5

Il rumore 1 / f si verifica in molti sistemi fisici, biologici ed economici. Alcuni ricercatori lo descrivono come onnipresente.

rumori rosa e bianchi

Rumore rosa (a sinistra) e rumore bianco (a destra) su uno spettrogramma FFT con asse verticale a frequenza lineare (su un tipico analizzatore di spettro audio o simile il rumore rosa sarebbe piatto, non inclinato verso il basso e il rumore bianco in aumento)


6
Il rumore a sinistra è decisamente rosa ma quello a destra sembra un po 'arancione :-)

Mentre è vero che il rumore 1 / f è onnipresente, un front-end analogico ben progettato per l'audio generalmente ha bassi livelli di rumore 1 / f sopra, diciamo 10 Hz. Il rumore bianco domina nelle bande di interesse.
mtrw

4

È previsto? Perché?

Molti suoni naturali hanno armoniche , quindi ci saranno frequenze fondamentali più basse e quindi meno energia nei multipli più alti del fondamentale. Potrebbe esserci un bias DC che significherebbe molta energia all'estrema sinistra. Un'altra influenza è la funzione di windowing che distorce la risposta in frequenza.

Qualche modo standard per risolvere questo problema? Sembra quasi che un po 'di magia Math.Tan () possa sollevarlo dove appartiene.

È possibile gestire il bias DC utilizzando un filtro passa-alto. Una semplice implementazione consiste nel sottrarre la media a lungo termine da ogni campione (EDIT: o anche più semplice, scartare le frequenze più basse, ad es. <50Hz dal risultato FFT). Puoi anche sperimentare diverse funzioni della finestra. assicurati (come sottolinea @mtrw) di applicare correttamente la finestra. Qualsiasi altra non linearità nella risposta può essere corretta misurando alcuni input ideali e normalizzando a quella curva.


La funzione di windowing non dovrebbe influire sulla risposta in frequenza, vero?
endolith,

@endolith: moltiplica i tuoi dati per la funzione di windowing e la funzione combinata ha una risposta diversa. Leggi l'articolo di Wikipedia collegato che ne discute in modo più approfondito. La realtà della gestione dei campioni del mondo reale è che di solito c'è qualche finestra (ad esempio un rettangolo) e per questo puoi solo approssimare la risposta in frequenza del segnale sorgente (infinito).
Guy Sirton,

Forse stiamo pensando alla "risposta in frequenza" in modo diverso. Se un segnale è stazionario e si applica una funzione finestra ad esso, lo spettro dovrebbe avere le stesse ampiezze alle stesse frequenze, indipendentemente dalla funzione finestra utilizzata, differendo solo per un fattore di scala che influenza tutte le frequenze allo stesso modo. La larghezza di ciascun picco di frequenza sarà diversa, ma l'altezza dei picchi sarà la stessa l'una rispetto all'altra. La funzione di windowing non si comporta come un filtro che attenua alcune frequenze più di altre.
endolith

@endolith: immagina un'onda sinusoidale infinita, ora moltiplicata per una finestra cos ^ 2. Avrai comunque un componente alla frequenza originale ma la sua ampiezza sarà "off" e avrai nuovi componenti di frequenza provenienti dalla finestra. Vedi il primo paragrafo qui: en.wikipedia.org/wiki/Spectral_leakage
Guy Sirton

Sì, ma l'ampiezza "off" sarà la stessa, indipendentemente dalla frequenza dell'onda sinusoidale infinita, no?
endolith
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.