给信号添加指定信噪比SNR的噪声
计算信号的信噪比,给信号加噪。
1. 信噪比SNR
信噪比计算公式:
SNR(dB)=10log10PsignalPnoise 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)Z∼N(0,1),又因为Xnoise∼N(0,Pnoise)X_{noise}\sim N(0,P_{noise})Xnoise∼N(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)Xnoise∼N(μ,σ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=1∑NXnoise(i)2=N1i=1∑N[Xnoise(i)−0]2=Var(Xnoise)=σXnoise2
可以发现,高斯白噪声的功率等于其方差。因此,由Z∼N(0,1)Z\sim N(0,1)Z∼N(0,1),Xnoise∼N(0,Pnoise)X_{noise}\sim N(0,P_{noise})Xnoise∼N(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)X∼N(μX,σX2),Y∼N(μY,σY2)Y\sim N(\mu_Y,\sigma_Y^2)Y∼N(μ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+b∼N(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=σY2⇒a=σXσYb=μY−aμ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)
更多推荐



所有评论(0)