Python向信号中添加不同强度dB的噪音

3 篇文章 8 订阅

Python向信号中添加不同强度dB的噪音

SNR(Signal Noise Ratio)信噪比

S N R = P s i g n a l P n o i s e SNR= \frac { P _ { signal } } { P _ { noise } } SNR=PnoisePsignal
为有用信号功率(Power of Signal)(Power of Signal)与噪声功率(Power of Noise)的比。

它的单位一般使用分贝(dB),其值为十倍对数信号与噪声功率比:
S N R ( d B ) = 10 log ⁡ 10 ( P s i g n a l P n o i s e ) \mathrm { SNR } ( \mathrm { dB } ) = 10 \log _ { 10 } \left( \frac { P _ { \mathrm { signal } } } { P _ { \mathrm { noise } } } \right) SNR(dB)=10log10(PnoisePsignal)

或者 S N R = 10 log ⁡ 10 ∑ n = 0 N − 1 x 2 ( n ) ∑ n = 0 N − 1 [ s ( n ) − x ( n ) ] 2 S N R = 10 \log _ { 10 } \frac { \sum _ { n = 0 } ^ { N - 1 } x^ { 2 } ( n ) } { \sum _ { n = 0 } ^ { N - 1 } [ s ( n ) - x( n ) ] ^ { 2 } } SNR=10log10n=0N1[s(n)x(n)]2n=0N1x2(n),其中x是干净信号,s是带噪信号

上面提到的信号功率其实就是信号的能量或强度,在连续的情况下就是对信号x平方后求积分,而在离散情况下就是使用对信号x平方后求和:

P_signal=np.sum(np.abs(x)**2)

在这里讨论给定原始干净信号(x)和噪音信号(d)的情况下,任务是向信号中添加合适强度(SNR)的噪音信号。
流程如下:

原始噪音(d)的信号强度:P_d
所需要的噪音强度:P_noise=P_signal / 10**(SNR / 10)
所需要产生的噪音:noise=np.sqrt(P_noise / P_d) * d
产生的噪音强度为(SNR)的含噪信号:NoiseSignal = x + noise

1 def Add_noise(x, d, SNR):
2     P_signal=np.sum(abs(x)**2)
3     P_d=np.sum(abs(d)**2)
4     P_noise=P_signal/10**(SNR/10)
5     noise=np.sqrt(P_noise/P_d)*d
6     return noise_signal=x+noise

注:1.产生噪音那使用开根号是因为开根号后的数乘上所有的噪音信号,这样在计算噪音强度的时候可以直接提出来。2.因为原本的噪音本身是有强度的所以需要除一下,而添加高斯白噪音的时候就不需要添加,是因为高斯白噪声本身的强度和其方差是一样的,是1

高斯白噪声均值为0方差为1,使用randn函数可以验证以下(sum(np.random.randn(10000, 1)**2)/10000),这里验证的信号长度不能太小了,所以在上面的流程中产生的噪音就直接是np.sqrt(P_noise ) * d,并且在matlab中的wgn函数中P_signal=np.sum(np.abs(x)**2) / len(x),他多了一个规范化步骤。下面是用python实现了以下matlab中的生成高斯白噪声的函数wgn:

1 def wgn(x, snr):
2	  P_signal = np.sum(abs(x)**2)/len(x)
3   P_noise = P_signal/10**(snr/10.0)
4   return np.random.randn(len(x)) * np.sqrt(P_noise)

注:在参考文档1中有个关于matlab中的wgn的小湾,可以注意一下
在这里插入图片描述

参考文档

1: matlab中噪声功率、噪声方差关系
2: 《Matlab在语音信号分析与合成中的应用》

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值