0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是互相关函数

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-10 09:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

[导读] 在工程应用时,有时候需要计算两个信号序列的相似度,实际信号由于在采集过程中会混入干扰,如果简单的依次比较各样本是否相等或者差值,则很难判定两个信号序列的相似程度。本文来聊聊我的一些思路。

什么是互相关函数?在统计学中,相关是描述两个随机变量序列或二元数据之间的统计关系,无论是否具有因果关系。广义上讲,相关性是统计上的关联程度,它通常指的是两个变量的线性相关的程度。比如商品的价格和消费者购买愿意数量之间的关系,也即所谓的需求曲线。

相关性是有用的,因为它们可以描述一种可在实践中加以利用的预测作用。例如,根据电力需求和天气之间的相关性,电力公司可能会在天气凉快时候生产更少的电力。在这个例子中,有一定的因果关系存在,因为极端天气导致人们使用更多的电力用于取暖或制冷。然而,一般而言,相关性的存在并不足以推断出因果关系的存在,也就是说相关性并不意味着因果关系。

连续信号里,为函数及的互相关函数定义为:

离散信号,假设两个信号序列x(n)及y(n),每个序列的能量都是有限能量序列,则x(n)及y(n)的互相关序列为:

那么互相关函数就是描述在连续信号或离散序列的相关程度的一种统计度量。

什么是相关系数?最熟悉的度量两个量之间的相关性的方法是皮尔逊乘积矩相关系数(PPMCC),也称为“皮尔逊相关系数”,通常简称为“相关系数”。在数学上,它被定义为对原始数据的最小二乘拟合的质量(拟合程度或效果)。它是由数据集两个变量的协方差的比率,归一化到他们的方差的平方根得到的。数学上,两个变量的协方差除以标准差的乘积。

皮尔逊积矩相关系数试图通过两个随机序列的数据集建立一条最佳拟合曲线,实质上是通过列出期望和由此产生的皮尔逊相关系数表明实际数据集离预期值有多远。根据皮尔逊相关系数的符号,如果数据集的变量之间存在某种关系,可以得到负相关或正相关。其定义公式如下:

上述公式展开为:

在根据期望计算公式展开,就得到:

如果考察延迟d处的互相关,则上述公式就变为:

为了方便理解,本文就不考察延迟节拍了。

相关系数有啥用?皮尔逊相关系数的绝对值不大于1是Cauchy–Schwarz不等式的推论(有兴趣的可以去找书看看)。因此,相关系数的值在[-1,1]之间。在理想的增加线性相关关系情况下,相关系数为+1;在理想的减少(反相关)线性关系情况下,相关系数为-1;在所有其他取值情况下,表示变量之间的线性相关程度。当它接近零时,更接近于不相关。系数越接近-1或1,变量之间的相关性越强。

故,相关系数其值范围分布在区间[-1,1]:

1表示完全正相关

0表示不相关

-1表示完全负相关

为了方便理解,假定两个随机序列按照下面各类情况分布,下面的数字为相关系数:

dd11c380-ff1b-11ec-ba43-dac502259ad0.png

程序如何实现呢?上述公式在实际编程时,当然可以直接按照公式编制代码,如果仔细观察会发现该公式可以进一步简化,过程省略:

由这个公式就很容易编程了,干货在这里,可以拿去稍加改造即可使用:

#include 《stdio.h》#include 《math.h》/* 返回值在区间: [-1,1] *//* 如返回-10,则证明输入参数无效 */#define delta 0.0001fdouble calculate_corss_correlation(double *s1, double *s2,int n)

{

double sum_s12 = 0.0;

double sum_s1 = 0.0;

double sum_s2 = 0.0;

double sum_s1s1 = 0.0; //s1^2

double sum_s2s2 = 0.0; //s2^2

double pxy = 0.0;

double temp1 = 0.0;

double temp2 = 0.0;

if( s1==NULL || s2==NULL || n《=0)

return -10;

for(int i=0;i《n;i++)

{

sum_s12 += s1[i]*s2[i];

sum_s1 += s1[i];

sum_s2 += s2[i];

sum_s1s1 += s1[i]*s1[i];

sum_s2s2 += s2[i]*s2[i];

}

temp1 = n*sum_s1s1-sum_s1*sum_s1;

temp2 = n*sum_s2s2-sum_s2*sum_s2;

/* 分母不可为0 */

if( (temp1》-delta && temp1《delta) ||

(temp2》-delta && temp2《delta) ||

(temp1*temp2《=0) )

{

return -10;

}

pxy = (n*sum_s12-sum_s1*sum_s2)/sqrt(temp1*temp2);

return pxy;

}

