【问题标题】:calculating SNR for a Signal计算信号的 SNR
【发布时间】:2014-02-21 21:14:36
【问题描述】:

我在 MATLAB 2008 R2 中的信号上添加了一些高斯白噪声

noisedSignal = awgn(signal, 25);% 25 is the SNR

但是当我在noisedSignal 中计算 SNR 时

snr = GetSNR(noisedSignal, noisedSignal-signal);

function SNR = GetSNR(signal, errorSignal)
    SNR = 20 * log10(sqrt(mean(signal.^2))/sqrt(mean(errorSignal.^2)));
end   

计算出的SNR 是 1.1818,不是 25。我错过了什么?

【问题讨论】:

  • 我无法重现您的结果。我可以用你的代码得到~25。
  • 你的输入信号是什么@lennon310

标签: matlab signal-processing


【解决方案1】:

您应该考虑到这一点:

  • awgn 假设信号具有单位功率
  • awgnSNR 参数以 dB 为单位
  • SNR 估计为信号功率除以噪声功率,或近似为噪声信号功率除以噪声功率。

请看下面的例子:

signal = randn(1,1e6); %// example signal with approximately unit power
S = mean(signal.^2); %// actual signal power
noisedSignal = awgn(signal, 25);
SN = mean(noisedSignal.^2); %// power of noised signal
N = mean((signal-noisedSignal).^2);
SN/N
10^(25/10)

这给了

ans =
  316.9019
ans =
  316.2278

因此计算的 SNR (SN/N) 与预期值 (10^(25/10)) 非常相似。

【讨论】:

  • 单位功率是什么意思?如果我的信号不是信号电源怎么办? cz 在我的情况下,我使用的信号是人类语音信号......同样在计算 SN/N 时,你不应该使用 RMS(SN)/RMS(N) 吗?为什么你只使用 SN 和 N 的均方?
  • @Kasparov92 我使用均方,因为这就是幂的含义:平方值的均值。 (在你的情况下,你有sqrt,然后乘以 20 得到 dB,所以它是一样的)。如果您的信号没有单位功率,您应该将awgnSNR 参数解释为不是SNR,而是作为噪声功率
  • 哦,我明白了,非常感谢@Luis,我希望我能支持你的回答,但我需要更多的声誉点数:$
  • @Kasparov92 欢迎您!很高兴我能帮忙:-)
  • 我尝试了具有不同范围的 mean(signal.^2) ,它们都是 ~ 1 .. cz randn 是基于正态分布还是什么?
猜你喜欢
  • 2013-04-19
  • 2021-05-15
  • 2019-01-17
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2014-07-25
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多