Frekuensi yang lebih rendah lebih kuat di FFT?

15

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.

  1. Saya memotong data menjadi bingkai 24576 byte (4096 * 6).
  2. Terapkan jendela Hamming: input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. Jalankan melalui FFTW Process1D().
  4. Konversi dari bilangan kompleks: output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
  5. Rata-rata 6 nilai untuk mendapatkan FFT lengkap 4096 byte.
  6. 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.

FFT

Tedd Hansen
sumber
Silakan coba jendela Hamming yang benar terlebih dahulu untuk melihat apakah fragmen jendela yang rusak adalah penyebab kebisingan frekuensi rendah ini.
hotpaw2
@Tedd Hansen, bagaimana Anda akhirnya "mengidentifikasi 5 frekuensi teratas tanpa frekuensi lebih rendah" - top 5 dari band 1/3 oktaf berbobot ??
denis

Jawaban:

12

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.

Hilmar
sumber
Pernyataan bahwa "sinyal audio alami memiliki spektrum seperti merah muda", mengabaikan pertimbangan skala waktu. Selama waktu yang lama (~ 10 detik) saya setuju, dan tentu saja selama beberapa menit pernyataan itu cenderung benar. Tetapi spektrum di sini dihitung lebih dari 0,55 detik. Jika inputnya misalnya, musik, saya harapkan struktur nada yang lebih banyak.
mtrw
2
"nada suara" lebih memengaruhi struktur spektrum. Bentuk keseluruhan (dalam hal energi per oktaf) masih akan sebagian besar berwarna merah muda untuk musik kecuali itu sesuatu seperti "solo untuk segitiga dan crash cymbal"
Hilmar
1
@ mtrw: Gelombang persegi tentu nada, tetapi harmonik frekuensi tinggi masih jatuh pada tingkat 1 / f.
endolith
8

Pada langkah 2, rumusnya harus input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));, di mana Njumlah sampel dalam buffer, dalam kasus Anda 24576.

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 adalah 5, 10*log10(5) ~= 6.99. Rata-rata 10*log10(4)dan 10*log10(6)sedang 6.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.

mtrw
sumber
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]4610catatan10(5)(10catatan10(4)+10catatan10(6))/2
Dalam penjelasan Anda di atas, saya yakin Anda menginginkan lebar jendela (N) 4096, karena ini adalah lebar FFT yang sedang diterapkan. Jendela ini perlu diterapkan pada 4096 sampel yang diubah sebelum setiap fft.
Jacob
@ Jacob - OP sedang menghitung FFT dari 6 * 4096 poin, kemudian rata-rata 6 nampan yang berdekatan untuk mengurangi ke 4096 poin.
mtrw
5

Kebisingan terjadi pada banyak sistem fisik, biologi dan ekonomi. Beberapa peneliti menggambarkannya sebagai mana-mana.

suara merah muda dan putih

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)

Alexey Frunze
sumber
6
Suara di sebelah kiri jelas merah jambu tapi suara di sebelah kanan agak oranye :-)
Meskipun benar bahwa noise 1 / f ada di mana-mana, front end analog yang dirancang dengan baik untuk audio umumnya memiliki tingkat noise 1 / f yang rendah di atas, katakanlah 10 Hz. Kebisingan putih mendominasi di band-band yang menarik.
mtrw
4

Apakah ini yang diharapkan? Mengapa?

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.

Adakah cara standar untuk memperbaikinya? Hampir terlihat seperti matematika. Sihir () dapat mengangkatnya ke tempat semula.

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.

Guy Sirton
sumber
Fungsi windowing seharusnya tidak mempengaruhi respon frekuensi, bukan?
endolith
@endolith: Itu- Anda mengalikan data Anda dengan fungsi windowing dan fungsi gabungan memiliki respons yang berbeda. Baca artikel Wikipedia yang ditautkan yang membahas hal ini secara lebih mendalam. Realitas berurusan dengan sampel dunia nyata adalah bahwa biasanya ada beberapa jendela (misalnya persegi panjang) dan Anda hanya dapat memperkirakan respons frekuensi dari sinyal sumber (tak terbatas) karena itu.
Guy Sirton
Mungkin kita memikirkan "respons frekuensi" secara berbeda. Jika sinyal diam, dan Anda menerapkan fungsi jendela, spektrum seharusnya memiliki amplitudo yang sama pada frekuensi yang sama, tidak peduli apa fungsi jendela yang Anda gunakan, berbeda hanya dengan faktor skala yang mempengaruhi semua frekuensi secara sama. Lebar setiap lonjakan frekuensi akan berbeda, tetapi ketinggian paku akan relatif sama satu sama lain. Fungsi windowing tidak bertindak seperti filter yang melemahkan beberapa frekuensi lebih dari yang lain.
endolith
@endolith: Bayangkan gelombang sinus tanpa batas, sekarang kalikan dengan jendela cos ^ 2. Anda masih memiliki komponen pada frekuensi asli tetapi amplitudo akan "mati" dan Anda akan memiliki komponen frekuensi baru yang berasal dari jendela. Lihat paragraf pertama di sini: en.wikipedia.org/wiki/Spectral_leakage
Guy Sirton
Ya, tetapi amplitudo "tidak aktif" akan tetap sama, tidak peduli berapakah frekuensi gelombang sinus yang tak terbatas, bukan?
endolith