我在 MATLAB 中有一个 GMSK 调制器,并希望生成具有特定 SNR 的 AWGN,但我在弄清楚如何操作时遇到了一些问题。
我发现这个逐步过程可以生成具有指定功率谱密度 W0 的零均值高斯噪声:
- 形成高斯分布随机变量:w = randn(1,N)
- 地图顶部零均值:w = w - sum(w)/N
- 计算平均功率:Pw = sum(w.^2)/N
- 形式 w = w.*sqrt(W0*fs/Pw)
注意:正如 Deve 所指出的,步骤 2 和 3 应该是不必要的,因为 randn() 生成一个均值为零且幂为 1 的随机变量。但是,均值和幂可能会略微偏离,因为向量的长度是有限的。对于我的应用,忽略这些步骤会导致 SNR 不太准确。
那么,如何确定实现指定 SNR 所需的功率谱密度?我了解 SNR 定义为。测量信号功率然后隔离似乎微不足道,但我该如何关联到?
提前致谢!
编辑:使用 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 图]