Matlab_xcorr_互相关函数的讨论
假设两个平稳信号 $\textbf{x}$ 和 $\textbf{y}$ ,如果 $x\left(t+\tau\right)= y\left(t\right)$ ,则可通过互相关求 $\tau$ 。由于信号处理相关知识都蘸酱吃了,理论相关的部分咱们来日方长(我一定可能会补充的)。
XCORR 实现
首先,通过实现 xcorr 函数介绍互相关计算流程:
clc
clear
close % 实现 xcorr 函数 % 基本设置
T = 1; % [s] 总时间长度
fs = 5000; % [Hz] 采样频率
t = 0:1/fs:T; % [s] 时间坐标
N = length(t); % 信号个数 % 信号生成
tm = [ t(1:N) - T , t(2:N) ]; % 相关结果的时间延迟坐标轴
td1 = 0.2*T; % x 信号时间延迟
td2 = 0.3*T; % y 信号时间延迟
noise = rand(1,2*N); % 生成了两倍时间 T 长度的噪声 [0,1]噪声
x = noise(1+round(td1*fs):N+round(td1*fs))-0.5*ones(1,N);
y = noise(1+round(td2*fs):N+round(td2*fs))-0.5*ones(1,N); % 求取互相关
z1 = xcorr(x,y); % Matlab 自带函数
[~,I1] = max(abs(z1)); % 模仿 Matlab doc 给出延迟坐标
z2 = zeros(1,N); % 自编函数
for n = 1:length(tm)
z2(n) = sum( x( max(1,n-N+1):min(n,N) ).*y( max(1,N-n+1):min(2*N-n,N) ) );
end
[~,I2] = max(abs(z2)); % 模仿 Matlab doc 给出延迟坐标
%---------------------计算说明--------------------%
% case1: | case2: %
% .N | .2*N-n %
% y: .......... | y: .......... %
% .N-n+1 | .1 %
% .n | .N %
% x: .......... | x: .......... %
% .1 | .n-N+1 %
%------------------------------------------------%
err = z1-z2; % 两种算法的差 % 绘图
subplot(1,3,1)
plot(tm,z1)
title('Matlab function')
xlabel('time delay')
ylabel('Amp')
a1 = gca;
a1.XTick = sort([-1:0.5:1 tm(I1)]);
subplot(1,3,2)
plot(tm,z2)
title('My function')
xlabel('time delay')
ylabel('Amp')
a2 = gca;
a2.XTick = sort([-1:0.5:1 tm(I2)]);
subplot(1,3,3)
plot(tm,err,'.-')
title('error')
xlabel('time delay')
ylabel('Amp')
suptitle('xcorr realization')
以上 Matlab 代码可以得到下面的结果。从左到右依次是 Matlab 自带函数、我编的互相关函数、两个函数的差值。不难发现:两个函数十分接近,但是差值不为零。个人猜测是因为 xcorr 的求和和 sum 求和的截断误差不同所致。这个误差的来源我懒得去编程序验证了——毕竟10-16量级的差别,没多大深究的意义。但是可以注意到这个差值有四个特点:
- 小幅值时有固定几个数值
- 每跑一次程序,rand 产生的噪声数据不同,error 值不同
- 呈“纺锤型”,中间高,两边低
- 实际值大的数据点,error 值大

最后要谈一下 xcorr 的噪声问题。我们通常使用的噪声是白噪声,或者高斯白,有一个很重要的特点就是均值为零,也就是说没有直流分量。但是当我们的噪声存在直流分量的时候(比如上面的噪声信号直接使用rand(1,2*N)时),互相关就是一个类似等腰三角形的东西了(想想门函数卷积)。回忆一下,对于存在稳定周期分量的两组信号 $\textbf{x}$ 、 $\textbf{y}$ 而言,互相关结果将会是一个幅度为“纺锤形”的周期震荡的信号。由此可观:互相关一方面可以得到非周期信号延迟结果,同时也能反映极端情况下,相同频率成分的存在,这一点可以用来观察工频干扰程度。
XCORR 与 CONV
互相关 xcorr 与 conv 的差别在于两点:
- xcorr 在两段信号较短者后补零,使两段信号长度一致
- xcorr 直接用两个信号的各种延迟做相乘求和,conv 使用翻褶后的信号做相乘求和
这导致了:
1、xcorr(x,y) 中 (x,y) 顺序有影响,而conv(x,y) 没有
2、两者在大部分情况下得到的结果是不一样的,但是对于一些有趣的对称信号是存在等价关系的。有兴趣的读者可以搞一搞,找找规律。因为本人并不搞对称相关的研究,这点就不展开了。下面的例子是有等价关系的。
clc
clear
close % 比较 conv xcorr % 例子
A = ones(1,12); % -3:3
B = 0:4; % 3:-1:-3
C = xcorr(A,B);
D = conv(A,B); %绘图
subplot(2,2,1)
plot(A,'.-')
ylim([ -0.1 5.1 ])
xlim([ 0.9 12.1])
title('A = ones(1,12)')
xlabel('n')
ylabel('Amp')
subplot(2,2,2)
plot(B,'.-')
ylim([ -0.1 5.1 ])
xlim([ 0.9 12.1])
title('B = 0:4')
xlabel('n')
ylabel('Amp')
subplot(2,2,3)
plot(C,'.-')
ylim([ -0.1 15.1 ])
xlim([ 0.9 25.1])
title('xcorr 结果')
xlabel('n')
ylabel('Amp')
subplot(2,2,4)
plot(D,'.-')
ylim([ -0.1 15.1 ])
xlim([ 0.9 25.1])
title('cone 结果')
xlabel('n')
ylabel('Amp')
suptitle('conv与xcorr对比')

