Sampling Audio

Dimulai dari Android 5.0 (Lollipop), resampler audio kini sepenuhnya didasarkan pada filter FIR yang berasal dari fungsi Kaiser windowed-sinc. Kaiser windowed-sinc menawarkan properti berikut:

  • Penghitungan parameter desain yang mudah (riak stopband, bandwidth transisi, frekuensi cutoff, panjang filter).
  • Cukup optimal untuk mengurangi energi stopband dibandingkan energi keseluruhan.

Lihat P.P. Vaidyanathan, Multirate Systems and Filter Banks, hal. 50 untuk diskusi tentang Kaiser Window dan optimalitas serta hubungannya dengan Prolate Spheroidal Windows.

Parameter desain otomatis dihitung berdasarkan penentuan kualitas internal dan rasio sampel yang diinginkan. Berdasarkan parameter desain, filter windowed-sinc akan dihasilkan. Untuk penggunaan musik, resampler untuk 44,1 hingga 48 kHz dan sebaliknya dihasilkan pada kualitas yang lebih tinggi daripada konversi frekuensi arbitrer.

Resampler audio memberikan kualitas yang lebih baik, serta kecepatan untuk mencapai kualitas tersebut. Namun, resampler dapat menimbulkan sejumlah kecil riak passband dan derau harmonis aliasing, dan dapat menyebabkan banyak kehilangan frekuensi tinggi dalam band transisi. Karena itu, hindari penggunaannya jika tidak perlu.

Praktik Terbaik untuk Sampling dan Resampling

Bagian ini menjelaskan beberapa praktik terbaik untuk membantu Anda menghindari masalah frekuensi pengambilan sampel.

Pilih frekuensi pengambilan sampel yang pas dengan perangkat

Secara umum, yang terbaik adalah memilih frekuensi pengambilan sampel yang pas dengan perangkat, biasanya 44,1 kHz atau 48 kHz. Penggunaan frekuensi sampel di atas 48 kHz biasanya akan mengakibatkan penurunan kualitas karena resampler harus digunakan untuk memutar file tersebut.

Gunakan rasio resampling sederhana (polifase tetap vs terinterpolasi)

Resampler beroperasi dalam salah satu mode berikut:

  • Mode polifase tetap. Koefisien filter untuk setiap polifase telah dihitung sebelumnya.
  • Mode polifase terinterpolasi. Koefisien filter untuk setiap polifase harus diinterpolasikan dari dua polifase terdekat yang sudah dihitung sebelumnya.

Resampler beroperasi paling cepat dalam mode polifase tetap, saat rasio frekuensi input terhadap frekuensi output L/M (dengan mengeluarkan pembagi sekutu terbesar) memiliki M kurang dari 256. Misalnya, untuk konversi 44.100 ke 48.000, L = 147. M = 160,

Dalam mode polifase tetap, frekuensi pengambilan sampel dikunci dan tidak berubah. Dalam mode polifase terinterpolasi, frekuensi pengambilan sampel berupa perkiraan. Saat memutar audio pada perangkat 48 kHz, drift frekuensi pengambilan sampel umumnya satu sampel selama beberapa jam. Biasanya hal ini bukan masalah, karena error perkiraan jauh lebih kecil daripada error frekuensi yang dihasilkan oleh oskilator quartz internal, drift termal, atau jitter (biasanya puluhan ppm).

Pilih frekuensi pengambilan sampel rasio sederhana seperti 24 kHz (1:2) dan 32 kHz (2:3) saat memutar audio pada perangkat 48 kHz, meskipun rasio dan frekuensi pengambilan sampel lainnya mungkin diizinkan melalui AudioTrack.

Gunakan upsampling, bukan downsampling, saat mengubah frekuensi sampel

Frekuensi pengambilan sampel dapat diubah saat proses berjalan. Perincian perubahan tersebut didasarkan pada buffering internal (biasanya beberapa ratus sampel), bukan berdasarkan tiap-tiap sampel. Ini dapat digunakan untuk efek.

Jangan mengubah frekuensi pengambilan sampel secara dinamis saat melakukan downsampling (pengurangan sampel). Saat mengubah frekuensi pengambilan sampel setelah trek audio dibuat, perbedaan sekitar 5 hingga 10 persen dari frekuensi asli dapat memicu penghitungan ulang filter saat downsampling (untuk menekan aliasing dengan tepat). Tindakan ini dapat menghabiskan resource komputasi dan dapat menyebabkan bunyi klik yang terdengar jelas saat filter diganti secara real time.

