SKM*_*SKM 10 matlab signal-processing noise
在许多领域,我发现在添加噪声的同时,我们提到了一些规范,如零均值和方差.我需要在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
Run Code Online (Sandbox Code Playgroud)
我正在添加另一个答案,因为它让我觉得史蒂文不太正确,霍希勒建议查看内部功能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);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样p(输入数据的力量)被计算出来,史蒂文的答案看起来并不完全正确.
您可以要求该函数计算数据阵列的总功率,并将其与您提供的所需s/n值相结合,以计算增加噪声的适当功率级别.您可以通过在可选输入中传递字符串"measured"来完成此操作(请参阅此处的Octave文档或此处的MATLAB文档):
y = awgn (x, snr, 'measured')
Run Code Online (Sandbox Code Playgroud)
这导致最终meas=1等meas==1是在上面的代码实现.awgn然后,该函数使用传递给它的信号来计算信号功率,然后根据它和所需的s/n计算增加噪声的适当功率电平.
正如文档进一步解释
默认情况下,假设snr和pwr分别为dB和dBW.可以选择类型设置为"dB"的默认行为.在类型设置为"线性"的情况下,假设pwr为瓦特,snr为比率.
这意味着您可以传递负值或0 dB snr值.结果还取决于您传递的其他选项,例如字符串"measured".
对于MATLAB案例,我建议阅读文档,它解释了如何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
Run Code Online (Sandbox Code Playgroud)
如果要检查噪声(np)的功率,则awgn和awg函数假定以下关系成立:
np = var(y,1); % linear scale
np = 10*log10(np); % in dB
Run Code Online (Sandbox Code Playgroud)
噪声var(...,1)的总体方差在哪里y?
| 归档时间: |
|
| 查看次数: |
40223 次 |
| 最近记录: |