【发布时间】:2021-01-09 07:16:59
【问题描述】:
从这个thread 开始,我需要一个对我的输入信号执行Additive White Gaussian Noise (AWGN) 的函数。
这是我的问题:
- 无法扩展到多个渠道
- 无法扩展到多批次
-
scale不在单个信号级别上
重要条件:
- 接受任何维度的numpy数组,只要最后一个轴是
time - 在
numpy.random.normal中,scale或标准偏差 (SD) 不是全局的,而是取决于每个信号的 SD。除非我对 AWGN 的预期实现是错误的,否则 SD 应该设置为整个数据集的 SD 还是硬编码?
到目前为止我做了什么:
import numpy as np
import matplotlib.pyplot as plt
def add_noise(data): # assume data shape is (batch,channel,time), but it can also support (batch,time), (batch,anything,whatever,channel,time)
time_axis = len(data.shape)-1
target_snr_db = 20
data_watts = data ** 2
sig_avg_watts = np.mean(data_watts, axis=time_axis)
sig_avg_db = 10 * np.log10(sig_avg_watts)
noise_avg_db = sig_avg_db - target_snr_db
noise_avg_watts = 10 ** (noise_avg_db / 10)
mean_noise = 0
noise_volts = np.random.normal(mean_noise, np.sqrt(noise_avg_watts), data.shape) # <-- problem here
# add noise to the original signal
noise_data = data + noise_volts
return noise_data
没关系,假设我们正在传递一个带有 1 个通道 (1,1,1000) 的信号:
x = np.random.rand(1,1,1000)
plt.plot(x[0,0])
plt.show()
y = add_awgn_noise(x)
plt.plot(y[0,0])
plt.show()
这不行好吧,想象一下传递一个有 10 个通道的信号(1,10,1000)
x = np.random.rand(1,10,1000)
y = add_awgn_noise(x)
这不行好吧,想象一下用 10 个通道传递 10 个信号(10,10,1000)
x = np.random.rand(1,10,1000)
y = add_awgn_noise(x)
【问题讨论】: