Contents
如何产生高斯白(加性)噪声
问题
freealbert ✆ [email protected] 发送至 python-cn`CPyU. 发件人当地时间 发送时间 22:06 (GMT-07:00)。发送地当前时间:下午6:26。 ✆ 日期 2011年8月23日 下午10:06 主题 [CPyUG] 请教:【科学计算】如何产生高斯白噪声,尤其是加性的
最近用Python写一个重构信号的算法,需要在原信号的基础上添加高斯白噪声。 我用中文和英文都Google了一下,并没有得到有用的结果。 搜索了scipy和numpy的help文档,也没有得到有帮助的信息。
不知有否有人曾经遇到过这个问题,是怎么解决的? 是不是就是用numpy.random.normal()产生随机数即可?(我们还没学过随机信号方面的知识,对这方面不是特别清楚) 还是是自己写的算法吗?如果是的话,请赐教下思路。
另外,对于加性高斯白噪声,也就是matlab里的awgn(signal,SNR) 如何在产生高斯白噪声的基础上,让信噪比是SNR的值,对于这一点,我完全没有任何头绪。
HYRY
HYRY [email protected] 发件人当地时间 发送时间 09:04 (GMT-07:00)。发送地当前时间:下午6:28。 ✆ 日期 2011年8月24日 上午9:04
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相同的效果。
1 '''
2 程序中用hist()检查噪声是否是高斯分布,psd()检查功率谱密度是否为常数。
3 '''
4 import numpy as np
5 import pylab as pl
6
7 def wgn(x, snr):
8 snr = 10**(snr/10.0)
9 xpower = np.sum(x**2)/len(x)
10 npower = xpower / snr
11 return np.random.randn(len(x)) * np.sqrt(npower)
12
13 t = np.arange(0, 1000000) * 0.1
14 x = np.sin(t)
15 n = wgn(x, 6)
16 xn = x+n # 增加了6dBz信噪比噪声的信号
17 pl.subplot(211)
18 pl.hist(n, bins=100, normed=True)
19 pl.subplot(212)
20 pl.psd(n)
21 pl.show()
反馈
创建 by -- ZoomQuiet [2011-08-24 01:30:27]