正确的方法来增加信号噪音

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)

Buc*_*orn 8

我正在添加另一个答案,因为它让我觉得史蒂文不太正确,霍希勒建议查看内部功能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=1meas==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)的功率,则awgnawg函数假定以下关系成立:

  np = var(y,1);        % linear scale
  np = 10*log10(np);    % in dB 
Run Code Online (Sandbox Code Playgroud)

噪声var(...,1)总体方差在哪里y