Bagaimana Anda membuat suara gaussian dengan python?

Kita dapat menggunakan fungsi random_noise[] untuk menambahkan berbagai jenis noise ke gambar. Contoh kode berikutnya menunjukkan bagaimana noise Gaussian dengan varian yang berbeda dapat ditambahkan ke gambar

im = img_as_float[imread["../images/parrot.png"]]plt.figure[figsize=[15,12]]sigmas = [0.1, 0.25, 0.5, 1]for i in range[4]:  noisy = random_noise[im, var=sigmas[i]**2] plt.subplot[2,2,i+1] plt.imshow[noisy] plt.axis['off'] plt.title['Gaussian noise with sigma=' + str[sigmas[i]], size=20]plt.tight_layout[]plt.show[]

Gambar berikutnya menunjukkan gambar keluaran yang dihasilkan dengan menambahkan noise Gaussian dengan varian yang berbeda dengan menjalankan cuplikan kode sebelumnya. Seperti yang dapat dilihat, semakin banyak standar deviasi dari noise Gaussian, semakin besar

Pada bab ini kita akan membahas noise, termasuk bagaimana noise dimodelkan dan ditangani dalam sistem komunikasi nirkabel. Konsep termasuk AWGN, kebisingan kompleks, dan SNR/SINR. Kami juga akan memperkenalkan desibel [dB] di sepanjang jalan, karena banyak digunakan dalam komunikasi nirkabel dan SDR

Kebisingan Gaussian

Kebanyakan orang menyadari konsep kebisingan. fluktuasi yang tidak diinginkan yang dapat mengaburkan sinyal yang kita inginkan. Kebisingan terlihat seperti

Perhatikan bagaimana nilai rata-rata adalah nol dalam grafik domain waktu. Jika nilai rata-rata tidak nol, maka kita dapat mengurangkan nilai rata-rata, menyebutnya bias, dan kita akan mendapatkan rata-rata nol. Perhatikan juga bahwa masing-masing titik dalam grafik tidak "acak seragam", mis. e. , nilai yang lebih besar lebih jarang, sebagian besar poin mendekati nol

Kami menyebut jenis kebisingan ini "Gaussian noise". Ini adalah model yang bagus untuk jenis kebisingan yang berasal dari banyak sumber alami, seperti getaran termal atom dalam silikon komponen RF penerima kami. Teorema limit pusat memberitahu kita bahwa penjumlahan dari banyak proses acak akan cenderung memiliki distribusi Gaussian, bahkan jika proses individu memiliki distribusi lain. Dengan kata lain, ketika banyak hal acak terjadi dan terakumulasi, hasilnya muncul kira-kira Gaussian, bahkan ketika hal-hal individual tidak terdistribusi Gaussian.

Distribusi Gaussian juga disebut distribusi "Normal" [ingat kurva lonceng]

Distribusi Gaussian memiliki dua parameter. mean dan varians. Kita telah membahas bagaimana rata-rata dapat dianggap nol karena Anda selalu dapat menghapus rata-rata, atau bias, jika bukan nol. Varians mengubah seberapa "kuat" kebisingan itu. Variasi yang lebih tinggi akan menghasilkan angka yang lebih besar. Karena alasan inilah varians menentukan kekuatan noise

Variansi sama dengan standar deviasi kuadrat [].

Desibel [dB]

Kami akan mengambil garis singgung cepat untuk memperkenalkan dB secara formal. Anda mungkin pernah mendengar tentang dB, dan jika Anda sudah terbiasa dengannya, silakan lewati bagian ini

Bekerja dalam dB sangat berguna ketika kita perlu berurusan dengan bilangan kecil dan bilangan besar pada saat yang sama, atau hanya sekumpulan bilangan yang sangat besar. Pertimbangkan betapa rumitnya bekerja dengan angka skala pada Contoh 1 dan Contoh 2

Contoh 1. Sinyal 1 diterima pada 2 watt dan noise floor pada 0. 0000002 watt

Contoh 2. Pembuangan sampah 100.000 kali lebih keras daripada daerah pedesaan yang sepi, dan gergaji rantai 10.000 kali lebih keras daripada pembuangan sampah [dalam hal kekuatan gelombang suara]

