我正在添加另一个答案,因为我觉得 Steven 的答案并不完全正确,而 Horchler 建议查看函数 awgn 是一个很好的答案。
MATLAB 或 Octave(在通信工具箱中)都有一个函数 awgn,它添加(高斯白)噪声以达到所需的信噪比功率水平;以下是代码的相关部分(来自 Octave 函数):
if (meas == 1) % <-- if using signal power to determine appropriate noise power
p = sum( abs( x(:)) .^ 2) / length(x(:));
if (strcmp(type,"dB"))
p = 10 * log10(p);
endif
endif
if (strcmp(type,"linear"))
np = p / snr;
else % <-- in dB
np = p - snr;
endif
y = x + wgn (m, n, np, 1, seed, type, out);
正如您在计算p(输入数据的幂)的方式中看到的那样,Steven 的答案似乎并不完全正确。
您可以要求该函数计算数据阵列的总功率,并将其与您提供的所需信噪比值相结合,以计算添加噪声的适当功率水平。为此,您可以在可选输入中传递字符串“measured”,如下所示(请参阅 here 获取 Octave 文档或 here 获取 MATLAB 文档):
y = awgn (x, snr, 'measured')
这最终导致meas=1 和meas==1 在上面的代码中为真。函数awgn 然后使用传递给它的信号来计算信号功率,然后根据这个和所需的信噪比计算增加的噪声的适当功率电平。
正如文档进一步解释的那样
默认情况下,假定 snr 和 pwr 以 dB 和 dBW 为单位
分别。可以选择此默认行为,类型设置为
“D b”。在 type 设置为“linear”的情况下,假定 pwr 为
瓦特和信噪比是一个比率。
这意味着您可以传递负值或 0 dB 信噪比值。结果还取决于您传递的其他选项,例如字符串“measured”。
对于 MATLAB 案例,我建议阅读 documentation,它解释了如何在不同场景中使用函数 awgn。请注意,Octave 和 MATLAB 中的实现并不相同,噪声功率的计算应该相同,但可能有不同的选项。
这是来自wgn 的相关部分(上面由awgn 调用):
if (strcmp(type,"dBW"))
np = 10 ^ (p/10);
elseif (strcmp(type,"dBm"))
np = 10 ^((p - 30)/10);
elseif (strcmp(type,"linear"))
np = p;
endif
if(!isempty(seed))
randn("state",seed);
endif
if (strcmp(out,"complex"))
y = (sqrt(imp*np/2))*(randn(m,n)+1i*randn(m,n)); % imp=1 assuming impedance is 1 Ohm
else
y = (sqrt(imp*np))*randn(m,n);
endif
如果您想检查噪声的功率 (np),awgn 和 awg 函数假定以下关系成立:
np = var(y,1); % linear scale
np = 10*log10(np); % in dB
其中var(...,1) 是噪声y 的总体 方差。