matlab - 向信号添加噪声的正确方法

标签 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

最佳答案

我添加了另一个答案,因为我觉得史蒂文的不太正确,而霍希勒关于查看函数 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),awgnawg 函数假设以下关系成立:

  np = var(y,1);        % linear scale
  np = 10*log10(np);    % in dB 

其中 var(...,1) 是噪声 y总体方差。

关于matlab - 向信号添加噪声的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23690766/

相关文章:

machine-learning - 语音识别实验在训练期间崩溃

.net - .NET 的 AWGN 生成器

java - 柏林噪音 - 我做错了什么?

java - 为什么噪声算法使用 256 个排列值?

matlab - 计算并显示出现的总和

Matlab - 线性回归 - 通过添加一列的 y 截距

c++ - 如何设置填充有 mxSetData 的 mxArray 的 classID?

mysql - 如何将.MYD 中的数据导入到 MATLAB 中?

matlab - 如何将归一化频率转换为实际频率

signal-processing - n 点的 FFT(非 2 的幂)