相关运算及实现

本文介绍相关运算及实现。

相关运算在相关检测及数字锁相放大中经常用到,其与卷积运算又有一定的联系,本文简要介绍其基本运算及与卷积运算的联系,并给出实现。

1.定义

这里以长度为N的离散时间序列x(n),y(n)为例,相关运算定义如下:

1)R_{xy}(n)

x(n)保持不动,y(n)相对于x(n)向左移动

R_{xy}(n)=\sum_{m=0}^{N-1}x(m)y(m+n)=\sum_{m=0}^{N-1}x(m-n)y(m)

最后面的式子是等效情况下,y(n)不动,x(n)相对于y(n)向右移动

2)R_{yx}(n)

y(n)保持不动,x(n)相对于y(n)向左移动

R_{yx}(n)=\sum_{m=0}^{N-1}y(m)x(m+n)=\sum_{m=0}^{N-1}y(m-n)x(m)

最后面的式子是等效情况下,x(n)不动,y(n)相对于x(n)向右移动

注意:

1)R_{xy}(n)R_{yx}(n)的定义是不一样的,R_{xy}(n)=R_{yx}(-n)

2)n的取值范围为[-(N-1),N-1]

3)相关运算结果长度为2*N-1(2个序列长度和减1)

对比卷积公式:

z(n)=x(n)\ast y(n)=\sum_{m=0}^{N-1}x(m)y(n-m)=\sum_{m=0}^{N-1}y(m)x(n-m)

注意:

1)n的取值范围为[0,2*N-2]

2)卷积运算结果长度为2*N-1(2个序列长度和减1)

3)后面2个等式成立使用的是卷积交换律

对比卷积公式和相关运算公式,可以知道,无论是R_{xy}(n)还是R_{yx}(n),它们与卷积运算差别仅在运算时x(n)或y(n)是否需要折叠(转换成x(-n)或y(-n))。因此,在做相关运算时可以将输入x(n)或y(n)先折叠,再经过卷积运算即可求出相关运算结果。

这里用Matlab作下验证,在Matlab命令行下输入:

x=[1,2,3];
y=[3,2,1];z1=xcorr(x,y);
z2=conv(x, flip(y));

其中flip(y)即对y进行折叠(反转序列),得到的结果是z1和z2是相等的。

2.实现

这里基于C语言来实现。参考代码如下:

static void correlate(float *pSrcA, uint32_t srcALen, float *pSrcB, uint32_t srcBLen, float *pDst);static void correlate(float *pSrcA, uint32_t srcALen, float *pSrcB, uint32_t srcBLen, float *pDst)
{float *pIn1 = pSrcA;                       /* inputA pointer */float *pIn2 = pSrcB + (srcBLen - 1U);      /* inputB pointer */float sum = 0;                             /* Accumulator */uint32_t i = 0U;                           /* loop counter */uint32_t j = 0U;                           /* loop counter */uint32_t inv = 0U;                         /* Reverse order flag */uint32_t tot = 0U;                         /* Length */if ((pSrcA == NULL) || (srcALen == 0) || (pSrcB == NULL) || (srcBLen == 0) || (pDst == NULL)){return ;}/* The algorithm implementation is based on the lengths of the inputs. *//* srcB is always made to slide across srcA. *//* So srcBLen is always considered as shorter or equal to srcALen *//* But CORR(x, y) is reverse of CORR(y, x) *//* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer *//* and a varaible, inv is set to 1 *//* If lengths are not equal then zero pad has to be done to  make the two* inputs of same length. But to improve the performance, we assume zeroes* in the output instead of zero padding either of the the inputs*//* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the* starting of the output buffer *//* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the* ending of the output buffer *//* Once the zero padding is done the remaining of the output is calcualted* using convolution but with the shorter signal time shifted. *//* Calculate the length of the remaining sequence */tot = ((srcALen + srcBLen) - 2U);if (srcALen > srcBLen){/* Calculating the number of zeros to be padded to the output */j = srcALen - srcBLen;/* Initialise the pointer after zero padding */pDst += j;}else if (srcALen < srcBLen){/* Initialization to inputB pointer */pIn1 = pSrcB;/* Initialization to the end of inputA pointer */pIn2 = pSrcA + (srcALen - 1U);/* Initialisation of the pointer after zero padding */pDst = pDst + tot;/* Swapping the lengths */j = srcALen;srcALen = srcBLen;srcBLen = j;/* Setting the reverse flag */inv = 1;}/* Loop to calculate convolution for output length number of times */for (i = 0U; i <= tot; i++){/* Initialize sum with zero to carry on MAC operations */sum = 0.0f;/* Loop to perform MAC operations according to convolution equation */for (j = 0U; j <= i; j++){/* Check the array limitations */if ((((i - j) < srcBLen) && (j < srcALen))){/* z[i] += x[i-j] * y[j] */sum += pIn1[j] * pIn2[-((int32_t)i - (int32_t)j)];}}/* Store the output in the destination buffer */if (inv == 1){*pDst-- = sum;}else{*pDst++ = sum;}}
}

