AWGN 的功率谱密度和 SNR

信息处理 噪音 信噪比
2022-01-03 09:15:56

我在 MATLAB 中有一个 GMSK 调制器,并希望生成具有特定 SNR 的 AWGN,但我在弄清楚如何操作时遇到了一些问题。

我发现这个逐步过程可以生成具有指定功率谱密度 W0 的零均值高斯噪声:

  1. 形成高斯分布随机变量:w = randn(1,N)
  2. 地图顶部零均值:w = w - sum(w)/N
  3. 计算平均功率:Pw = sum(w.^2)/N
  4. 形式 w = w.*sqrt(W0*fs/Pw)

注意:正如 Deve 所指出的,步骤 2 和 3 应该是不必要的,因为 randn() 生成一个均值为零且幂为 1 的随机变量。但是,均值和幂可能会略微偏离,因为向量的长度是有限的。对于我的应用,忽略这些步骤会导致 SNR 不太准确。

那么,如何确定实现指定 SNR 所需的功率谱密度?我了解 SNR 定义为测量信号功率然后隔离似乎微不足道,但我该如何关联SNR=Ps/PnPs=1Nn=0N1s[n]2Pn=Ps/SNRPnW0

提前致谢!

编辑:使用 Deves 答案,我编写了以下代码:

s           = signal;
L           = length(s);

% Convert SNR from dB
SNRdB       = 10;
SNR         = 10^(SNRdB/10);

% Measure average power of signal
Ps          = sum(s.^2)/L;

% Calculate wanted noise power
Pn          = Ps/SNR;

% Generate random vector and ensure 0-mean 
w           = randn(1,L);
w           = w-sum(w)/L;

% Scale to wanted power
Pw          = 1/L*sum(w.^2);
w           = sqrt(Pn/Pw).*w;

% Measure resulting SNR
Pw_meas     = 1/L*sum(w.^2);
SNRdB_meas  = 10*log10( Ps/Pw_meas ); % Gives 10.0000

这是任何感兴趣的人的时域图:

时域中的信号和噪声

这似乎不是很多噪音 - 但我想计算SNRdB_meas是非常万无一失的。

[删除了 PSD 图]

2个回答

首先评论一下您的噪音产生过程。Matlab 函数randn()生成均值为零且平均功率为 1 的高斯噪声。因此步骤 2 和 3 已过时。

如果您想获得给定的 SNR,那么创建具有所需功率的噪声信号就像

w = w .* sqrt(P_n)

平均噪声功率在哪里P_n,可以通过您自己找到的方程式计算出来。实际上,您在第 4 步中正在做完全相同的事情,您也可以从中得出

P_n = W0 * fs

假设这fs是您系统的采样频率,因此等于带宽并使用Pw = 1.

这就是我计算 EbN0 的方式,您必须意识到它与 SNR 之间存在一些差异(取决于调制类型)。

%signal energy
calculate the mean symbol energy
% Bit energy for each symbol
Eb   = Es/bit_per_symbol;
EbNo = 10^(EbNo_dB/10);
% Noise variance   
No   = Eb/EbNo;                             
noise = sqrt(No/2)*(randn(1,length(symbol))+j*randn(1,length(symbol))); 
noise_symbol = symbol + noise;

我在几个系统中成功使用了上面的伪代码。您可能会注意您正在模拟的系统的特性:每个符号的位数、符号中的开销等。

您可能希望采用多个符号来更好地估计每个 Eb/N0 值。

我不太了解 GMSK 调制器,所以我不能给你一个工作代码,但我想你可以用上面的代码处理模拟。