Apa beberapa algoritma untuk menghasilkan perkiraan pseudo-acak yang baik untuk noise (pink), namun cocok untuk implementasi dengan biaya komputasi rendah pada DSP integer?
Apa beberapa algoritma untuk menghasilkan perkiraan pseudo-acak yang baik untuk noise (pink), namun cocok untuk implementasi dengan biaya komputasi rendah pada DSP integer?
Jawaban:
Penyaringan Linier
Pendekatan pertama dalam jawaban Peter (yaitu menyaring white noise) adalah pendekatan yang sangat mudah. Dalam pemrosesan sinyal audio spektral , JOS memberikan filter orde rendah yang dapat digunakan untuk menghasilkan perkiraan yang layak , bersama dengan analisis tentang seberapa baik kepadatan spektral daya yang dihasilkan cocok dengan yang ideal. Pemfilteran linear akan selalu menghasilkan perkiraan, tetapi itu mungkin tidak masalah dalam praktiknya. Mengutip JOS:
Tidak ada filter yang tepat (rasional, pesanan terbatas) yang dapat menghasilkan noise merah muda dari white noise. Ini karena respons amplitudo yang ideal dari filter harus proporsional dengan fungsi irasional , dimanaf menunjukkan frekuensi dalam Hz. Namun, cukup mudah untuk menghasilkan noise merah muda ke tingkat perkiraan yang diinginkan, termasuk tepat secara persepsi.
Koefisien dari filter yang dia berikan adalah sebagai berikut:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
Mereka diformat sebagai parameter untuk fungsi filter MATLAB , jadi demi kejelasan, mereka sesuai dengan fungsi transfer berikut:
Jelas, lebih baik menggunakan presisi penuh dari koefisien dalam praktek. Berikut tautan ke bagaimana suara merah muda yang dihasilkan menggunakan filter itu terdengar:
Untuk implementasi titik tetap, karena biasanya lebih nyaman untuk bekerja dengan koefisien dalam rentang [-1,1), beberapa pengerjaan ulang fungsi transfer akan dilakukan. Secara umum, rekomendasinya adalah untuk memecah hal-hal menjadi bagian-bagian orde dua , tetapi bagian dari alasan untuk itu (sebagai lawan menggunakan bagian-bagian orde pertama) adalah untuk kenyamanan bekerja dengan koefisien nyata ketika akar kompleks. Untuk filter khusus ini, semua akar adalah nyata, dan menggabungkan kemudian ke bagian urutan kedua mungkin masih akan menghasilkan beberapa koefisien penyebut> 1, sehingga tiga bagian urutan pertama adalah pilihan yang masuk akal, sebagai berikut:
dimana
Some judicious choice of sequencing for those sections, combined with some choice of gain factors for each section will be required to prevent overflow. I haven't tried any of the other filters given in the link in Peter's answer, but similar considerations would probably apply.
White Noise
Obviously, the filtering approach requires a source of uniform random numbers in the first place. If a library routine isn't available for a given platform, one of the simplest approaches is to use a linear congruential generator. One example of an efficient fixed-point implementation is given by TI in Random Number Generation on a TMS320C5x (pdf). A detailed theoretical discussion of various other methods can be found in Random Number Generation and Monte Carlo Methods by James Gentle.
Resources
Several sources based on following links in Peter's answer are worth highlighting.
Potongan referensi kode berbasis filter pertama. Pengantar Pengolahan Sinyal oleh Orfanidis. Teks lengkap tersedia di tautan itu, dan [dalam Lampiran B] memiliki cakupan generasi noise pink dan putih. Seperti yang disebutkan dalam komentar, Orfanidis sebagian besar membahas algoritma Voss.
Spectrum Diproduksi oleh Voss-McCartney Pink Noise Generator . Jauh di dekat bagian bawah halaman, setelah diskusi ekstensif tentang varian dari algoritma Voss, tautan ini dirujuk dalam huruf merah muda raksasa . Ini jauh lebih mudah dibaca daripada beberapa diagram ASCII sebelumnya.
Bibliograf tentang Kebisingan 1 / f oleh Wentian Li. Ini dirujuk baik dalam sumber Peter dan oleh JOS. Ini memiliki sejumlah referensi yang memusingkan pada kebisingan 1 / f secara umum, dating kembali ke tahun 1918.
Saya telah menggunakan algoritma Corsini dan Saletti sejak 1990: G. Corsini, R. Saletti, "A 1 / f ^ gamma Power Spectrum Noise Sequence Generator", Transaksi IEEE tentang Instrumentasi dan Pengukuran, 37 (4), Desember, 1988, 615 -619. Eksponen gamma adalah antara -2 dan +2. Ini bekerja dengan baik untuk tujuan saya. Ed
Jika upaya untuk menambahkan tangkapan layar ini berfungsi, gambar di bawah ini menunjukkan contoh seberapa baik kinerja algoritma Corsini dan Saletti (setidaknya saat saya memprogramnya kembali pada tahun 1990). Frekuensi sampling adalah 1 kHz, gamma = 1, dan 1000 32k FFT PSD rata-rata.
Ini mengikuti posting saya sebelumnya di generator kebisingan Corsini dan Saletti (C&S). Dua gambar berikut menunjukkan seberapa baik kinerja generator C&S dalam hal menghasilkan frekuensi rendah (gamma> 0) dan suara frekuensi tinggi (gamma <0). Gambar ketiga membandingkan PSD kebisingan 1 / f dari generator C&S (sama seperti posting pertama saya) dan generator Contoh B.9 1 / f yang diberikan dalam buku bagus Prof. Orfanidis (eqn B.29, p. 736). Semua PSD ini adalah rata-rata 1000 PSD FFT 32k. Mereka semua unilateral dan berarti-dikurangi. Untuk PSD C&S, saya menggunakan 3 kutub / dekade dan menentukan 4 dekade (0,05 hingga 500 Hz) sebagai rentang yang dapat digunakan yang diinginkan. Jadi generator C&S memiliki n = 12 pasangan tiang dan nol. Frekuensi pengambilan sampel adalah 1 kHz, Nyquist adalah 500 Hz, dan elemen resolusi hanya lebih dari 0,0305 Hz. Ed V
Seperti negara Corsini & Saletti di koran mereka dimana adalah frekuensi sampling dan adalah "batas atas pita frekuensi di mana kami akan menghasilkan sampel derau". Koefisien filter digital diberikan oleh persamaannya (5.1):