接着这个线程,我需要一个可以在我的输入信号上执行加性白高斯噪声(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)