gpt4 book ai didi

Python Numpy 加性高斯白噪声函数

转载 作者:行者123 更新时间:2023-12-04 03:43:00 31 4
gpt4 key购买 nike

继续 thread , 我需要一个函数 Additive White Gaussian Noise (AWGN)在我的输入信号上。

这是我的问题:

  • 无法扩展到多个 channel
  • 无法扩展到多个批处理
  • 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 个 channel 的信号 (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 个 channel 的信号 (1,10,1000)

x = np.random.rand(1,10,1000)
y = add_awgn_noise(x)

不行好吧,想象一下用 10 个 channel 传递 10 个信号 (10,10,1000)

x = np.random.rand(1,10,1000)
y = add_awgn_noise(x)

最佳答案

为了让 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) 个轴的索引。换句话说,对于每个(信号、 channel )对,噪声在信号的整个时间序列中将具有相同的标准偏差。

关于Python Numpy 加性高斯白噪声函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65640257/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com