1. 信噪比SNR

信噪比计算公式:
SNR(dB)=10log⁡10PsignalPnoise SNR(dB)=10\log_{10}\frac{P_{signal}}{P_{noise}} SNR(dB)=10log10PnoisePsignal
式中,PsignalP_{signal}Psignal是纯净信号的功率,PnoiseP_{noise}Pnoise是噪声的功率。已知信噪比SNR和纯净信号PsignalP_{signal}Psignal,由上式获得噪声信号的功率PnoiseP_{noise}Pnoise
Pnoise=Psignal10SNR10 P_{noise}=\frac{P_{signal}}{10^{\frac{SNR}{10}}} Pnoise=1010SNRPsignal

接下来向纯净信号XsignalX_{signal}Xsignal中加入指定信噪比SNR的噪声信号XnoiseX_{noise}Xnoise,获得含噪信号XmixX_{mix}Xmix。设一噪声信号ZZZ服从标准正态分布,即Z∼N(0,1)Z\sim N(0,1)ZN(0,1),又因为Xnoise∼N(0,Pnoise)X_{noise}\sim N(0,P_{noise})XnoiseN(0,Pnoise),所以功率为PnoiseP_{noise}Pnoise的噪声信号为

Xnoise=Pnoise×Z X_{noise}=\sqrt{P_{noise}}\times Z Xnoise=Pnoise ×Z
则,加噪后的信号为
Xmix=Xsignal+Xnoise=Xsignal+Pnoise×Z X_{mix}=X_{signal}+X_{noise}=X_{signal}+\sqrt{P_{noise}}\times Z Xmix=Xsignal+Xnoise=Xsignal+Pnoise ×Z

2. 编程实现

信噪比代码及其案例展示:

import numpy as np
import matplotlib.pyplot as plt
import random


def add_nosie(signal, snr_db):
    '''
    给纯净信号添加指定信噪比(dB)的噪声
    Input:
        signal: 纯净信号, ndarray
        snr_db: scalar value; unit: dB. eg: snr_db=-5
    Output:
        mix_signal: 含噪声信号
    '''
    signal_power = np.mean(signal ** 2) # P_signal
    noise_power = signal_power / (10 ** (snr_db / 10)) # P_noise
    noise = np.sqrt(noise_power) * np.random.randn(*signal.shape) # X_noise
    mix_signal = signal + noise
    return mix_signal


if __name__ == "__main__":
    # fix seed 
    random.seed(2024)
    np.random.seed(2024)
    
    # add noise
    signal = np.sin(np.arange(0, 2*np.pi, 0.1)) # 纯净信号
    mix_signal_1 = add_nosie(signal, snr_db=25) # 含噪信号
    mix_signal_2 = add_nosie(signal, snr_db=10)
    mix_signal_3 = add_nosie(signal, snr_db=-1)
    
    # plot
    _, axs = plt.subplots(nrows=1, ncols=3, figsize=(9, 4))
    axs[0].plot(signal, color='k',label='signal')
    axs[0].plot(mix_signal_1, color='r', linestyle='--', alpha=0.6, label='mix_signal')
    axs[0].set_title('SNR=25 dB')
    axs[0].legend(loc="lower left", framealpha=0)
    
    axs[1].plot(signal, color='k',label='signal')
    axs[1].plot(mix_signal_2, color='r', linestyle='--', alpha=0.6, label='mix_signal')
    axs[1].set_title('SNR=10 dB')
    axs[1].legend(loc="lower left", framealpha=0)
    
    axs[2].plot(signal, color='k',label='signal')
    axs[2].plot(mix_signal_3, color='r', linestyle='--', alpha=0.6, label='mix_signal')
    axs[2].set_title('SNR=-1 dB')
    axs[2].legend(loc="lower left", framealpha=0)
    
    plt.savefig(r'E:\newDesktop\计算信噪比\sig.svg', format='svg')

结果:

在这里插入图片描述

3. 知识点回顾

1)高斯白噪声功率与方差关系

一般认为高斯白噪声服从正态分布Xnoise∼N(μ,σ2)X_{noise}\sim N(\mu,\sigma^2)XnoiseN(μ,σ2),且噪声的均值一般为0,即μ=0\mu=0μ=0。则噪声信号XnoiseX_{noise}Xnoise的功率
Pnoise=1N∑i=1NXnoise(i)2=1N∑i=1N[Xnoise(i)−0]2=Var(Xnoise)=σXnoise2 P_{noise}=\frac{1}{N}\sum_{i=1}^{N}X_{noise}(i)^2=\frac{1}{N}\sum_{i=1}^{N}[X_{noise}(i)-0]^2=Var(X_{noise})=\sigma_{X_{noise}}^2 Pnoise=N1i=1NXnoise(i)2=N1i=1N[Xnoise(i)0]2=Var(Xnoise)=σXnoise2
可以发现,高斯白噪声的功率等于其方差。因此,由Z∼N(0,1)Z\sim N(0,1)ZN(0,1)Xnoise∼N(0,Pnoise)X_{noise}\sim N(0,P_{noise})XnoiseN(0,Pnoise)得,Xnoise=Pnoise×ZX_{noise}=\sqrt{P_{noise}}\times ZXnoise=Pnoise ×Z.

2)高斯分布采样

先回顾两个公式,后面需要用:
E[aX+b]=aE[X]+bVar[aX+b]=a2Var[X] E[aX+b]=aE[X]+b \\ Var[aX+b]=a^2Var[X] E[aX+b]=aE[X]+bVar[aX+b]=a2Var[X]

有两个随机变量X和Y服从高斯分布,其中X∼N(μX,σX2)X\sim N(\mu_X,\sigma_X^2)XN(μX,σX2)Y∼N(μY,σY2)Y\sim N(\mu_Y,\sigma_Y^2)YN(μY,σY2),现从随机变量XXX中采样获得YYY。设随机变量aX+baX+baX+b,可得其分布aX+b∼N(aμX+b,a2σX2)aX+b\sim N(a\mu_X+b,a^2\sigma_X^2)aX+bN(aμX+b,a2σX2),可以求出a,ba,ba,b
{aX+b=YaμX+b=μYa2σX2=σY2⇒a=σYσXb=μY−aμX \left\{ \begin{array}{l} aX + b = Y \\ a\mu_X + b = \mu_Y \\ a^2\sigma_X^2 = \sigma_Y^2 \end{array} \right. \quad \Rightarrow \quad \begin{array}{l} a=\frac{\sigma_Y}{\sigma_X} \\ b=\mu_Y-a\mu_X \end{array} aX+b=YaμX+b=μYa2σX2=σY2a=σXσYb=μYaμX

从随机变量XXX中采样获得YYY
Y=σYσXX+(μY−σYσXμX) Y=\frac{\sigma_Y}{\sigma_X}X+(\mu_Y-\frac{\sigma_Y}{\sigma_X}\mu_X) Y=σXσYX+(μYσXσYμX)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