main函数:

int main()
{float x[] = {1, 2, 3, 4};float y[] = {4, 3, 2, 1};float z[7] = {0};uint32_t i = 0;correlate(x, 4, y, 4, z);for (i = 0; i < sizeof(z) / sizeof(z[0]); i++){printf("%f ", z[i]);}printf("\r\n");return 0;
}

输出结果:

作为对比,在Matlab命令行下输入:

x=[1,2,3,4];
y=[4,3,2,1];
z=xcorr(x,y);

查看结果和用C语言实现的是一致的。

3.应用

通过相关运算,我们得到了相关序列,为了方便后续数据处理,需要对得到的相关序列进行归一化处理,对于2个互相关序列,有如下2种归一化方法:

1)有偏估计

\hat{R_{xy,biased}(m)}=\frac{1}{N}\hat{R_{xy}(m)}

2)无偏估计

\hat{R_{xy,unbiased}(m)}=\frac{1}{N-\left | m \right |}\hat{R_{xy}(m)}

为了查看这2者之间差异,在Matlab命令行下,输入如下命令:

fm=1000;
fs=100000;
N=fs/fm;
k=0:1:1000;
theta=pi/8;
x=sin(2*k*pi/N + theta);%原始信号
xn=awgn(x,20,0);%原始信号加噪声
subplot(5,1,1);
plot(k,x);
title('x');
subplot(5,1,2);
plot(k,xn);
title('xn');
[r,lags]=xcorr(xn,x,500);%未缩放的互相关
subplot(5,1,3);
plot(k,r);
title('corr none');
[rb,lags]=xcorr(xn,x,500,'biased');%互相关的有偏估计
subplot(5,1,4);
plot(k,rb);
title('corr biased');
[rub,lags]=xcorr(xn,x,500,'unbiased');%互相关的无偏估计
subplot(5,1,5);
plot(k,rub);
title('corr unbiased');

输出结果:

由图可知:

1)“未缩放的互相关运算”仅是相关运算计算出的序列,在2个互相关信号重叠(相位差为0)时值最大

2)“互相关的有偏估计”在2个互相关信号重叠(相位差为0)时值最大,且为原始信号幅值的一半

3)“互相关的无偏估计”则有如下特点:

a)与原始信号频率相同

b)输出为cos信号,且起始相位为2个互相关信号相位之差(0)

c)信号幅值为原信号幅值的一半

这其实和相敏检波(PSD)运算效果是一致的(未加LPF)。

总结,本文介绍了相关运算及实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvm管理多个node版本,快速来回切换node版本

前言 文章基于 windows环境 使用nvm安装多版本nodejs。 最近公司有的项目比较老需要降低node版本才能运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理&#xff0c;后面自己就简单捯饬了一下nvm来管理node&#xff0c;顺便…

VTK----VTK数据结构详解2(计算机篇)

在VTK中&#xff0c;属性数据和点都用数据数组&#xff08;data arrays&#xff09;表示。某些属性数据&#xff08;例如法线、张量&#xff09;需要具有与其定义一致的元组&#xff08;在计算机编程中&#xff0c;元组&#xff08;tuple&#xff09;用来表示存储多种数据类型的…

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结构 1.1 运行效果 1.2 ccs结构 1.3 目录…

【Python-Spark(大规模数据)】

Python-Spark&#xff08;大规模数据&#xff09; ■ Spark■ PySparl编程模型■ 基础准备■ 数据输入■ RDD的map成员方法的使用■ RDD的flatMap成员方法的使用■ RDD的reduceByKey成员方法的使用■ 单词计数统计■ RDD的filter成员方法的使用■ RDD的distinct成员方法的使用■…

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

