numpy.random.normal()和numpy.random.randn()产生的都是高斯白噪声。
计算信噪比也就是简单的对信号的乘方求和而已,例如如果你有信号x和噪声n,
那么信噪比就是:
10*log10( sum(x**2) / sum(n**2))
根据以上信息可以编写如下程序。
wgn(x, snr)中x为信号,snr为信噪比,返回满足条件的高斯白噪声,只需要:
x += wgn(x, snr),即可以得到和matlab的awgn相同的效果。
程序中用hist()检查噪声是否是高斯分布,psd()检查功率谱密度是否为常数。
import numpy as np
import pylab as pl
def wgn(x, snr):
snr = 10**(snr/10.0)
xpower = np.sum(x**2)/len(x)
npower = xpower / snr
return np.random.randn(len(x)) * np.sqrt(npower)
t = np.arange(0, 1000000) * 0.1
x = np.sin(t)
n = wgn(x, 6)
xn = x+n # 增加了6dBz信噪比噪声的信号
pl.subplot(211)
pl.hist(n, bins=100, normed=True)
pl.subplot(212)
pl.psd(n)
pl.show()