Đối với những người cố gắng tạo kết nối giữa SNR và một biến ngẫu nhiên bình thường được tạo bởi numpy:
[1]
, điều quan trọng cần ghi nhớ là P là công suất trung bình .
Hoặc tính bằng dB:
[2]
Trong trường hợp này, chúng tôi đã có một tín hiệu và chúng tôi muốn tạo ra tiếng ồn để cung cấp cho chúng tôi một SNR mong muốn.
Mặc dù tiếng ồn có thể có các hương vị khác nhau tùy thuộc vào những gì bạn đang lập mô hình, nhưng một khởi đầu tốt (đặc biệt đối với ví dụ về kính viễn vọng vô tuyến này) là Tiếng ồn Gaussian Trắng Phụ gia (AWGN) . Như đã nêu trong các câu trả lời trước, để lập mô hình AWGN, bạn cần thêm biến ngẫu nhiên gaussian trung bình bằng 0 vào tín hiệu ban đầu của mình. Phương sai của biến ngẫu nhiên đó sẽ ảnh hưởng đến công suất nhiễu trung bình .
Đối với biến ngẫu nhiên Gaussian X, công suất trung bình
, còn được gọi là thời điểm thứ hai , là
[3] 
Vì vậy, đối với tiếng ồn trắng,
và công suất trung bình sau đó bằng phương sai
.
Khi lập mô hình này trong python, bạn có thể
1. Tính toán phương sai dựa trên SNR mong muốn và tập hợp các phép đo hiện có, sẽ hoạt động nếu bạn mong đợi các phép đo của mình có giá trị biên độ khá nhất quán.
2. Ngoài ra, bạn có thể đặt công suất tiếng ồn ở một mức đã biết để phù hợp với một số thứ như tiếng ồn của máy thu. Tiếng ồn máy thu có thể được đo bằng cách hướng kính thiên văn vào không gian trống và tính toán công suất trung bình.
Dù bằng cách nào, điều quan trọng là đảm bảo rằng bạn thêm nhiễu vào tín hiệu của mình và lấy giá trị trung bình trong không gian tuyến tính chứ không phải đơn vị dB.
Dưới đây là một số mã để tạo tín hiệu và biểu đồ điện áp, công suất tính bằng Watts và công suất tính bằng 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()

Dưới đây là một ví dụ để thêm AWGN dựa trên SNR mong muốn:
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()

Và đây là một ví dụ để thêm AWGN dựa trên công suất nhiễu đã biết:
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()