环境不易满足&#xff0c;不建议复现

详解js中的console对象

对于前端开发而言&#xff0c;console对象大家肯定都很熟悉&#xff0c;最常用的 console.log() 是开发调试必用的 但是对于console对象的其他方法&#xff0c;相对而言使用的就比较少了。下面详细介绍一下&#xff1a; 谷歌浏览器输出console对象&#xff1a; 值得一提的是不…

JAVA MQTT 发布主题请求,订阅主题接收,订阅主题回复,发布主题再接收回复,三步走

先看效果 一、准备工作 1.官网下载emqx压缩包放到自己的盘符下&#xff0c;不要带中文路径 下载 EMQX 2.在路径的bin中&#xff0c;cmd&#xff0c;启动emqx服务 emqx start 3.访问服务&#xff0c;能打开就证明启动成功&#xff0c;登录的话官网默认的密码账号&#xff08;…

【C#】Stopwatch计时器

使用Stopwatch检查C#中代码块的执行时间&#xff0c;比如歌曲&#xff0c;图片的下载时间问题 首先&#xff0c;我们可看到Stopwatch 类内部的函数。 根据需求&#xff0c;我们具体可使用到 Start() 开始计时&#xff0c;Stop() 停止计时等 //创建 Stopwatch 实例 Stopwatch …

STM32单片机C语言模块化编程实战:LED控制详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 之前介绍了很多关于点灯的方法&#xff0c;比如…

ARM DMIPS算力说明

ARM DMIPS算力说明 ARM算力参考官网地址 https://en.wikipedia.org/wiki/List_of_ARM_processors Product familyARM architectureProcessorFeatureCache (I / D), MMUTypical MIPS MHzReferenceARM1ARMv1ARM1First implementationNoneARM2ARMv2ARM2ARMv2 added the MUL (mu…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

el-table 三角形提示

<template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"ddd" label"日期2" width"150" /><el-table-column prop"ddd" label"日期2" width…

[C++][算法基础]分组背包问题(动态规划)

有 &#x1d441; 组物品和一个容量是 &#x1d449; 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 &#xff0c;价值是 &#xff0c;其中 &#x1d456; 是组号&#xff0c;&#x1d457; 是组内编号。 求解将哪些物品装入背包&a…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

一、路由基础

1.路由协议的优先级 路由器分别定义了外部优先级和内部优先级&#xff08;越小越优&#xff09; 路由选择顺序&#xff1a;外部优先级>>内部优先级&#xff08;相同时&#xff09; ①外部优先级&#xff1a;用户可以手工为各路由协议配置的优先级 ②内部优先级&#xf…

OmniPlan Pro for Mac v4.8.0中文激活版 项目流程管理工具

OmniPlan Pro for Mac是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。 OmniPlan Pro for Mac v4.8.0中文激活版 通过OmniPlan Pro&#xff0c;用户可以轻松创建任务&#xff0c;设置任务的开始和结束时…

Pulsar【部署 02】Pulsar可视化工具Manager安装使用

Pulsar Manager 是一个基于 web 的 GUI 管理和监视工具&#xff0c;可帮助管理员和用户管理和监视租户、命名空间、主题、订阅、代理、集群等&#xff0c;并支持对多个环境进行动态配置。 可视化工具Manager安装使用 1.Docker1.1 拉取镜像并启动1.2 设置用户名密码1.3 登录并添…

openstack界面简单修改

openstack Ubuntu主题登录界面修改修改登陆界面背景登录框边缘添加透明效果修改登录界面logo更换站点图片更换项目logo图片 本实验基于VMware17&#xff0c;使用Ubuntu2310搭建openstack-B版 Ubuntu主题 以下配置只对Ubuntu主题生效 登录界面修改 原界面 关闭登录界面域名输…

LTD271次升级 | 网站/小程序可设访问IP的黑白名单 • 官微中心支持PDF等办公文件预览与并分享 • 订单退款显示更详尽明细

1、新增IP访问限制功能&#xff1b; 2、订单新增交易号显示与退款明细显示&#xff1b; 3、自定义地址增加四级地区&#xff1b; 4、Android版App优化文件功能&#xff1b; 5、已知问题修复与优化&#xff1b; 01 官微中心 1) 新增IP限制访问功能 允许或者禁止某些 IP 或…