有兴趣的读者可以试着用给定函数实现目标函数:
- xcorr --> fliplr
- xcorr --> conv
- conv --> fliplr
- conv --> xcorr
END
Matlab_xcorr_互相关函数的讨论的更多相关文章
- [NodeJS] 优缺点及适用场景讨论
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- CSS常见居中讨论
先来一个常见的案例,把一张图片和下方文字进行居中: 首先处理左右居中,考虑到img是一个行内元素,下方的文字内容也是行内元素,因此直接用text-align即可: <style> .con ...
- 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader
发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...
- 从三栏自适应宽度布局到css布局的讨论
如何实现一个三栏自适应布局,左右各100px,中间随着浏览器宽度自适应? 第一个想到的是使用table布局,设置table的宽度为100%,三个td,第1个和第3个固定宽度为100px,那么中间那个就 ...
- 简历生成平台项目开发-STEP4第二次项目例会讨论
时间:2016.7.15周五7点半 地点:图书馆 讨论主题:交流各自手头项目进展,确定下一步任务 内容:按照之前的讨论的任务大家各自汇报进度. 汇报人:谭卓.尹忠诚 内容:1.基于富文本编辑器的模板, ...
- 关于java中自增,自减,和拓展运算符的小讨论
java中运算符很多,但是能深入讨论的不算太多.这里我仅仅以++,*=为例做讨论. 例:++ i=0; i=i++ + ++i;//i=1 i=++i+i++;//i=2 i=i++ -++i;//i ...
- 由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)
写这篇文章的起因是源于这篇文章:谈谈面试与面试题 中关于position的讨论,文中一开始就说的这句话: 面试的时候问个css的position属性能刷掉一半的人这是啥情况…… 其实这问题我本来打算的 ...
- MVVM 开发的几种模式讨论(WPF)
在WPF系(包括SL,WP或者Win8)应用开发中,MVVM是个老生常谈的问题.初学者可能不会有感觉,但当你写一个核心逻辑能在各种平台上无缝移植,而只需改改UI的时候,那种快感是无法用语言来形容的. ...
- AGS中通过FeatureServer插入数据失败、插入数据在WMTS请求中无法显示以及version概念的讨论
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在多个项目中,当我方接口给其他部门人员使用时出现了插入数据失 ...
随机推荐
- Centos7 升级 Ruby
Centos7通过yum 安装的Ruby 是2.0版本.版本较低,需要升级到2.5以上版本. #yum 安装ruby yum install ruby #查看ruby版本 ruby -v 以下开始升级 ...
- Html 标签初知
Html 标签初知 什么是Html 标签 超文本标记语言(外国语简称:HTML)标记标签通常被称为HTML标签,HTML标签是HTML语言中最基本的单位,HTML标签是HTML(标准通用标记语言下的一 ...
- Docker Weave 介绍 or 工作原理
Docker Weave Network Weave Network:属于第三方网络项目. Weave在Docker主机之间实现Overlay网络,使用业界标准VXLAN封装,基于UDP传输,也可以加 ...
- Linux 组管理、权限
权限说明 1. 组涉及到两个配置文件,组文件/etc/group,组密码管理员/etc/gshadow/,GID500往后的算普通组. 2.主组与附属组,当创建一个用户,没有制定,用户会默认创建一个与 ...
- 【Python66--checkbutton&】
一.定义:Checkbutton组件用于实现是否选择的按钮 二.作用:使用Checkbutton,必须创建一个tkinter变量用于存放按钮的状态:v=IntVar() from tkinter im ...
- topcoder srm 595 div1
problem1 link 判断最后剩下哪些区间没有被其他区间覆盖. problem2 link 假设$b$的位置固定,那么不同的$a$会使得$[a,b]$有两种情况,第一种,$[a,b]$ is n ...
- JavaScript-DOM(3)
事件处理 事件类型 <body> <!--方式1:直接带html代码中嵌入js代码--> <button onclick="console.log('事件1') ...
- HDFS初次编程
hadoop是用Java语言实现的开源软件框架,可以支持多种语言,我学习的时候用得自然就是Java了. 在开始编程之前需要做一些配置工作: Hadoop开发:Hadoop为HDFS和Mapreduce ...
- CSS设置DIV边框为圆角,添加背景色溢出的问题
这么几天需要做一个类似于层级展示的东西,最后一层需要做一些div框来展示数据,我用css设置了div的边框为圆角,但是添加背景色的时候颜色溢出,覆盖了四个角的圆弧,效果如图所示: css代码如下: . ...
- CentOS 7安装后的配置
一.设置IP地址.网关DNS 说明:CentOS 7.x默认安装好之后是没有自动开启网络连接的,所 以需要我们自己配置. 在命令行输入#vi /etc/sysconfig/network-scrip ...