我不习惯使用 Matlab 的 awgn() 函数,因为很难理解实际发生了什么。因此,我想确认以下方法是否正确生成特定信噪比为 30 dB 的噪声样本以及复杂域中数据的特定方差。
使用 Matlab 正确生成复杂的高斯白噪声
信息处理
matlab
噪音
2022-02-21 13:06:04
2个回答
请参阅下面的代码,它会在给定的 SNR 下产生一些噪声:
N = 100000;
% Generate some random signal
signal = randn(N, 1) + 1j*randn(N,1);
% Here, the signal power is 2 (1 for real and imaginary component)
signalPower_lin = 1/N*signal'*signal
% This corresponds to 3dB (assuming power=1 is 0dB)
signalPower_dB = 10*log10(signalPower_lin)
noisePower_dB = signalPower_dB - 30 % do 30dB SNR
noisePower_lin = 10^(noisePower_dB/10)
noise = sqrt(noisePower_lin/2) * (randn(N,1) + 1j*randn(N,1));
received = signal + noise;
程序输出:
signalPower_lin =
2.0042 + 0.0000i
signalPower_dB =
3.0193 + 0.0000i
noisePower_dB =
-26.9807 + 0.0000i
noisePower_lin =
0.0020 + 0.0000i
请注意,生成方差为 1 的复杂噪声,您需要这样做
noise = sqrt(1/2) * (randn(N,1) + 1j*randn(N,1))
由于每个分量(实部和虚部)都需要具有 1/2 的方差,因此它们的总和变为 1。
回答您的观点:1)根据经验,何时使用 20,何时使用 10:如果您描述功率或能量,则因子为 10。如果描述幅度,则因子为 20。然后,以 dB 为单位两者都将具有相同的值,因为:
因此,只要您使用的值在平方(如幅度)时会产生有意义的值,请使用 20。每次,当从平方根(如幂)中获取有意义的值时,请使用 10。
请注意,在我的代码中,我使用noise = sqrt(noise_power/2) * randn(...)生成噪声,即在乘以正常随机变量之前将噪声功率转换为噪声幅度(这对应于将指数中的因子 10 更改为 20)。还要记住规则
这正是您需要取功率平方根的原因,以便您产生的噪声具有所需的功率。
2) 在这里,我只是转换noisePower_db成noisePower_linear,根据定义linear=10^(db/10)。注意是相似的,因为SNR=Signal/Noise,即噪声在分母中(考虑.
- 由于您正在对幅度求和,因此您需要使用 10^(-SNR/20)。
- 您对噪声使用高斯分布,但对信号使用均匀分布。rand() 和 randn() 工作方式不同,导致信号功率不同。
其它你可能感兴趣的问题