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

时间:2017-11-08 17:56:23

标签: matlab signal-processing

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

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

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

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

snr(original, (oscilloscope - original))

我得到的结果是20.44 dB。 这对我来说似乎不像我想的那样具有如此高的相关性,SNR应该高得多吗?

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

感谢所有帮助。

由于

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分: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结果。

enter image description here

我说这是一场非常好的比赛!

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

enter image description here

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