Batasi downsampling hingga tidak lebih dari 6:1

Downsampling biasanya dipicu oleh persyaratan hardware. Jika menggunakan konverter Frekuensi Sampel untuk downsampling, coba batasi rasio downsampling hingga tidak lebih dari 6:1 agar penyembunyian aliasing bagus (misalnya, downsampling tidak lebih dari 48.000 hingga 8.000). Panjang filter disesuaikan agar cocok dengan rasio downsampling, tetapi Anda akan mengorbankan lebih banyak bandwidth transisi pada rasio downsampling yang lebih tinggi untuk menghindari peningkatan panjang filter yang berlebihan. Persoalan aliasing serupa tidak terjadi untuk upsampling (penambahan sampel). Perlu diperhatikan, beberapa bagian pipeline audio mungkin menghalangi downsampling di atas 2:1.

Jika Anda khawatir dengan latensi, jangan lakukan resampling

Resampling mencegah track ditempatkan di jalur FastMixer, yang berarti latensi yang jauh lebih tinggi akan terjadi karena buffer tambahan yang lebih besar di jalur Mixer biasanya. Selain itu, ada penundaan implisit dari panjang filter resampler, walaupun biasanya hanya sekitar satu milidetik atau kurang, yang tidak sebesar buffering tambahan untuk jalur Mixer biasa (umumnya 20 milidetik).

Menggunakan audio floating point

Penggunaan bilangan floating point untuk menyatakan data audio dapat menambah kualitas audio secara signifikan pada aplikasi audio berperforma tinggi. Floating point menawarkan kelebihan berikut:

  • Rentang dinamis lebih lebar.
  • Akurasi yang konsisten di seluruh rentang dinamis.
  • Headroom lebih besar untuk mencegah clipping (penyesuaian nilai) selama penghitungan antara dan sementara.

Walaupun titik-mengambang dapat meningkatkan kualitas audio, terdapat beberapa kekurangan tertentu:

  • Bilangan floating point menggunakan memori lebih banyak.
  • Operasi floating point menggunakan properti yang tidak terduga, misalnya, penambahan yang bersifat tidak asosiatif.
  • Penghitungan floating point terkadang dapat kehilangan presisi aritmetika akibat pembulatan atau algoritme yang secara numerik tidak stabil.
  • Diperlukan pemahaman yang mendalam untuk menggunakan floating point secara efektif guna mendapatkan hasil yang akurat dan dapat diproduksi kembali.

Sebelumnya, floating point dikenal tidak baik karena tidak dapat digunakan atau lambat. Hal ini tetap terjadi pada prosesor kelas bawah dan prosesor sematan. Namun, prosesor di perangkat seluler modern kini memiliki floating point hardware dengan performa yang serupa (atau dalam beberapa kasus bahkan lebih cepat) daripada bilangan bulat. CPU modern juga mendukung SIMD (Single instruction, multiple data), yang dapat meningkatkan performa lebih lanjut.

Praktik Terbaik untuk Audio Floating Point

Praktik terbaik berikut akan membantu Anda menghindari masalah pada penghitungan floating point:

  • Gunakan floating point presisi ganda untuk penghitungan yang jarang, misalnya menghitung koefisien filter.
  • Perhatikan urutan operasi.
  • Deklarasikan variabel eksplisit untuk nilai antara.
  • Gunakan tanda kurung dengan bebas.
  • Jika Anda mendapatkan hasil NaN atau tidak terbatas, gunakan pencarian biner untuk menemukan lokasi kemunculannya.

Untuk audio floating point, encoding format audio AudioFormat.ENCODING_PCM_FLOAT digunakan seperti pada ENCODING_PCM_16_BIT atau ENCODING_PCM_8_BIT untuk menentukan format data AudioTrack. Metode berlebih yang terkait, AudioTrack.write(), menggunakan array float untuk mengirim data.

Kotlin

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

Java

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

Untuk Informasi Selengkapnya

Bagian ini mencantumkan beberapa referensi tambahan tentang pengambilan sampel dan titik mengambang.

Pengambilan Sampel

Frekuensi sampel

Resampling

Kontroversi kedalaman bit tinggi dan kHz tinggi

Floating Point

Halaman Wikipedia berikut dapat membantu Anda memahami audio floating point:

Artikel berikut menyediakan informasi tentang aspek floating point yang berdampak langsung pada desainer sistem komputer: