SNR ile numpy tarafından oluşturulan normal bir rastgele değişken arasında bağlantı kurmaya çalışanlar için :
[1]
, P'nin ortalama güç olduğunu akılda tutmak önemlidir .
Veya dB cinsinden:
[2]
Bu durumda, zaten bir sinyalimiz var ve bize istenen bir SNR'yi vermek için gürültü üretmek istiyoruz.
Gürültü, modellediğiniz şeye bağlı olarak farklı tatlarda olabilirken, iyi bir başlangıç (özellikle bu radyo teleskop örneği için) Eklemeli Beyaz Gauss Gürültüsüdür (AWGN) . Önceki cevaplarda belirtildiği gibi, AWGN'yi modellemek için orijinal sinyalinize sıfır ortalamalı bir gauss rastgele değişkeni eklemeniz gerekir. Bu rastgele değişkenin varyansı, ortalama gürültü gücünü etkileyecektir .
Bir Gauss rastgele değişken X için, ortalama güç
, aynı zamanda, ikinci olarak da bilinen, an , bir
[3] 
Yani beyaz gürültü
için ortalama güç varyansa eşittir
.
Bunu python'da modellerken,
1. Varyansı istenen bir SNR ve bir dizi mevcut ölçüm temelinde hesaplayabilirsiniz; bu, ölçümlerinizin oldukça tutarlı genlik değerlerine sahip olmasını bekliyorsanız işe yarar.
2. Alternatif olarak, alıcı gürültüsü gibi bir şeye uyması için gürültü gücünü bilinen bir seviyeye ayarlayabilirsiniz. Alıcı gürültüsü, teleskopu boş alana doğrultarak ve ortalama güç hesaplanarak ölçülebilir.
Her iki durumda da, sinyalinize gürültü eklediğinizden ve ortalamaları dB birimlerinde değil doğrusal uzayda aldığınızdan emin olmak önemlidir.
İşte bir sinyal ve grafik voltajı, Watt cinsinden güç ve dB cinsinden güç oluşturmak için bazı kodlar:
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()

İstenen SNR'ye göre AWGN eklemek için bir örnek:
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()

Ve bilinen bir gürültü gücüne dayalı olarak AWGN eklemek için bir örnek:
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()
