给定 SNR 的高斯噪声生成 ?

信息处理 噪音 Python 高斯 信噪比
2022-02-21 19:04:42

我正在尝试添加一个正态分布到我模拟的信号(sig_noiseFree)的高斯噪声,以获得噪声信号(sig_noisy)。租见代码。

我根据自己的理解编写了自己的函数。可以请任何人确认我这样做是对的吗?尤其是噪声添加和 SNR 计算?

我有第二个问题:我知道变量“ k ”控制噪声水平,我如何设置 SNR 并生成合适的 k,以便获得所需 SNR 的噪声信号?先感谢您。

def SNR(sig, noise,dt):
    Signal = np.sum(np.abs(np.fft.fft(sig)*dt)**2)/len(np.fft.fft(sig))
    Noise = np.sum(np.abs(np.fft.fft(noise)*dt)**2)/len(np.fft.fft(noise))
    return (10 * np.log10(Signal/Noise))


def Gauss_noise(k,sig):
     return np.random.normal(scale=k*np.max(sig), size=len(sig))

def noisy_sig(sig,k, dt):
    return np.fft.ifft(np.fft.fft(sig)*dt+np.fft.fft(np.random.normal(scale= k*np.max(sig), size=len(sig)))*dt)/dt   

def main(argv):
    k = 2e-2                
    noise_g = Gauss_noise(k,sig_noiseFree)
    sig_noisy = noisy_sig(sig_noiseFree,k, dt)

if __name__ == "__main__":
main(sys.argv)
2个回答

由于还没有人回答这个问题,我会尽力做到这一点。请注意,我不是 DSP 专家。

我相信您的第一个功能是根据每个人的傅立叶变换计算信号和噪声平均功率。所以你最后会返回以分贝为单位的 SNR。

SNRdb=10log10PsignalPnoise

您的高斯噪声函数根据信号最大幅度的比例因子k生成噪声。由于您想根据信号缩放噪声幅度,我相信您需要以下关系:

k=AnoiseAsignal

每个A表示 RMS 幅度。可以使用以下等式生成:

k=1SNRlinear

或者,更清楚地说:

k=PnoisePsignal=Anoise2Asignal2

如果您获得了以分贝为单位的 SNR,并被要求根据它生成噪声,您可以使用以下等式:

k=110SNRdb10

在第三个函数中,您通过添加每个信号的频率分量来生成输出信号,但如果它只是一个加性高斯噪声,您可以将噪声添加到信号中。(我不太确定这一点)。

您还可以从您的 SNR 中生成以分贝为单位的线性 SNR,我曾经在我的一个项目中使用过此功能:

def linear_snr_from_db(snrdb):
    return 10.0 ** (snrdb/10.0)

我根据SNR 的维基百科页面和我的一点经验获得了所有方程式。

根据 Eduardo 上述理论,在代码中需要注意和做出的一项更改是在代码中将信号的最大(幅度)值更改为 rms(幅度),是吗?在 k*np.max(sig) 所在的行上,您需要创建 python 代码来计算 rms 幅度并将其替换为行中的 np.max(sig):

return np.random.normal(scale=k*np.max(sig), size=len(sig))