##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> = 如何产生高斯白(加性)噪声 = ##startInc == 问题 == {{{ freealbert ✆ jim2429212@gmail.com 发送至 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 ruoyu0088@gmail.com 发件人当地时间 发送时间 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相同的效果。 }}} {{{ #!python ''' 程序中用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() }}} ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]