计算正弦波相位滞后时低频数据中的互相关问题

时间:2015-04-07 02:38:32

标签: matlab statistics cross-correlation

我试图在matlab中使用互相关来计算简单正弦波的相位滞后。这是一些代码,用于演示我看到的问题。 (如果您没有并行计算工具箱,则可以相应地调整k和n,并将" parfor"更改为" for")。

clear all;
close all;

%%
knownLag = 1;

k  = 100000;
n = k/1000;


lag = zeros(1, n);
percentError = zeros(1, n);
m = zeros(1, n);

parfor i = 1:n;
    m(i) = i*2;
    x  = linspace(0, m(i)*pi, k);

    y1 = sin(x);
    y2 = sin(x+knownLag);

    %%
    [cc2, lags] = xcorr(y1, y2, 'coeff');
    [mx, I] = max(cc2);

    dx  = (m(i)*pi)/(k-1);
    lag(i) = (abs(k-I)*dx);

    percentError(i) = (abs(lag(i)-knownLag)/knownLag)*100;

end

figure(1);
plot(m, percentError)
ylabel('Percent Error');
xlabel('m * pi');

%%
n    = 1;
x1   = linspace(0, m(n)*pi, k);
y11  = sin(x1);
y21  = sin(x1+knownLag);

figure(2);
hold on;
plot(x1, y11);
plot(x1+lag(n), y21);
plot(x1, y21);
legend('Sin wave w/o phase shift', '"Corrected" Sin wave', '"Uncorrected" Sin wave');
xlabel('x');
ylabel('y');
title('Plot of "Corrected" Sin wave with period = 2*pi');

n    = 5;
x1   = linspace(0, m(n)*pi, k);
y11  = sin(x1);
y21  = sin(x1+knownLag);

figure(3);
hold on;
plot(x1, y11);
plot(x1+lag(n), y21);
plot(x1, y21);
legend('Sin wave w/o phase shift', '"Corrected" Sin wave', '"Uncorrected" Sin wave');
xlabel('x');
ylabel('y');
title('Plot of "Corrected" Sin wave with period = 10*pi');

以下是输出图: Plot of error in predicted phase lag vs number of periods Single period correction Five period correction

正如您所看到的,随着周期数的增加,预测相位滞后的误差减小。最终数值接管并且误差在非常低的值附近振荡。我真的只对为什么从2-60 pi出现如此强烈的误差减少感兴趣。这是一个别名问题吗?我不知道在互相关计算中它来自何处。

1 个答案:

答案 0 :(得分:1)

这不是别名问题。 xcorr是两个信号之间相关性的估计。当您观察到更多信号时,您的估计会更好。对于m*pi的低值,周期数很少,并且您对信号的观察非常有限。对于较高的m*pi值,您可以更好地查看信号的模式,使用更多的周期来提供更好的估算。

当你想到一段正弦波时很容易理解。当您将此期间准确地对齐在另一个期间时,您将获得最大相关性。但是,当只有一个具有滞后的信号周期时,这种具有完整周期的对齐不会发生,因为边缘总是用0填充。

相关问题