SNRとnumpyによって生成された正規確率変数を接続しようとしている人のために:
[1]
、ここで、Pは平均パワーであることを覚えておくことが重要です。
またはdB単位:
[2]
この場合、すでに信号があり、ノイズを生成して目的のSNRを実現したいと考えています。
ノイズはモデリング対象に応じてさまざまな種類がありますが、(特にこの電波望遠鏡の例では)加法性ホワイトガウスノイズ(AWGN)から始めることをお勧めします。前の回答で述べたように、AWGNをモデル化するには、元の信号に平均ゼロのガウス確率変数を追加する必要があります。その確率変数の分散は、平均ノイズパワーに影響します。
ガウス確率変数Xの場合
、2次モーメントとも呼ばれる平均パワーは
[3]です。 
したがって、ホワイトノイズの場合
、平均パワーは分散に等しくなり
ます。
これをPythonでモデル化する場合、次のいずれかを実行できます
。1。目的のSNRと既存の測定値のセットに基づいて分散を計算します。これは、測定値がかなり一貫した振幅値を持つと予想される場合に機能します。
2.または、受信機のノイズなどに一致するように、ノイズ電力を既知のレベルに設定することもできます。受信機のノイズは、望遠鏡を自由空間に向けて平均電力を計算することで測定できます。
いずれにせよ、信号にノイズを追加し、dB単位ではなく線形空間で平均をとることを確認することが重要です。
信号を生成し、電圧、ワット単位の電力、および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()

目的のSNRに基づいてAWGNを追加する例を次に示します。
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()

そして、既知のノイズパワーに基づいてAWGNを追加する例を次に示します。
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()