Tanpa dB, artinya bekerja dalam istilah "linier" normal, kita perlu menggunakan banyak 0 untuk mewakili nilai dalam Contoh 1 dan 2. Terus terang, jika kami merencanakan sesuatu seperti Signal 1 dari waktu ke waktu, kami bahkan tidak akan melihat lantai kebisingan. Jika skala sumbu y berubah dari 0 menjadi 3 watt, misalnya, noise akan terlalu kecil untuk muncul di plot. Untuk mewakili skala ini secara bersamaan, kami bekerja dalam skala log

Untuk mengilustrasikan lebih lanjut masalah skala yang kita temui dalam pemrosesan sinyal, pertimbangkan air terjun di bawah dari tiga sinyal yang sama. Sisi kiri adalah sinyal asli dalam skala linier, dan sisi kanan menunjukkan sinyal yang diubah menjadi skala logaritmik [dB]. Kedua representasi menggunakan peta warna yang sama persis, di mana biru adalah nilai terendah dan kuning adalah nilai tertinggi. Anda hampir tidak dapat melihat sinyal di sebelah kiri dalam skala linier

Untuk nilai x tertentu, kita dapat menyatakan x dalam dB menggunakan rumus berikut

Dengan Python

x_db = 10.0 * np.log10[x]
_

Anda mungkin telah melihat bahwa 10 * menjadi 20 * di domain lain. Setiap kali Anda berurusan dengan semacam kekuatan, Anda menggunakan 10, dan Anda menggunakan 20 jika Anda berurusan dengan nilai non-daya seperti tegangan atau arus. Di DSP kita cenderung berurusan dengan kekuatan. Sebenarnya tidak ada satu waktu pun di seluruh buku teks ini kita perlu menggunakan 20, bukan 10

Kami mengonversi dari dB kembali ke linier [bilangan normal] menggunakan

Dengan Python

x = 10.0 ** [x_db / 10.0]

Jangan terjebak dalam rumus, karena ada konsep kunci yang harus diambil di sini. Di DSP kami menangani angka yang sangat besar dan angka yang sangat kecil secara bersamaan [mis. g. , kekuatan sinyal dibandingkan dengan kekuatan noise]. Skala logaritmik dB memungkinkan kita memiliki rentang yang lebih dinamis saat kita menyatakan angka atau memplotnya. Ini juga memberikan beberapa kemudahan seperti dapat menambahkan ketika kita biasanya mengalikan [seperti yang akan kita lihat di bab ini]

Beberapa kesalahan umum yang akan dialami orang saat baru mengenal dB

  1. Menggunakan natural log daripada log base 10 karena sebagian besar fungsi log[] bahasa pemrograman sebenarnya adalah natural log
  2. Lupa menyertakan dB saat menyatakan angka atau memberi label sumbu. Jika kita berada di dB, kita perlu mengidentifikasinya di suatu tempat
  3. Saat Anda dalam dB, Anda menambahkan/mengurangi nilai alih-alih mengalikan/membagi, mis. g

Penting juga untuk dipahami bahwa dB secara teknis bukanlah sebuah "unit". Nilai dalam dB saja adalah tanpa unit, seperti jika ada sesuatu yang 2x lebih besar, tidak ada unit sampai saya memberi tahu Anda satuannya. dB adalah hal yang relatif. Dalam audio ketika mereka mengatakan dB, yang mereka maksud sebenarnya adalah dBA yang merupakan satuan untuk tingkat suara [A adalah satuan]. Dalam nirkabel kami biasanya menggunakan watt untuk merujuk ke tingkat daya yang sebenarnya. Oleh karena itu, Anda mungkin melihat dBW sebagai satuan, yang relatif terhadap 1 W. Anda juga dapat melihat dBmW [sering ditulis dBm singkatnya] yang relatif terhadap 1 mW. Misalnya, seseorang dapat mengatakan "pemancar kami disetel ke 3 dBW" [jadi 2 watt]. Terkadang kita menggunakan dB sendiri, artinya relatif dan tidak ada satuan. Dapat dikatakan, "sinyal kami diterima 20 dB di atas lantai kebisingan". Ini sedikit tip. 0 dBm = -30 dBW

Berikut adalah beberapa konversi umum yang saya sarankan untuk dihafalkan

LineardB1x0 dB2x3 dB10x10 dB0. 5x-3 dB0. 1x-10 dB100x20 dB1000x30 dB10000x40 dB

