Saya menghitung FFT dari input mikrofon. Saya perhatikan bahwa frekuensi yang lebih rendah tampaknya selalu memiliki kekuatan lebih (dB lebih tinggi) daripada frekuensi yang lebih tinggi.
- Saya memotong data menjadi bingkai 24576 byte (4096 * 6).
- Terapkan jendela Hamming:
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
- Jalankan melalui FFTW
Process1D()
. - Konversi dari bilangan kompleks:
output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
- Rata-rata 6 nilai untuk mendapatkan FFT lengkap 4096 byte.
- Lukis gambar cantik (warna dipetakan ke palet).
Rata-rata (hal 5) dilakukan untuk menurunkan noise FFT.
Saat gambar menunjukkan baik dengan suara maupun dengan mikrofon mati, ada lebih banyak energi (dan lebih banyak suara) dalam frekuensi yang lebih rendah. Ini menunjukkan lebih dari sekedar masalah mik / sub.
Pertanyaan saya:
1. Apakah ini diharapkan? Mengapa?
2. Adakah cara standar untuk memperbaikinya? Hampir terlihat seperti matematika. Sihir () dapat mengangkatnya ke tempatnya.
Tujuan saya adalah untuk dapat mengidentifikasi 5 frekuensi teratas tanpa frekuensi yang lebih rendah menang secara default.
Jawaban:
Ya, ini sangat diharapkan. Apa yang Anda lihat adalah spektrum " merah muda ", yaitu energi konstan per bandwidth relatif, dibandingkan dengan " putih " yang merupakan energi konstan per bandwidth absolut. Untuk sinyal merah muda, energi antara 1-2kHz sama dengan 2-4kHz (masing-masing mewakili dua kali lipat bandwidth atau "oktaf".
Sebagian besar sinyal audio alami (Pidato, musik, film, dll.) Memiliki spektrum seperti merah muda. Juga sebagian besar suara latar akustik (noise mikrofon, noise HVAC, fluktuasi tekanan udara, latar belakang generik) cenderung berwarna merah muda atau bahkan lebih condong ke arah frekuensi yang lebih rendah.
Sistem pendengaran manusia bekerja seperti itu juga. Di telinga bagian dalam, sinyal audio dipecah menjadi pita bandwidth relatif konstan (disebut "Pita Kritis") yang kira-kira sama dengan spektrum oktaf ketiga.
Cara terbaik untuk melihat data spektrum audio adalah memplotnya pada skala frekuensi logaritmik.
sumber
Pada langkah 2, rumusnya harus
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));
, di manaN
jumlah sampel dalam buffer, dalam kasus Anda24576
.Pada langkah 4 & 5, saya akan melakukan rata-rata bin-wise pada nilai besaran kuadrat, bukan nilai dB. Katakanlah Anda memiliki besaran kuadrat
[4,6]
. Rata-rata mereka adalah5
,10*log10(5) ~= 6.99
. Rata-rata10*log10(4)
dan10*log10(6)
sedang6.90
.Masalah pertama mungkin adalah penyebab bias terhadap frekuensi rendah, karena akan menyebabkan kebocoran spektral, dan frekuensi rendah akan mendapatkan lebih banyak kontaminasi dari jalur DC (yang pasti merupakan estimasi yang buruk). Masalah kedua mungkin tidak akan membuat perbedaan pada frekuensi rendah, tapi saya pikir semakin dekat dengan maksud pengukuran Anda.
sumber
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]
Kebisingan terjadi pada banyak sistem fisik, biologi dan ekonomi. Beberapa peneliti menggambarkannya sebagai mana-mana.
Pink noise (kiri) dan white noise (kanan) pada spektrogram FFT dengan sumbu vertikal frekuensi linear (pada audio khas atau penganalisa spektrum serupa, noise pink akan datar, tidak miring ke bawah, dan white noise meningkat)
sumber
Banyak suara alami memiliki harmonik , sehingga akan ada frekuensi dasar yang lebih rendah dan lebih sedikit energi dalam kelipatan fundamental yang lebih tinggi. Mungkin ada bias DC yang berarti banyak energi di paling kiri. Pengaruh lain adalah fungsi windowing Anda yang mendistorsi respons frekuensi.
Anda dapat menangani bias DC dengan menggunakan filter high-pass. Implementasi sederhana adalah dengan mengurangi rata-rata jangka panjang dari setiap sampel (EDIT: atau bahkan lebih sederhana, buang frekuensi yang lebih rendah, misalnya <50Hz dari hasil FFT Anda). Anda juga dapat bereksperimen dengan berbagai fungsi jendela. pastikan (seperti yang ditunjukkan @mtrw) bahwa Anda menerapkan jendela dengan benar. Non-linearitas lain dalam respons dapat dikoreksi dengan mengukur beberapa input ideal dan menormalkan kurva tersebut.
sumber