【问题标题】:Python Numpy Additive White Gaussian Noise FunctionPython Numpy 加性高斯白噪声函数
【发布时间】: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)

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    为了让 np.random.normal 调用中不同形状的数组一起广播,您必须手动告诉 numpy 您要沿哪个轴广播 noise_avg_watts

    noise_volts = np.random.normal(mean_noise, np.sqrt(noise_avg_watts)[..., np.newaxis], data.shape)
    

    注意[..., np.newaxis]

    如果我理解正确,noise_avg_watts 是一个形状像 (s[0], s[1], ..., s[n-1]) 的数组,其中数据的形状像 (s[0], s[1], ..., s[n-1], s[n]);即每个时间序列有一个标量数(最后一个轴是时间序列轴)。因此,为了使其与data 的形状兼容,我们希望在时间序列轴上“广播”平均值,这就是我们对[..., np.newaxis] 所做的事情。

    这使得 numpy 将此数组视为与数据相同的形状,对于每个 (n-1) 元组,最后一个轴中的所有值都是相同的(因为它是该轴的平均值)前 (n-1) 个轴的索引。换言之,对于每个(信号、通道)对,噪声在信号的整个时间序列中将具有相同的标准偏差。

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2011-09-12
      • 2013-10-14
      • 2015-02-04
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多