如何在特定的信噪比下产生复杂的白噪声?

2024-10-03 00:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下代码生成具有指定SNR(信噪比)和零均值的复杂白噪声:

import numpy as np

def GenerateNoise(signal, SNR_dB): # desiredSNR [dB]; signal is an array with complex values
   n = np.zeros((len(signal),1), dtype=complex)
   # SNR = var_signal^2 / var_n^2
   snr = 10.0**(SNR_dB/10.0) # Desired linear SNR
   var_signal = signal.var() # Measure power of signal
   var_n = var_signal / snr # Calculate required noise power for desired SNR
   if (var_n == 0): # In case of a null signal
       var_n = snr
   e = np.random.normal(0, np.sqrt(var_n/2), size=(len(signal), 2)).view(np.complex) # Generate noise with calculated power
   for i in range(0, len(signal)):
        n[i,0] = n[i,0] + e[i][0]
   print(10.0*np.log10((np.var(signal)**2)/(np.var(n)**2)))
   return n

代码的灵感来自于这个question。问题是显示的信噪比是指定信噪比的两倍(例如,当信噪比为-10[dB]时,打印值为-20[dB])。你知道吗

有人知道错在哪里吗?你知道吗


Tags: offordbsignallenvarwithnp
1条回答
网友
1楼 · 发布于 2024-10-03 00:21:05

我已经弄明白了。我没有计算,也没有正确显示噪音。如果对任何人都有用,这是正确的代码:

import numpy as np
def GenerateNoise(signal, SNR_dB): # desiredSNR [dB]; signal is an array with complex values
   n = np.zeros((len(signal),1), dtype=complex)
   # SNR = var_signal / var_n
   snr = 10.0**(SNR_dB/10.0) # Desired linear SNR
   var_signal = signal.var() # Measure power of signal
   var_n = var_signal / snr # Calculate required noise power for desired SNR
   if (var_n == 0): # In case of a null signal
       var_n = snr
   e = np.random.normal(0, np.sqrt(var_n*2.0)/2.0, size=(len(signal), 2)).view(np.complex) # Generate noise with calculated power
   for i in range(0, len(signal)):
       n[i,0] = n[i,0] + e[i][0]
   print(10.0*np.log10((np.var(signal))/(np.var(n))))
   return n

相关问题 更多 >