【问题标题】:Matlab: computing signal to noise ratio (SNR) of two highly correlated time domain signalsMatlab:计算两个高度相关的时域信号的信噪比(SNR)
【发布时间】:2017-11-08 17:56:23
【问题描述】:

我在生物信号采集领域工作。我做了一个如下详述的实验,现在正试图从数据中获得一些结果。

我在 Matlab 中有一个信号的文本文件。我将信号加载到波形发生器上,然后在示波器上记录发生器输出。 我将示波器记录的信号导入 Matlab。 原始信号与示波器信号的皮尔逊相关系数为0.9958(使用corrcoeff函数求得)。

我想计算示波器信号的 SNR(我称之为我的信号加上通过数模转换引入的任何噪声,反之亦然)。我附上了 2 个信号的 sn-p 以供参考。

所以我的原始信号是 X,示波器信号是 X + N。 我使用 snr 函数计算 SNR,如下所示。

snr(original, (oscilloscope - original))

我得到的结果是 20.44 dB。 这对我来说似乎是因为我会认为具有如此高的相关性,SNR 应该更高?

或者在这种情况下尝试计算 SNR 是否合适?

感谢所有帮助。

谢谢

编辑:几个结果与 Sleutheye 的模拟关系的图表

【问题讨论】:

    标签: matlab signal-processing


    【解决方案1】:

    您可能会惊讶于即使如此中等的 SNR 仍然会导致相当高的相关性。

    我进行了一个实验来说明相关性和信噪比估计之间的近似关系。由于我没有您的特定脑电图信号,因此我只使用了参考恒定信号和一些高斯白噪声。请记住,这种关系可能会受到信号和噪声的性质的影响,但它应该让您了解预期的结果。这个模拟可以用下面的代码来执行:

    SNR = [10:1:40];
    
    M = 10000;
    C = zeros(size(SNR));
    for i=1:length(SNR)
    
      x = ones(1,M);
      K = sqrt(sum(x.*x)/M)*power(10, -SNR(i)/20);
      z = x + K*randn(size(x));
      C(i) = xcorr(x,z,0)./sqrt(sum(x.*x)*sum(z.*z));
    end
    
    figure(1);
    hold off; plot(SNR, C);
    corr0 = 0.9958;
    hold on;  plot([SNR(1) SNR(end)], [corr0 corr0], 'k:');
    snr0 = 20.44;
    hold on;  plot([snr0 snr0], [min(C) max(C)], 'r:');
    
    xlabel('SNR (dB)');
    ylabel('Correlation');
    

    黑色水平虚线突出显示 0.9958 相关性测量结果,红色垂直虚线突出显示 20.44 dB SNR 结果。

    我会说这是一场相当不错的比赛!

    事实上,对于我模拟中的这种特定情况(x = 1;z = x + N(0,σ)),如果我们将C(x,z) 表示为xz 之间的相关性,并将σ 表示为噪声标准差,我们实际上可以证明:

       

    给定 0.9958 的相关值,这将产生 20.79dB 的 SNR,这与您的结果一致。

    【讨论】:

    • 这是一个很好的答案,谢谢。我使用corrcoef 而不是xcorr 获得了我的相关值。尽管以C(i) = xcorr(x,z,0)./sqrt(sum(x.*x)*sum(z.*z)); 的方式使用xcorr 与您正在计算的方式基本相同,但我的想法是否正确:covariance(x,z) / sqrt ( variance(x)*variance(z) ) 始终给出+/-1 之间的值,这与Pearson 的相同?另外,我不完全理解你的最后一个案例。我以前没见过公式 (correlation^2/(1-correlation^2)) = 噪声标准差?再次感谢
    • 另外,一个更微不足道的问题,但是为什么在 matlab 代码 (-SNR(i)) 和最后一种情况(与最后一部分相关)中你的 dB/幅度计算中存在负数我之前的评论)。
    • 1) wrt corrcoef vs xcorr:它们不相等。 xcorr(x,z,0) 计算 sum(x.*z)cov(x,z) = sum((x-mean(x)).*(z-mean(z)) 不同。此外,皮尔逊相关性未定义 2) 该公式特定于此处涉及的信号。涉及到一些推导(例如 E{sum(x.*x)} = M, E{sum(z.*z)} = M(1+σ^2), ...) 3)代码使用负号(对于 dB/mag),因为它计算相对于单一幅度信号的噪声幅度。如果我使用具有单一幅度的噪声并缩放信号,那么它将是一个正号。
    • 我运行了您的代码,除了将 x 更改为 10Hz 正弦波(具有幅度偏移)并使用 xcorr 和 corrcoef 计算相关性。正如您所说, xcorr 和 corrcoef 不一样(除非我删除幅度偏移)。对于 0.9958 的相关性,Pearson 方法 (corrcoef) 给出 24dB 的 SNR,互相关方法 (xcorr) 给出 19dB。在与我的 EEG 信号有关的情况下,EEG 在 0.5-100 Hz 之间被过滤,因此无论如何都去除了平均值(DC 偏移)。所以 corrcoef 和 xcorr 都给了我相同的结果(xcorr = 0.9955 和 corrcoef = 0.9958)。
    • K 的公式针对x 具有单一幂的特定情况进行了简化。因此,放置正弦波和没有单一功率的 EEG 信号会给出不正确的结果。我已将公式更新为更通用,它现在应该给出更接近不同信号的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2013-04-19
    • 1970-01-01
    • 2019-01-17
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多