Matlab:计算两个高度相关的时域信号的信噪比(SNR)

Matlab: computing signal to noise ratio (SNR) of two highly correlated time domain signals

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

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

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

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

snr(original, (oscilloscope - original))

我得到的结果是 20.44 dB。 这对我来说似乎不太对劲,因为我本以为相关性如此之高,SNR 应该高得多?

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

感谢所有帮助。

谢谢

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

您可能会惊讶于即使如此适中的 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 = 1z = x + N(0,σ)),如果我们将 C(x,z) 表示为 x 和 [=15 之间的相关性=],而σ作为噪声标准差,我们实际上可以证明:

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