double s1[30] = {

0.309016989,0.587785244,0.809016985,0.95105651,1,0.951056526,

0.809017016,0.587785287,0.30901704,5.35898E-08,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0

};

double s2[30] = {

0.343282816,0.686491368,0.874624132,0.99459642,1.008448609,

1.014252458,0.884609221,0.677632906,0.378334666,0.077878732,

0.050711886,0.066417083,0.088759401,0.005440732,0.04225661,

0.035349939,0.0631196,0.007566056,0.053183895,0.073143706,

0.080285063,0.030110227,0.044781145,0.01875573,0.08373928,

0.04550342,0.038880858,0.040611891,0.046116826,0.087670453

};

int main(void)

{

double pxy;

double s3[30];

pxy = calculate_corss_correlation(s1,s2,30);

printf(“pxy of s1 and s2:%f

”,pxy);

pxy = calculate_corss_correlation(s1,s1,30);

printf(“pxy of s1 and s1:%f

”,pxy);

for(int i=0;i《n;i++)

{

s3[i] = -1*s1[i];

}

pxy = calculate_corss_correlation(s1,s3,30);

printf(“pxy of s1 and s3:%f

”,pxy);

return 0;

}

运行结果为:

pxy of s1 and s2:0.997435

pxy of s1 and s1:1.000000

pxy of s1 and s1:-1.000000

将这三个信号绘制成波形来看看:

dd29031a-ff1b-11ec-ba43-dac502259ad0.png

由图看出:

S1与S2非常相似,其相关系数为0.997435,高度相似

S1与-S1则刚好相位相反,理想反相关,其相关系数为-1

S1与S1则理所当然是一样的,其相关系数为1

再来一组信号对比一下:

dd3f179a-ff1b-11ec-ba43-dac502259ad0.png

其波形数据为:

double s1[30]={

0.309016989,0.587785244,0.809016985,0.95105651,1,

0.951056526,0.809017016,0.587785287,0.30901704,5.35898E-08,

0,0,0,0,0,

0,0,0,0,0,

0,0,0,0,0,

0,0,0,0,0

};

double s6[30]={

0,0,0.187381311,0.368124547,0.535826787,

0.684547097,0.809016985,0.904827044,0.968583156,0.998026727,

0.992114705,0.951056526,0,0,0,

0,0,0,0,0,

0,0,0,0,0,

0,0,0,0,0

};

double s7[30]={

0.187381311,0.368124547,0.535826787,0.684547097,0.809016985,

0.904827044,0.968583156,0.998026727,0.992114705,0.951056526,

0.876306697,0.770513267,0.637424022,0.481753714,0,

0,0,0,0,0,

0,0,0,0,0,

0,0,0,0,0

};

利用上述代码计算S1与S6,S1与S7的相关系数:

pxy of s1 and s6:0.402428

pxy of s1 and s7:0.612618

可见,S6、S7与S1的相关系数越来越大,从波形上看相似度也越来越大。

总结一下通过相关系数可以比较完美的判断两个信号序列,或者两个随机变量之间的相似度。相关系数以及互相关函数应用很广,本文仅仅描述了一个工程上应用较多的实际栗子。事实上,该数学特性有着广泛的应用,有兴趣的可以深度学习探讨一下。

原文标题:数学之美:判定两个随机信号序列的相似度

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7314

    浏览量

    93968
  • 编程
    +关注

    关注

    90

    文章

    3707

    浏览量

    96758
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66829

