Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

本文记录了加性高斯白噪声的原理,并给出了使用Python实现的源码。

加性高斯白噪声

概念

加性高斯白噪声(英语:Additive white Gaussian noise,AWGN)在通信领域中指的是一种功率谱函数是常数(即白噪声),且幅度服从高斯分布的噪声信号。因其可加性、幅度服从高斯分布且为白噪声的一种而得名。

公式推导

Matlab的库中有AWGN这个库,但如果要使用Python进行实现,要按照信噪比SRN公式进行推导。
$$
\begin{align*}
SNR &= 10 \log_{10}\frac{P_{\text{signal}}}{P_{\text{noise}}} \\
&= 10 \log_{10}\frac{\sum x^{2}}{\sum n^{2}}
\end{align*}
$$
其中,$x$为原始信号,$n$为噪声信号。设$N$为原始信号长度,则有
$$
\begin{equation*}
\vert n \vert = \frac{\sum x^{2}}{N \cdot 10^{\frac{SNR}{10}}}
\end{equation*}
$$

最后利用标准高斯分布对噪声信号进行放大,可以得到最终的噪声信号:
$$
\begin{equation*}
\text{noise} = \text{random}(N) \cdot \sqrt{\vert n \vert}
\end{equation*}
$$

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def AWGN(x, snr):
"""
Additive White Gaussian Noise
:param x: Raw Signal (vector)
:param snr: SNR (decibel)
:return: Received Signal With AWGN
"""
snr = 10 ** (snr / 10.0)
xpower = np.sum(x ** 2) / len(x)
npower = xpower / snr
if isinstance(x[0], complex):
noise = (np.random.randn(len(x)) + 1j * np.random.randn(len(x))) * np.sqrt(0.5 * npower) # Complex Number
else:
noise = np.random.randn(len(x)) * np.sqrt(npower) # Real Number
return x + noise

参考资料

Python计算信噪比(SNR)的完全指南