如何产生高斯白(加性)噪声

问题

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]

MiscItems/2011-08-24 (last edited 2011-08-24 01:30:26 by ZoomQuiet)