Akhirnya, untuk menempatkan angka-angka ini ke dalam perspektif, di bawah ini adalah beberapa contoh level daya, dalam dBm

80 dBmTx power of rural FM radio station62 dBmMax power of a ham radio transmitter60 dBmPower of typical home microwave37 dBmMax power of typical handheld CB or ham radio27 dBmTypical cell phone transmit power15 dBmTypical WiFi transmit power10 dBmBluetooth [version 4] max transmit power-10 dBmMax received power for WiFi-70 dBmExample received power for a ham signal-100 dBmMinimum received power for WiFi-127 dBmTypical received power from GPS satellites

Kebisingan dalam Domain Frekuensi

Dalam bab ini kami membahas "Pasangan Fourier", i. e. , seperti apa sinyal domain waktu tertentu dalam domain frekuensi. Nah, seperti apa noise Gaussian dalam domain frekuensi? . Plot ini diambil dari Radio GNU

Kita dapat melihat bahwa tampilannya kira-kira sama di semua frekuensi dan cukup datar. Ternyata derau Gaussian dalam domain waktu juga merupakan derau Gaussian dalam domain frekuensi. Jadi mengapa kedua plot di atas tidak terlihat sama? . Yang penting, itu menggunakan skala log, atau menunjukkan besarnya dalam dB. Kalau tidak, grafik ini akan terlihat sama. Kita dapat membuktikannya sendiri dengan menghasilkan beberapa noise [dalam domain waktu] dengan Python dan kemudian mengambil FFT

import numpy as np
import matplotlib.pyplot as plt

N = 1024 # number of samples to simulate, choose any number you want
x = np.random.randn[N]
plt.plot[x, '.-']
plt.show[]

