Bagi mereka yang mencoba membuat koneksi antara SNR dan variabel acak normal yang dihasilkan oleh numpy:
[1]
, penting untuk diingat bahwa P adalah kekuatan rata - rata .
Atau dalam dB:
[2]
Dalam hal ini, kami sudah memiliki sinyal dan kami ingin menghasilkan derau untuk memberi kami SNR yang diinginkan.
Meskipun derau dapat datang dalam berbagai rasa bergantung pada apa yang Anda modelkan, awal yang baik (terutama untuk contoh teleskop radio ini) adalah Aditif Gaussian Putih Kebisingan (AWGN) . Seperti yang dinyatakan dalam jawaban sebelumnya, untuk memodelkan AWGN Anda perlu menambahkan variabel acak gaussian nol ke sinyal asli Anda. Varians dari variabel acak tersebut akan mempengaruhi kekuatan kebisingan rata - rata .
Untuk variabel acak Gaussian X, kekuatan rata-rata
, juga dikenal sebagai momen kedua , adalah
[3] 
Jadi untuk white noise,
dan daya rata-rata kemudian sama dengan varians
.
Saat memodelkan ini dengan python, Anda dapat
1. Menghitung varians berdasarkan SNR yang diinginkan dan serangkaian pengukuran yang ada, yang akan berfungsi jika Anda mengharapkan pengukuran Anda memiliki nilai amplitudo yang cukup konsisten.
2. Sebagai alternatif, Anda dapat mengatur daya derau ke tingkat yang diketahui untuk mencocokkan sesuatu seperti derau penerima. Kebisingan penerima dapat diukur dengan mengarahkan teleskop ke ruang bebas dan menghitung daya rata-rata.
Bagaimanapun, penting untuk memastikan bahwa Anda menambahkan noise ke sinyal Anda dan mengambil rata-rata dalam ruang linier dan bukan dalam unit dB.
Berikut beberapa kode untuk menghasilkan tegangan sinyal dan plot, daya dalam Watt, dan daya dalam dB:
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(1, 100, 1000)
x_volts = 10*np.sin(t/(2*np.pi))
plt.subplot(3,1,1)
plt.plot(t, x_volts)
plt.title('Signal')
plt.ylabel('Voltage (V)')
plt.xlabel('Time (s)')
plt.show()
x_watts = x_volts ** 2
plt.subplot(3,1,2)
plt.plot(t, x_watts)
plt.title('Signal Power')
plt.ylabel('Power (W)')
plt.xlabel('Time (s)')
plt.show()
x_db = 10 * np.log10(x_watts)
plt.subplot(3,1,3)
plt.plot(t, x_db)
plt.title('Signal Power in dB')
plt.ylabel('Power (dB)')
plt.xlabel('Time (s)')
plt.show()

Berikut adalah contoh untuk menambahkan AWGN berdasarkan SNR yang diinginkan:
target_snr_db = 20
sig_avg_watts = np.mean(x_watts)
sig_avg_db = 10 * np.log10(sig_avg_watts)
noise_avg_db = sig_avg_db - target_snr_db
noise_avg_watts = 10 ** (noise_avg_db / 10)
mean_noise = 0
noise_volts = np.random.normal(mean_noise, np.sqrt(noise_avg_watts), len(x_watts))
y_volts = x_volts + noise_volts
plt.subplot(2,1,1)
plt.plot(t, y_volts)
plt.title('Signal with noise')
plt.ylabel('Voltage (V)')
plt.xlabel('Time (s)')
plt.show()
y_watts = y_volts ** 2
y_db = 10 * np.log10(y_watts)
plt.subplot(2,1,2)
plt.plot(t, 10* np.log10(y_volts**2))
plt.title('Signal with noise (dB)')
plt.ylabel('Power (dB)')
plt.xlabel('Time (s)')
plt.show()

Dan berikut adalah contoh untuk menambahkan AWGN berdasarkan kekuatan derau yang diketahui:
target_noise_db = 10
target_noise_watts = 10 ** (target_noise_db / 10)
mean_noise = 0
noise_volts = np.random.normal(mean_noise, np.sqrt(target_noise_watts), len(x_watts))
y_volts = x_volts + noise_volts
plt.subplot(2,1,1)
plt.plot(t, y_volts)
plt.title('Signal with noise')
plt.ylabel('Voltage (V)')
plt.xlabel('Time (s)')
plt.show()
y_watts = y_volts ** 2
y_db = 10 * np.log10(y_watts)
plt.subplot(2,1,2)
plt.plot(t, 10* np.log10(y_volts**2))
plt.title('Signal with noise')
plt.ylabel('Power (dB)')
plt.xlabel('Time (s)')
plt.show()
