【问题标题】:How to add 5% Gaussian noise to the signal data如何在信号数据中添加 5% 的高斯噪声
【发布时间】:2021-01-12 09:56:08
【问题描述】:

我想为多元数据添加 5% 的高斯噪声。 这是方法

import numpy as np 
mu, sigma = 0, np.std(data)*0.05 
noise = np.random.normal(mu, sigma, data.shape)
noise.shape

这是信号。这是添加 5% 高斯噪声的正确方法吗

【问题讨论】:

  • 5% 是否意味着您只想扭曲实际信号的 5%?
  • 表示5%的高斯噪声,扭曲所有数据。如果我想两者都做怎么办。比如 5% 的数据有噪音,而 95% 没有

标签: python numpy signal-processing gaussian


【解决方案1】:

我认为您走在正确的轨道上,噪声本质上是加性的,如果您查看 (SNR) 信噪比计算

信噪比 = 20 * log(p_s)/(p_n)

这不过是

信噪比 = 20 (log(p_s) - log(p_n))

所以我们基本上是减去信号(有噪声)中的噪声功率

为整个信号添加噪声

我会和你发布的一样做

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(137)
t = np.linspace(0, 10, 100)
p = np.sin(t)
percentage = 0.05
n = np.random.normal(0, p.std(), t.size) * percentage
pn = p + n

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax1.set_title('Noise added to entire signal')
ax1.plot(t, p, label='pure signal')
ax1.plot(t, pn, label='signal+noise')

ax2 = fig.add_subplot(212)
ax2.plot(t, pn - p, label='added noise', c='r')
plt.legend()

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax1.set_title('Noise added to part of the signal')
ax1.plot(t, p, label='pure signal')
random_indices = np.random.randint(0, t.size, int(t.size*percentage))

pr = p.copy()
pr[random_indices] += n[random_indices]
ax1.plot(t, pr, label='signal+noise')

ax2 = fig.add_subplot(212)
ax2.plot(t, pr - p, label='added noise', c='r')
plt.legend()
plt.show()

注意

我注意到的一件有趣的事情是np.random.normal 对于非常小的方差值主要采样正值,因此最好缩放 5%,即用更高的方差值采样后的方差

【讨论】:

  • 为什么要添加 std(data) 而不是 std 1?
  • 我认为当常量在某种程度上与可用数据相关时,它只会提供更好的结果。但这只是选择问题,我没有任何数学依据。
  • 你有什么论文可以参考这个方法吗?
猜你喜欢
  • 2015-01-25
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2016-01-24
  • 2013-10-14
  • 2015-09-27
  • 2012-12-18
相关资源
最近更新 更多