如何生成具有指定信噪比的复杂白噪声?
How to generate complex white noise with specified SNR?
我正在使用以下代码生成具有指定 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
代码灵感来源于此。问题是显示的 SNR 是指定 SNR 的两倍(例如,SNR_dB = -10 [dB],打印值是 ~ -20 [dB])。
有人知道错在哪里吗?
我已经弄明白了。我没有计算,也没有正确显示噪音。这是修改后的代码,如果对大家有用的话:
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
我正在使用以下代码生成具有指定 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
代码灵感来源于此
有人知道错在哪里吗?
我已经弄明白了。我没有计算,也没有正确显示噪音。这是修改后的代码,如果对大家有用的话:
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