Mendapatkan kenyaringan trek dengan RMS

15

Saya mencoba menghitung kenyaringan trek audio yang saya simpan di buffer. Buffer berisi data PCM dari sinyal dan saya ingin mendapatkan seberapa 'keras' itu dengan menggunakan Root Mean Squared. Saya berasumsi saya bisa melakukan ini dalam domain waktu daripada harus beralih ke domain frekuensi. Apa yang akan menjadi kode semu untuk melakukan ini?

Apakah saya akan mengambil sampel untuk satu detik saja (audio [0] - audio [44099], audio [44099] - audio [88199] dll.) Dan menghitung RMS dari nilai-nilai itu? Jadi, misalnya, apakah saya akan melakukan ini:

RM.S=audio[0]2+audio[1]2+audio[2]2.....audio[44099]244100

untuk setiap detik?

XSL
sumber
1
Ada tanda kurung yang hilang dalam ekspresi di atas - saya akan menambahkannya sendiri tetapi pengeditan harus setidaknya 6 karakter tampaknya ...
Paul R
3
@PaulR - Anda dapat menambahkan <!-- html comment -->untuk mengatasi pembatasan karakter dalam kasus yang jarang terjadi jika posting yang sempurna memiliki kesalahan kecil tapi sangat penting. Kebutuhan ini sangat jarang terjadi: biasanya ada lebih dari 6 karakter perbaikan yang harus dilakukan. Misalnya, ketika ada tanda kurung yang hilang, biasanya lebih baik menggunakan \sqrt{}dan \frac{}{}membangun di TeX.
Kevin Vermeer
1
@Kevin: terima kasih atas tipnya - Saya akan menggunakan saran komentar HTML Anda di masa depan.
Paul R
@ PaulR - Ini telah dibahas sebelumnya: Pembatasan disengaja, dirancang untuk mencegah pengeditan yang tidak lengkap atau tidak berguna (lihat pertahanan di sini ), tetapi memiliki lawan-lawannya (lihat diskusi di sini ).
Kevin Vermeer
4
Perhatikan bahwa RMS saja tidak memberi tahu Anda kenyaringan. Frekuensi yang sangat rendah atau tinggi terdengar dalam volume lebih rendah dari 3 kHz dari nilai RMS yang sama. Filter A-weighting akan memberi Anda estimasi yang lebih akurat. gist.github.com/148112
endolith

Jawaban:

12

Hal lain adalah bahwa nilai RMS tidak berkorelasi dengan baik dengan kenyaringan yang dirasakan. Anda mungkin ingin mempertimbangkan menyebutnya tingkat atau volume sebagai gantinya. Ada sesuatu yang disebut kontur kenyaringan yang setara yang menghitung seberapa sensitif telinga terhadap frekuensi tertentu dibandingkan dengan frekuensi lain, lihat artikel Wikipedia . Kurva ini bergantung pada level. Misalnya, telinga sangat sensitif terhadap nada 1kHz dibandingkan dengan nada 100Hz, seperti yang ditunjukkan dalam gambar ini (sumbu horizontal adalah frekuensi dalam Hz):

kontur kenyaringan yang sama

Salah satu hal relatif sederhana yang dapat Anda lakukan adalah memfilter data PCM Anda dengan kurva kenyaringan suara yang sama terbalik. Atau Anda dapat menerapkan pembobotan standar A, lihat artikel Filter Pembobotan Wikipedia . Kemudian Anda dapat menghitung nilai RMS dari output dari filter tertimbang kenyaringan suara yang sama.

niaren
sumber
Saya tidak jelas bagaimana cara beralih dari kode quesitoner ke ini. Contoh pertanyaan adalah menjumlahkan kuadrat dari sampel audio. Jawabannya adalah berbicara tentang menerapkan filter ke frekuensi sehingga sepertinya "filter data PCM Anda dengan kurva kenyaringan suara yang sama terbalik" tidak cukup. Pertama-tama Anda harus memiliki nilai untuk setiap frekuensi, lalu Anda bisa mencari cara menerapkan kurva yang tepat? Tapi itu langkah besar yang ditinggalkan.
GM
@ gman Idenya adalah untuk memproses audio dengan filter dan kemudian menggunakan hasilnya seperti dalam pertanyaan (perhitungan RMS). Saya tidak 100% yakin apa yang Anda maksud. Apakah Anda tidak yakin cara melakukan penyaringan atau mungkin desain filter?
niaren