计算两个正弦曲线的相关性

信息处理 matlab 信号分析 相关性
2022-02-22 08:24:10

首先,我为这个冗长的问题道歉。我正在使用 3 轴加速度计和 3 轴陀螺仪,我需要计算不同信号之间的相关性(x、y、z 中的加速度和四元数 x、y、z、w)。最后,我需要得到 21 个相关性,每对一个。我正在考虑使用标准的Pearson 产品矩相关系数特别是“样本”部分中的第二个公式,它使用标准分数、样本均值和样本标准差。

现在,我将这些相关性计算为分类器的特征。我在一个窗口大小上计算这些特征。我现在将介绍一些 MATLAB 代码来帮助说明我正在尝试做的事情。

首先,我们有一个离散的正弦和余弦。

t = [0:1:600]; %time samples
f = 1/2; %input signal frequency
fs = 100; %sampling frequency
x = sin(2*pi*f/fs*t); %generate sine
figure(1);
stem(t,x,'r');
figure(2);
stem(t*1/fs*1000,x,'r');
hold on;
plot(t*1/fs*1000,x);
y = cos(2*pi*f/fs*t); %generate cosine
figure(3);
stem(t,y,'r');
figure(4);
stem(t*1/fs*1000,y,'r');
hold on;
plot(t*1/fs*1000,y);

现在,我使用以下代码获得了 50 次测量窗口的皮尔逊系数(注意这相当于一个周期的四分之一)。这可以很容易地针对不同大小的窗口进行更改,但为了简单起见,我现在将离开 50。

xMean = sum(x(1:50))/50;
yMean = sum(y(1:50))/50;
tmpX = x(1:50) - xMean;
tmpY = y(1:50) - yMean;
stdDevX = sqrt((sum(tmpX .* tmpX)) / 49);
stdDevY = sqrt((sum(tmpY .* tmpY)) / 49);
stdScoreX = tmpX ./ stdDevX;
stdScoreY = tmpY ./ stdDevY;
stdScores = stdScoreX .* stdScoreY;
r = sum(stdScores)/49 

这给出了等于 -0.9183 的 r(皮尔逊系数)。从 x 与 y 的散点图来看,这是有道理的:

在此处输入图像描述

我得到了散点图:

figure(5);
scatter(x(1:50),y(1:50));

不同的窗口具有不同的 Pearson 系数,要么接近 1 的值,要么接近 -1 的值,这从其他窗口中 x 与 y 的散点图来看是有意义的。第二个窗口的 r = 0.9183。第三个窗口的值将再次接近 -1。这个窗口没有任何重叠。

现在,如果我将窗口大小更改为 100 个样本,情况就会发生变化。

在此处输入图像描述

同样的故事,窗口大小为 200,但现在它看起来像一个圆圈。现在可以看到(并且计算也证实了这一点)相关性为 0 或非常接近 0 的值。

所以我的问题毕竟是……为这种类型的周期性信号计算相关性的正确方法是什么?还是这两种方式都正确?最好我想获得一个接近 -1、0 或 1(离散)的数字,因为这些数字将是分类器中的输入特征。我知道,例如,同相的两个正弦函数的相关性接近 1(或 1,取决于噪声,但这是另一个问题)。我的主要问题是我展示的示例中的相关性。所以,也许我应该计算一个窗口大小,该窗口大小至少是一个周期的长度,以获得 0 或 1,但我并不完全确定。

谢谢!

0个回答
没有发现任何回复~