X = np.fft.fftshift[np.fft.fft[x]]
X = X[N//2:] # only look at positive frequencies.  remember // is just an integer divide
plt.plot[np.real[X], '.-']
plt.show[]

Perhatikan bahwa fungsi randn[] secara default menggunakan rata-rata = 0 dan varians = 1. Kedua plot akan terlihat seperti ini

Anda kemudian dapat menghasilkan PSD datar yang kami miliki di Radio GNU dengan mengambil log dan rata-rata banyak bersama. Sinyal yang kami hasilkan dan ambil FFT adalah sinyal nyata [versus kompleks], dan FFT dari setiap sinyal nyata akan memiliki bagian negatif dan positif yang cocok, jadi itu sebabnya kami hanya menyimpan bagian positif dari keluaran FFT [bagian ke-2 . Tetapi mengapa kami hanya menghasilkan kebisingan "nyata", dan bagaimana sinyal kompleks bekerja dalam hal ini?

Kebisingan Kompleks

Derau "Complex Gaussian" adalah apa yang akan kita alami saat kita memiliki sinyal di baseband; . Dan yang terpenting, bagian nyata dan imajiner tidak bergantung satu sama lain;

Kami dapat menghasilkan noise Gaussian yang kompleks dengan menggunakan Python

n = np.random.randn[] + 1j * np.random.randn[]
_

Tapi tunggu. Persamaan di atas tidak menghasilkan "jumlah" kebisingan yang sama dengan

x = 10.0 ** [x_db / 10.0]
0, dalam hal daya [dikenal sebagai daya kebisingan]. Kita dapat menemukan kekuatan rata-rata dari sinyal nol rata-rata [atau kebisingan] menggunakan

power = np.var[x]
_

dimana np. var[] adalah fungsi untuk varians. Di sini kekuatan sinyal kami n adalah 2. Untuk menghasilkan kebisingan yang kompleks dengan "daya unit", i. e. , kekuatan 1 [yang membuat semuanya nyaman], harus kita gunakan

n = [np.random.randn[N] + 1j*np.random.randn[N]]/np.sqrt[2] # AWGN with unity power

Untuk memplot derau kompleks dalam domain waktu, seperti sinyal kompleks lainnya, kita memerlukan dua jalur

n = [np.random.randn[N] + 1j*np.random.randn[N]]/np.sqrt[2]
plt.plot[np.real[n],'.-']
plt.plot[np.imag[n],'.-']
plt.legend[['real','imag']]
plt.show[]
_

Anda dapat melihat bahwa bagian nyata dan imajiner sepenuhnya independen

Seperti apa kebisingan Gaussian kompleks pada plot IQ?

plt.plot[np.real[n],np.imag[n],'.']
plt.grid[True, which='both']
plt.axis[[-2, 2, -2, 2]]
plt.show[]
_

Itu terlihat seperti yang kita harapkan; . Hanya untuk bersenang-senang, mari kita coba menambahkan noise ke sinyal QPSK untuk melihat seperti apa plot IQ-nya

Sekarang apa yang terjadi jika kebisingannya lebih kuat?

Kami mulai memahami mengapa mengirimkan data secara nirkabel tidak sesederhana itu. Kami ingin mengirim bit per simbol sebanyak yang kami bisa, tetapi jika noise terlalu tinggi maka kami akan mendapatkan bit yang salah di sisi penerima

AWGN

Additive White Gaussian Noise [AWGN] adalah singkatan yang akan sering Anda dengar di dunia DSP dan SDR. GN, Gaussian Noise, sudah kita bahas. Aditif berarti kebisingan ditambahkan ke sinyal yang kami terima. Putih, dalam domain frekuensi, berarti spektrumnya datar di seluruh pita pengamatan kita. Hampir selalu berwarna putih dalam praktiknya, atau kira-kira putih. Dalam buku teks ini kami akan menggunakan AWGN sebagai satu-satunya bentuk kebisingan saat menangani tautan komunikasi dan anggaran tautan dan semacamnya. Kebisingan non-AWGN cenderung menjadi topik khusus

SNR dan SINR

Signal-to-Noise Ratio [SNR] adalah bagaimana kita akan mengukur perbedaan kekuatan antara sinyal dan kebisingan. Ini rasio jadi unit-less. SNR hampir selalu dalam dB, dalam praktiknya. Seringkali dalam simulasi kita membuat kode sedemikian rupa sehingga sinyal kita adalah satu unit daya [daya = 1]. Dengan begitu, kita dapat membuat SNR 10 dB dengan menghasilkan noise yang memiliki daya -10 dB dengan menyesuaikan varian ketika kita menghasilkan noise

Jika seseorang mengatakan "SNR = 0 dB" itu berarti kekuatan sinyal dan kebisingannya sama. SNR positif berarti sinyal kita memiliki daya yang lebih tinggi daripada noise, sedangkan SNR negatif berarti noise memiliki daya yang lebih tinggi. Mendeteksi sinyal pada SNR negatif biasanya cukup sulit

Seperti yang kami sebutkan sebelumnya, kekuatan sinyal sama dengan variansi sinyal. Jadi kita dapat merepresentasikan SNR sebagai rasio varians sinyal terhadap varians noise

Signal-to-Interference-plus-Noise Ratio [SINR] pada dasarnya sama dengan SNR kecuali Anda menyertakan interferensi bersama dengan noise, dalam penyebut

Apa yang merupakan gangguan didasarkan pada aplikasi/situasi, tetapi biasanya itu adalah sinyal lain yang mengganggu sinyal kepentingan [SOI], dan tumpang tindih dengan frekuensi SOI, dan/atau tidak dapat disaring karena beberapa alasan

Bagaimana cara menambahkan noise Gaussian?

J = imnoise[ I ,'gaussian', m ] menambahkan derau putih Gaussian dengan rata-rata m dan varian 0. 01. J = imnoise[ I ,'gaussian', m , var_gauss ] menambahkan Gaussian white noise dengan rata-rata m dan varians var_gauss.

Bagaimana Anda menambahkan noise Gaussian ke gambar dengan Python?

impor numpy sebagai np impor matplotlib. pyplot sebagai plt import cv2
img=cv2. imread["/kaggle/input/test-image-for-noise/image. jpg",0]
cetak [img. membentuk].
gauss_noise=np. nol[[640.480],dtype=np. .
gn_img=cv2. tambahkan[img,gauss_noise]
uni_noise=np. nol[[640.480],dtype=np. .
un_img=cv2. tambahkan[img,uni_noise]
imp_noise=np

Bagaimana cara menambahkan derau putih Gaussian?

y = awgn[ x , snr ] menambahkan noise Gaussian putih ke sinyal vektor x. Sintaks ini mengasumsikan bahwa kekuatan x adalah 0 dBW. Untuk informasi selengkapnya tentang derau Gaussian putih aditif, lihat Apa itu AWGN? .

Bài mới nhất

Chủ Đề