MATLAB分析与仿真白噪声
MATLAB分析与仿真白噪声
白噪声是一种在通信和信号处理领域经常遇到的随机信号。本文将详细介绍白噪声的定义、特性以及如何使用MATLAB进行仿真与分析。通过本文,读者将了解白噪声的功率谱密度、高斯白噪声的生成方法,并掌握如何使用MATLAB代码进行相关实验。
白噪声:使用 MATLAB 进行仿真与分析
定义
一个具有恒定功率谱密度(PSD)函数的随机过程(或信号)被称为白噪声过程。
功率谱密度
功率谱密度函数(PSD)显示了每个频谱分量中包含的功率。例如,对于一个固定频率的正弦波,PSD 图将只包含一个频谱分量,位于给定频率处。PSD 是一个偶函数,因此在绘制时,频率分量会在 Y 轴两侧对称分布。因此,对于一个固定频率的正弦波,双边的 PSD 图将有两个分量——一个在正频率处,另一个在负频率处。
高斯和白噪声
白噪声信号(过程)由一组独立同分布(i.i.d)的随机变量构成。在离散情况下,白噪声信号由一系列独立且从相同概率分布生成的样本组成。例如,你可以使用随机数生成器生成一个白噪声信号,其中所有样本都遵循给定的高斯分布。这被称为白高斯噪声(WGN)或高斯白噪声。同样,从均匀分布生成的白噪声信号被称为均匀白噪声。
高斯噪声和均匀噪声经常用于系统建模。在建模/仿真中,可以使用适当的随机生成器生成白噪声。白高斯噪声可以使用 MATLAB 中的 randn
函数生成,该函数生成遵循高斯分布的随机数。同样,rand
函数可以用于生成遵循均匀分布的均匀白噪声。当使用随机数生成器时,它会生成一系列来自给定分布的随机数。让我们以生成一个长度为 10 的白高斯噪声为例,使用 MATLAB 中的 randn
函数——均值为 0,标准差为 1。
mu = 0;
sigma = 1;
noise = sigma * randn(1, 10) + mu
这将生成类似以下的输出:
noise = -1.5121 0.7321 -0.1621 0.4651 1.4284 1.0955 -0.5586 1.4362 -0.8026 0.0949
什么是独立同分布(i.i.d)?
这生成了 10 个来自标准正态分布的随机数。正如我们所知,白噪声过程被视为由多个遵循相同概率分布函数(PDF)的随机变量组成的随机过程。上面的 10 个随机数是从相同的 PDF(标准正态分布)生成的。这种情况被称为“同分布”条件。上面的各个样本彼此“独立”。此外,每个样本可以被视为一个随机变量的实现。实际上,我们生成了一个由 10 个随机变量的实现组成的随机过程。因此,上述过程由“独立同分布”(i.i.d)随机变量构成。
严格和弱定义的白噪声
由于白噪声过程是由 i.i.d 随机变量/样本构成的,所有样本都遵循相同的基础概率分布函数(PDF)。因此,该过程的联合概率分布函数不会随时间的变化而变化。这被称为平稳过程。因此,这种噪声是一个平稳过程。正如平稳过程可以分为严格平稳(SSS)和宽平稳(WSS)过程,我们可以有严格定义的白噪声和弱定义的白噪声。相应地,它们可以被称为严格定义的白噪声信号和弱定义的白噪声信号。
协方差函数/矩阵的作用是什么?
弱定义的白噪声信号,记为 x(t),是一个更实际的条件。在这里,样本在统计上是不相关的,并且同分布,方差等于 σ。这个条件通过使用协方差函数来指定:
为什么我们需要协方差函数?因为,我们正在处理一个由 n 个随机变量组成的随机过程(在上面的建模示例中有 10 个变量)。这样的过程被视为多元随机向量或多元随机变量。
对于多元随机变量,协方差函数指定了给定随机过程中每个 n 个变量相对于彼此的行为。协方差函数将方差的概念推广到多个维度。
上述方程以矩阵形式表示时,给出了白噪声随机过程的协方差矩阵。由于该过程中的随机变量在统计上是不相关的,协方差函数仅在主对角线上有值。
上面的矩阵表明,每个随机变量只存在自相关函数。互相关值为零(样本/变量在统计上彼此不相关)。对角线元素等于方差,矩阵中的所有其他元素为零。弱定义的白噪声的集合自相关函数由下式给出。这表明弱定义的白噪声过程的自相关函数在滞后 τ=0 处为零。
频域特性
Wiener-Khintchine 定理指出,对于宽平稳过程(WSS),随机过程的功率谱密度函数 Sxx(f) 可以通过对随机过程的自相关函数进行傅里叶变换得到。在连续时间域中,这表示为
对于弱定义的白噪声过程,我们发现均值是一个常数,其协方差不随时间变化。这是 WSS 过程的充分条件。因此,我们可以应用 Wiener-Khintchine 定理。因此,弱定义的白噪声过程的功率谱密度在整个频谱上是恒定的(平坦的)(图 1)。常数的值等于噪声信号的方差或功率。
在 MATLAB 中测试白高斯噪声的特性
使用 MATLAB 中的 randn
函数生成长度为 L=100,000 的高斯白噪声信号并绘制它。假设 pdf 是均值为 μ=0,标准差为 σ=2 的高斯 pdf。因此,高斯 pdf 的方差为 σ。高斯随机变量的理论 PDF 由下式给出:
clear all; clc; close all;
L = 100000; % 随机信号的样本长度
mu = 0;
sigma = 2;
X = sigma * randn(L, 1) + mu;
figure();
subplot(2, 1, 1)
plot(X);
title(['白噪声 : \mu_x=', num2str(mu), ' \sigma^2=', num2str(sigma^2)])
xlabel('样本')
ylabel('样本值')
grid on;
绘制直方图生成的噪声信号,并通过绘制高斯随机变量的理论 pdf 来验证直方图。
subplot(2, 1, 2)
n = 100; % 直方图的分箱数
[f, x] = hist(X, n);
bar(x, f / trapz(x, f)); hold on;
% 高斯随机变量的理论 PDF
g = (1 / (sqrt(2 * pi) * sigma)) * exp(-((x - mu).^2) / (2 * sigma^2));
plot(x, g); hold off; grid on;
title('白高斯噪声的理论 PDF 和模拟直方图');
legend('直方图', '理论 PDF');
xlabel('分箱');
ylabel('PDF f_x(x)');
计算白噪声的自相关函数。计算的自相关函数必须适当缩放。如果使用 MATLAB 内置的 xcorr
函数计算自相关函数,请使用 biased
参数以正确缩放。
figure();
Rxx = 1 / L * conv(flipud(X), X);
lags = (-L + 1):1:(L - 1);
% 替代方法
% [Rxx, lags] = xcorr(X, 'biased');
% 参数 'biased' 用于通过 1/L 进行适当缩放
% 通过样本长度归一化自相关以进行适当缩放
plot(lags, Rxx);
title('白噪声的自相关函数');
xlabel('滞后')
ylabel('相关性')
grid on;
模拟 PSD
模拟功率谱密度(PSD)的白噪声有点棘手。这里有两个问题:1)生成的样本长度有限。这等同于截断无限系列的随机样本。这意味着滞后是在固定范围内定义的。2)仿真中使用的随机数生成器是伪随机生成器。由于这两个原因,当你对生成的自相关值应用傅里叶变换时,你将不会得到平坦的 psd 频谱。通过生成长度足够长的随机信号并在多个随机信号实现上平均 psd,可以最小化 psd 的波动效应。
将高斯白噪声模拟为多元高斯随机向量
为了验证白噪声的功率谱密度,我们将使用将噪声视为 N 个高斯随机变量的组合的方法。我们希望在 L 个这样的实现上平均 PSD。由于每个实现有 N 个高斯随机变量(N 个独立样本),协方差矩阵 的维度为 N×N。对于这种多元情况,均值向量将是 1×N 维的。
Cholesky 分解 协方差矩阵给出了多元情况的等效标准差。Cholesky 分解可以视为平方根操作。这里使用 MATLAB 的 randn 函数生成具有给定均值矩阵和协方差矩阵的多维高斯随机过程。
% 验证白高斯噪声过程的恒定 PSD
% 具有任意均值和标准差 sigma
mu = 0; % 噪声过程每个实现的均值
sigma = 2; % 噪声过程每个实现的 sigma
L = 1000; % 要平均的随机信号实现的数量
N = 1024; % 每个实现的样本长度设置为 2 的幂以进行 FFT
% 生成随机过程 - 白高斯噪声过程
MU = mu * ones(1, N); % 所有实现的均值向量
Cxx = (sigma^2) * diag(ones(N, 1)); % 随机过程的协方差矩阵
R = chol(Cxx); % 协方差矩阵的 Cholesky 分解
% 生成具有给定均值向量和协方差矩阵 Cxx 的多元高斯分布
z = repmat(MU, L, 1) + randn(L, N) * R;
计算上述生成的多维过程的 PSD 并对其进行平均以获得平滑的图。
% 默认情况下,FFT 是在每列上进行的 - 正常命令 fft(z)
% 在每行上找到多元分布的 FFT
% 命令 - fft(z,[],2)
Z = 1 / sqrt(N) * fft(z, [], 2); % 通过 sqrt(N) 缩放;
Pzavg = mean(Z .* conj(Z)); % 从 fft 计算平均功率
normFreq = [-N / 2:N / 2 - 1] / N;
Pzavg = fftshift(Pzavg); % 将零频率分量移到频谱中心
plot(normFreq, 10 * log10(Pzavg), 'r');
axis([-0.5 0.5 0 10]); grid on;
ylabel('功率谱密度 (dB/Hz)');
xlabel('归一化频率');
title('白噪声的功率谱密度');
生成的噪声的 PSD 图显示在所有频率上功率几乎恒定。换句话说,对于白噪声信号,PSD 在所有频率(-∞ 到 +∞)上是恒定的(平坦的)。上图中的 y 轴以 dB/Hz 为单位表示。我们可以从图中看到,。