### AWGN 白噪声添加原理详解
#### 一、引言
AWGN(Additive White Gaussian Noise)是指在通信系统中普遍存在的加性白高斯噪声。这种类型的噪声具有两个重要特性:一是“白”,意味着它在所有频率上具有相同的功率谱密度;二是“高斯”,意味着噪声的概率分布遵循正态分布。AWGN模型广泛应用于模拟和数字通信系统的设计与分析之中。
#### 二、AWGN原理
在MATLAB中,无论是`wgn`还是`awgn`函数,实质上都是基于`randn`函数产生的噪声。`wgn`函数直接调用了`randn`函数生成高斯白噪声,而`awgn`函数则是在`wgn`的基础上进一步处理,用于向已知信号添加特定信噪比(SNR)的高斯白噪声。
#### 三、关键概念解析
##### 1. 信号强度
信号强度通常指的是信号的能量或功率。在连续时间情况下,信号强度可以通过计算信号的平方并对其进行积分来获得;在离散情况下,则是通过计算信号的平方后求和。
- **连续时间信号强度**:
\[
E_x = \int_{-\infty}^{\infty} |x(t)|^2 dt
\]
- **离散时间信号强度**:
\[
E_x = \sum_{n=-\infty}^{\infty} |x[n]|^2
\]
##### 2. SNR(信噪比)
SNR定义为信号的强度与噪声强度的比值,也可以理解为信号功率与噪声功率的比值。数学上表示为:
\[
SNR = \frac{P_{signal}}{P_{noise}}
\]
其中,\(P_{signal}\) 表示信号功率,\(P_{noise}\) 表示噪声功率。
#### 四、添加指定SNR噪声的方法
为了向信号中添加具有特定SNR的噪声,我们需要按照以下步骤操作:
1. **计算信号功率**:
\[
P_{signal} = \frac{1}{N} \sum_{n=1}^{N} |x[n]|^2
\]
其中,\(N\) 是信号的长度。
2. **计算噪声功率**:
给定SNR和信号功率后,可以根据以下公式计算所需的噪声功率 \(P_{noise}\):
\[
P_{noise} = \frac{P_{signal}}{10^{SNR/10}}
\]
3. **生成噪声**:
使用`randn`函数生成零均值的高斯随机序列,并根据所需的噪声功率调整其方差。
4. **调整噪声方差**:
\[
NOISE = \sqrt{P_{noise}} / std(NOISE0) * NOISE0
\]
其中,\(NOISE0\) 是未经调整的高斯随机序列,\(std(NOISE0)\) 是其标准差。
5. **添加噪声**:
将调整后的噪声添加到原始信号中得到带有噪声的信号:
\[
Y = X + NOISE
\]
#### 五、MATLAB示例
下面是一个MATLAB代码示例,展示了如何使用`awgn`函数向信号中添加特定SNR的噪声,并自定义了一个`noisegen`函数来实现同样的功能:
```matlab
% 构建仿真信号
fs = 5000; % 采样频率
f = 10; % 信号频率
k = 1024; % 数据点数量
n = 1:k;
X = 5*sin(2*pi*f/fs*n); % 原始信号
% 添加信噪比为10dB的噪声
Y = awgn(X, 10, 'measured'); % 加入信噪比为10dB的噪声
sigPower = sum(abs(X).^2) / length(X); % 求出信号功率
noisePower = sum(abs(Y - X).^2) / length(Y - X); % 求出噪声功率
SNR = 10*log10(sigPower / noisePower); % 由信噪比定义求出信噪比,单位为dB
% 自定义噪声函数
function [Y, NOISE] = noisegen(X, SNR)
NOISE0 = randn(size(X)); % 生成高斯随机序列
NOISE = NOISE0 - mean(NOISE0); % 减去均值
sigPower = 1/length(X) * sum(X.^2); % 求出信号功率
noise_variance = sigPower / (10^(SNR/10));
NOISE = sqrt(noise_variance) / std(NOISE0) * NOISE; % 调整噪声方差
Y = X + NOISE; % 添加噪声
noisePower = 1/length(NOISE) * sum(NOISE.^2); % 求出噪声功率
end
```
#### 六、结论
通过上述分析可以看出,向信号中添加具有特定SNR的AWGN白噪声是一种重要的技术手段,对于评估通信系统的性能至关重要。了解其基本原理以及如何在MATLAB等工具中实现这一过程,对于从事通信领域工作的工程师来说是非常有价值的。