Apa beberapa algoritma untuk menghasilkan perkiraan pseudo-acak yang baik untuk 1 / f noise (pink), namun cocok untuk implementasi dengan biaya komputasi rendah pada DSP integer?
Bagaimana dengan memori? Jika itu bukan masalah tetapi perhitungannya adalah, saya akan mengatakan lakukan fase acak iDFT dari kurva frekuensi yang diinginkan dan simpan sebagai konstanta statis yang dapat ditelan di perangkat Anda.
leftaroundabout
@leftaroundabout - Atau akan mengalikan DFT dari white noise acak dengan kurva frekuensi 1 / f, kemudian melakukan IDFT memiliki karakteristik keacakan yang lebih baik?
hotpaw2
1
White noise adalah dasarnya IFT acak-fase fungsi konstan, jadi seharusnya tidak membuat banyak perbedaan.
Jika situs itu turun jawaban Anda menghilang, jika Anda membawa dasar-dasar setiap solusi jawabannya akan jauh lebih baik, menggunakan situs sebagai referensi.
Kortuk
@Kortuk: Jawabannya adalah komunitas wiki, jadi silakan saja sendiri! Informasi di sana harus cukup untuk merujuk ke referensi web lainnya (seperti jawaban ahli data untuk opsi pertama). Saya setuju, bahwa lebih banyak rincian akan baik.
Peter K.
20
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
, dimanaf1 / f--√f 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:
H(z)=1−b1z−11−a1z−11−b2z−11−a2z−11−b3z−11−a3z−1
dimana
b1=0.98223157,b2=0.83265661,b3=0.10798089
a1=0.99516897,a2=0.94384177,a3=0.55594526
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.
Adakah yang tahu bagaimana dia menghasilkan koefisien filter ini? Saya kira itu hanya nonlinear yang cocok dengan kemiringan yang diinginkan, tetapi saya akan cukup tertarik untuk mengetahui apakah ada algoritma yang lebih spesifik.
nibot
My best guess would be one of the approximation techniques mentioned in his thesis. It's a great read either way.
datageist
Wow, that is quite a document! Thanks for the link.
nibot
1
The problem with the filter white noise method is you don't get the same magnitude phase relationships as you do with an autocorrelated time series. Thus if you are trying to emulate natural processes you should not generate white noise and filter it. You should actually create autocorrelated noise as a time series, i.e. current value depends on previous value + noise. See in statistics "AR" processes. You can test this by generating noise using both methods, then FFT, and plot real versus imaginary (complex plane of the frequency domain). You'll notice a big difference in the pattern
Paul S
Hai Paul, selamat datang di DSP.SE. Jika Anda hanya peduli tentang bagaimana suara bising (dalam pekerjaan audio, misalnya) maka spektrum magnitudo adalah perhatian utama. Akan lebih bagus jika Anda bisa merinci pemikiran Anda dalam jawaban baru. Saya tidak berpikir kita memiliki apa pun di situs yang menggambarkan teknik itu.
datageist
1
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 fc≥ 10 fM.dimana fc adalah frekuensi sampling dan fM.adalah "batas atas pita frekuensi di mana kami akan menghasilkan sampel derau". Koefisien filter digital diberikan oleh persamaannya (5.1):
Sebuahsaya= e x p [ - 2 π10( i - N) / h - γ/ 2h-c]
bsaya= e x p [ - 2 π10( i - N) / h - c]
di mana c = 1. Untuk mendapatkan K&S PSD seperti yang ditunjukkan di atas, misalkan c = 0 dan fM.= 0,5 fc.
Status Corsini dan Saletti "Filter ini terdiri dari bagian urutan pertama bertingkat N, masing-masing dengan pasangan kutub-nol nyata" dan kutub N "didistribusikan secara merata berkenaan dengan logaritma frekuensi dengan kepadatan kutub h per dekade frekuensi (p / d), dan N nol mengikutinya. " Bagian Diskusi makalah ini dilakukan dengan sangat baik, sehingga tidak ada masalah hanya pemrograman apa yang mereka katakan harus dilakukan. Yang saya miliki hanyalah hardcopy lama saya dan salinannya. Untuk PSD di atas, saya menggunakan 3 kutub / dekade dan PSD adalah mean-subtracted dan unilateral. Ed V
Jawaban:
Ada beberapa. Situs ini memiliki daftar yang masuk akal (tapi mungkin lama):
sumber
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:
Koefisien dari filter yang dia berikan adalah sebagai berikut:
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.
sumber
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 merekafc≥ 10 fM. dimana fc adalah frekuensi sampling dan fM. adalah "batas atas pita frekuensi di mana kami akan menghasilkan sampel derau". Koefisien filter digital diberikan oleh persamaannya (5.1):
Sebuahsaya= e x p [ - 2 π10( i - N) / h - γ/ 2h-c]
bsaya= e x p [ - 2 π10( i - N) / h - c]
di mana c = 1. Untuk mendapatkan K&S PSD seperti yang ditunjukkan di atas, misalkan c = 0 dan fM.= 0,5 fc .
sumber