我试图在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');
以下是输出图:
正如您所看到的,随着周期数的增加,预测相位滞后的误差减小。最终数值接管并且误差在非常低的值附近振荡。我真的只对为什么从2-60 pi出现如此强烈的误差减少感兴趣。这是一个别名问题吗?我不知道在互相关计算中它来自何处。
答案 0 :(得分:1)
这不是别名问题。 xcorr是两个信号之间相关性的估计。当您观察到更多信号时,您的估计会更好。对于m*pi
的低值,周期数很少,并且您对信号的观察非常有限。对于较高的m*pi
值,您可以更好地查看信号的模式,使用更多的周期来提供更好的估算。
当你想到一段正弦波时很容易理解。当您将此期间准确地对齐在另一个期间时,您将获得最大相关性。但是,当只有一个具有滞后的信号周期时,这种具有完整周期的对齐不会发生,因为边缘总是用0填充。