原文标题:数学之美:判定两个随机信号序列的相似度

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    软件设计及串口相关函数介绍

    因为本章节的UART相关实验例程需要用到板子上的LED功能,因此我们可以直接以前面的“11_GPIO_LED”工程为基础进行修改。
    的头像 发表于 10-27 11:23 1725次阅读
    软件设计及串口<b class='flag-5'>相关</b><b class='flag-5'>函数</b>介绍

    使用函数块实现三相电机正反转控制

    在使用西门子S1200PLC,所使用的软件是博途软件,在这个软件里运用了块的概念。比如我们常见的组织块(OB)、函数块(FB)、数据块(DB)以及函数FC等。今天我们来具体交流一下这个函数块(FB)的具体使用方法。
    的头像 发表于 10-15 14:40 2316次阅读
    使用<b class='flag-5'>函数</b>块实现三相电机正反转控制

    详解hal_entry入口函数

    当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry函数。由于我们新建的工程是没有选用RTOS的,因此,
    的头像 发表于 07-25 15:34 1661次阅读

    C语言中的内联函数与宏

    在C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1712次阅读
    C语言中的内联<b class='flag-5'>函数</b>与宏

    hrtim里update reset和reset update同时打开不会互相激励吗?

    hrtim里update reset和reset update同时打开不会互相激励吗,另外为什么现在定时器周期值不用-1了
    发表于 04-27 08:57

    函数指针的六个常见应用场景

    函数指针在嵌入式开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数指针正是实现这一需求的重要工具。本文将介绍六个常见的
    的头像 发表于 04-07 11:58 1120次阅读
    <b class='flag-5'>函数</b>指针的六个常见应用场景

    详解RTOS中的Hook函数

    Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 833次阅读

    解锁TSMaster fifo函数:报文读取的高效方法

    前言:TSMaster目前有两种读取报文的模式:回调函数模式和fifo模式。fifo函数是TSMaster近期新增的函数,本文将重点介绍fifo模块。关于回调函数的使用方法可以参考帮助
    的头像 发表于 03-14 20:04 937次阅读
    解锁TSMaster fifo<b class='flag-5'>函数</b>:报文读取的高效方法

    在D4100_usb.dll动态库中应该使用哪些相关函数才能实现Activex中的MemToFrameBuffer(),LoadToDMD() 功能?

    使用Activex时可以正常读取图片并显示。但当使用D4100_usb.dll动态库时,不清楚怎样才能将数据显示到DMD。 请问在D4100_usb.dll动态库中应该使用哪些相关函数才能实现
    发表于 02-28 06:17

    LVGL前台程序开发相关操作介绍

    点击“+”按钮时它的回调函数“add_new_item_event_handler”被调用,这个回调函数在“lv_modbus_tool”函数中被设置。
    的头像 发表于 01-23 13:47 1363次阅读
    LVGL前台程序开发<b class='flag-5'>相关</b>操作介绍

    C语言如何处理函数的返回值

    当你在函数的最后写上 return 0 的时候,它是如何返回给调用函数的? 比如 test 函数,为了待会更好的看懂汇编代码,我写成了 return 1234。 处理函数的返回值,是不
    的头像 发表于 01-16 09:21 748次阅读

    西门子TIA Portal中函数FC和函数块FB的相互转换

    描述 本文将介绍在西门子 TIA Portal 中使用 Add-In 插件实现函数 FC 和函数块 FB 的相互转换的方法和步骤。 第1步: 添加 PLC 设备。 选择西门子 CPU 1214C
    的头像 发表于 01-15 10:07 3034次阅读
    西门子TIA Portal中<b class='flag-5'>函数</b>FC和<b class='flag-5'>函数</b>块FB的相互转换

    请问TRS3232E和TRS232E在做RS232通信时能不能互相替换使用?

    作为普通的RS232通信电路使用的话此两款型号的芯片可以互相直接替换吗?
    发表于 01-14 07:01

    关联接口函数与libmodbus移植

    可以发现,除了modbus.h包含的接口函数之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函数
    的头像 发表于 12-30 15:20 1783次阅读
    关联接口<b class='flag-5'>函数</b>与libmodbus移植

    stdio.h实现了printf函数?

    我们平时包含的 stdio.h 头文件,里面是不是实现了 printf 函数? 为什么会有这个疑问?因为每次使用 printf,就得包含 stdio.h ,这就导致很多同学误以为,stdio.h
    的头像 发表于 12-18 10:28 867次阅读