我是靠谱客的博主 长情小丸子,最近开发中收集的这篇文章主要介绍用python给数据加上高斯噪声,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

用python给数据加上高斯噪声

    • 1. 回顾MATLAB中的加高斯噪声
    • 2. Python中利用numpy给数据加噪声

一开始用MATLAB给数据加噪声很简单,就一句话:

% 给数据加指定SNR的高斯噪声
signal_noise = awgn(signal,SNR,'measured');

但用python实现加噪声的时候遇到一个小问题,也是由于本人愚钝的原因吧。

1. 回顾MATLAB中的加高斯噪声

常用方法:

% 给数据加指定SNR的高斯噪声
signal_noise = awgn(signal,SNR,'measured');
Ps=sum(sum((signal-mean(mean(signal))).^2));
%signal power
Pn=sum(sum((signal-signal_noise).^2));
%noise power
snr=10*log10(Ps/Pn);
%验证所加的噪声

这里的signal 是一个二维的数据矩阵,所以后面的操作都是矩阵的操作。MATLAB中运行完全没有问题。

2. Python中利用numpy给数据加噪声

本文方法:

# 给数据加指定SNR的高斯噪声
SNR = 5
noise = np.random.randn(signal.shape[0],signal.shape[1])
#产生N(0,1)噪声数据
noise = noise-np.mean(noise)
#均值为0
signal_power = np.linalg.norm( signal - signal.mean() )**2 / signal.size	#此处是信号的std**2
noise_variance = signal_power/np.power(10,(SNR/10))
#此处是噪声的std**2
noise = (np.sqrt(noise_variance) / np.std(noise) )*noise
##此处是噪声的std**2
signal_noise = noise + signal
Ps = ( np.linalg.norm(signal - signal.mean()) )**2
#signal power
Pn = ( np.linalg.norm(signal - signal_noise ) )**2
#noise power
snr = 10*np.log10(Ps/Pn)

有很多人在产生给定SNR的高斯噪声时,用的是:

signal_power = np.linalg.norm( signal )**2
noise_variance = signal_power/np.power(10,(SNR/10))
noise = np.sqrt(noise_variance)*noise + 0

这里实际上是有问题的,我一开始也没发现。因为产生分布为N(mean,std**2)的噪声我们用的公式是:
noise = std * N(0,1) + mean
换句话说,我们需要计算噪声的std 以及 mean 。计算噪声的 std 时,需要先计算信号的 std,然后利用SNR来求出噪声的 std ,从上面的代码中能发现,signal_power 代表的是信号的std^2signal.size 的乘积,多乘了一个signal.size 那结果肯定是有问题的。

最后

以上就是长情小丸子为你收集整理的用python给数据加上高斯噪声的全部内容,希望文章能够帮你解决用python给数据加上高斯噪声所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部