Pemfilteran low pass pada sampel int pendek (PCM 16 bit)


9

Saya menulis perangkat lunak untuk memproses audio yang diberikan sebagai sampel PCM 16-bit. Tahap pertama pemrosesan melibatkan penghitungan energi (atau variasi total) dalam rentang frekuensi tertentu (di atas frekuensi cut-off tertentu).

Apa yang saya lakukan saat ini adalah mengurangi energi dari sinyal low-pass filtered dari energi sinyal asli. Saya menemukan bahwa banyak pemrosesan didedikasikan untuk mengubah sampel integer ke representasi floating point.

Jadi pertanyaan saya adalah, apakah ada teknik untuk memfilter sampel integer tanpa mengubahnya menjadi floating point?

Jawaban:


6

Ya tentu saja, Anda dapat menerapkan filter langsung ke sampel bilangan bulat, menggunakan aritmatika titik tetap .

Misalnya, jika Anda menggunakan filter FIR dengan koefisien [1/3, 1, 1/2], dan resolusi 8-bit untuk koefisien, output Anda akan:

out[n] = (85 * sample[n] + 256 * sample[n - 1] + 128 * sample[n - 2]) >> 8

Dua hal yang harus diperhatikan:

  • Koefisien kuantisasi mungkin menyebabkan sedikit perubahan respons filter, paling tidak menyebabkan ketidakstabilan filter. Apa jenis filter Anda dan nilai koefisiennya?

  • Overflow / Tipe data / Masalah pemotongan. Pada contoh di atas, out dapat melebihi kisaran integer 16-bit, jadi Anda harus melakukan beberapa kliping.


2
Saya pikir sampel [n - 1] harus dikalikan dengan 256; jika tidak, ia secara efektif diberi bobot oleh bukan . 12561
Jason R

Anda benar, diedit!
pichenettes

3
@pichenettes Mungkin baik untuk menjelaskan bagaimana Anda sampai pada nilai-nilai yang dikuantifikasi, ditandatangani vs. tidak ditandatangani, dll. Terserah Anda.
Jim Clay

3

Salah satu dari beberapa prosesor, mengonversi blok besar (tetapi dalam cache) bilangan bulat menjadi mengapung sebelum memprosesnya mungkin lebih cepat, karena penghapusan bahaya pipa. Anda mungkin ingin membandingkan ini.

Jika Anda menggunakan skala bilangan bulat atau aritmatika titik tetap, jumlah presisi bilangan bulat tambahan yang Anda perlukan dalam koefisien dan nilai tengah kira-kira sebanding dengan rasio antara laju sampel Anda dan frekuensi batas yang Anda inginkan. Anda mungkin perlu menggunakan aritmatika integer bilangan 24,32,48-bit atau lebih pada sampel 16-bit Anda untuk turun ke level tingkat kebisingan numerik yang diinginkan. Beberapa set instruksi prosesor (ARM, MIPS, dll.) Dapat mencakup 64 bit akumulasi aritmatika hanya untuk tujuan ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.