在许多领域,我发现在添加噪声时,我们会提到一些规范,例如零均值和方差。我需要在 Db 中添加 AWGN、有色噪声、不同 SNR 的均匀噪声。以下代码显示了我如何生成和添加噪声的方式。我知道 awgn()
函数,但它是一种黑匣子,不知道噪声是如何被添加的。那么,有人可以解释产生和添加噪音的正确方法吗?谢谢
SNR = [-10:5:30]; %in Db
snr = 10 .^ (0.1 .* SNR);
for I = 1:length(snr)
noise = 1 / sqrt(2) * (randn(1, N) + 1i * randn(1, N));
u = y + noise .* snr(I);
end
最佳答案
我添加了另一个答案,因为我觉得史蒂文的不太正确,而霍希勒关于查看函数 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 的答案似乎不太正确。
您可以要求该函数计算数据阵列的总功率,并将其与您提供的所需 s/n 值相结合,以计算添加噪声的适当功率级别。您可以通过在可选输入中传递字符串“measured”来执行此操作,如下所示(有关 Octave 文档,请参阅 here 或有关 MATLAB 文档,请参阅 here):
y = awgn (x, snr, 'measured')
这最终导致 meas=1
,因此 meas==1
在上面的代码中为真。函数 awgn
然后使用传递给它的信号来计算信号功率,然后根据这个和所需的 s/n 计算增加的噪声的适当功率电平。
正如文档进一步解释的那样
By default the snr and pwr are assumed to be in dB and dBW respectively. This default behavior can be chosen with type set to "dB". In the case where type is set to "linear", pwr is assumed to be in Watts and snr is a ratio.
这意味着您可以传递负值或 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
的总体方差。
关于matlab - 向信号添加噪声的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23690766/