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 = 1
;z = x + N(0,σ)
),如果我们将 C(x,z)
表示为 x
和 [=15 之间的相关性=],而σ
作为噪声标准差,我们实际上可以证明:
给定 0.9958 的相关值,这将产生 20.79dB 的 SNR,这与您的结果一致。
我从事 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 = 1
;z = x + N(0,σ)
),如果我们将 C(x,z)
表示为 x
和 [=15 之间的相关性=],而σ
作为噪声标准差,我们实际上可以证明:
给定 0.9958 的相关值,这将产生 20.79dB 的 SNR,这与您的结果一致。