Für diejenigen, die versuchen, die Verbindung zwischen SNR und einer normalen Zufallsvariablen herzustellen, die von numpy generiert wird:
[1]
, wo es wichtig ist zu bedenken, dass P die durchschnittliche Leistung ist.
Oder in dB:
[2]
In diesem Fall haben wir bereits ein Signal und möchten Rauschen erzeugen, um ein gewünschtes SNR zu erhalten.
Während Rauschen je nach Modell in verschiedenen Geschmacksrichtungen auftreten kann, ist Additive White Gaussian Noise (AWGN) ein guter Anfang (insbesondere für dieses Radioteleskop-Beispiel ) . Wie in den vorherigen Antworten angegeben, müssen Sie zum Modellieren von AWGN Ihrem ursprünglichen Signal eine Gaußsche Zufallsvariable mit einem Mittelwert von Null hinzufügen. Die Varianz dieser Zufallsvariablen beeinflusst die durchschnittliche Rauschleistung.
Für eine Gaußsche Zufallsvariable X beträgt die durchschnittliche Leistung
, auch als zweiter Moment bekannt ,
[3]. 
Also für weißes Rauschen,
und die durchschnittliche Leistung ist dann gleich der Varianz
.
Wenn Sie dies in Python modellieren, können Sie entweder
1. die Varianz basierend auf einem gewünschten SNR und einer Reihe vorhandener Messungen berechnen. Dies würde funktionieren, wenn Sie erwarten, dass Ihre Messungen ziemlich konsistente Amplitudenwerte aufweisen.
2. Alternativ können Sie die Rauschleistung auf einen bekannten Pegel einstellen, um etwa dem Empfängerrauschen zu entsprechen. Das Empfängerrauschen könnte gemessen werden, indem das Teleskop in den freien Raum gerichtet und die durchschnittliche Leistung berechnet wird.
In jedem Fall ist es wichtig sicherzustellen, dass Sie Ihrem Signal Rauschen hinzufügen und Durchschnittswerte im linearen Raum und nicht in dB-Einheiten ermitteln.
Hier ist ein Code zum Erzeugen eines Signals und zum Zeichnen der Spannung, der Leistung in Watt und der Leistung in dB:
# Signal Generation
# matplotlib inline
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()

Hier ist ein Beispiel für das Hinzufügen von AWGN basierend auf einem gewünschten SNR:
# Adding noise using target SNR
# Set a target SNR
target_snr_db = 20
# Calculate signal power and convert to dB
sig_avg_watts = np.mean(x_watts)
sig_avg_db = 10 * np.log10(sig_avg_watts)
# Calculate noise according to [2] then convert to watts
noise_avg_db = sig_avg_db - target_snr_db
noise_avg_watts = 10 ** (noise_avg_db / 10)
# Generate an sample of white noise
mean_noise = 0
noise_volts = np.random.normal(mean_noise, np.sqrt(noise_avg_watts), len(x_watts))
# Noise up the original signal
y_volts = x_volts + noise_volts
# Plot signal with noise
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()
# Plot in dB
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()

Und hier ist ein Beispiel für das Hinzufügen von AWGN basierend auf einer bekannten Rauschleistung:
# Adding noise using a target noise power
# Set a target channel noise power to something very noisy
target_noise_db = 10
# Convert to linear Watt units
target_noise_watts = 10 ** (target_noise_db / 10)
# Generate noise samples
mean_noise = 0
noise_volts = np.random.normal(mean_noise, np.sqrt(target_noise_watts), len(x_watts))
# Noise up the original signal (again) and plot
y_volts = x_volts + noise_volts
# Plot signal with noise
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()
# Plot in dB
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()
