信号相关的C语言实现

相关函数理论分析

互相关函数

互相关函数是信号分析里的概念,
表示的是两个时间序列之间的相关程度,	
即描述信号x(t),y(t)在任意两个不同时刻
t1,t2的取值之间的相关程度。
描述两个不同的信号之间的相关性时,
这两个信号可以是随机信号,也可以是确知信号。

互相关函数有什么用呢

在智能车里我们使用它来计算同一个信号的延迟,
例如声音信号,两个麦克风接受同一个信号,
如果可以计算出两个麦克风之间信号的延迟,
就可以粗略的确定出两个麦克风之间的距离。

如果在声源处使用FM和声音发出相同的信号,
那么在小距离传输可以近似的认为电磁波的延迟为0,
这样就可以通过声音信号与电磁波信号的延迟计算
出声源距离了。通过多通道解析就可以计算出具体坐标。
(当然如果是嵌入式系统使用传统相关函数计算,
那么计算量将会非常大,所以嵌入式中可以使用相关
与卷积的关系,使用快速傅里叶变化加速算法,
简化算法复杂度。)

相关函数计算公式

在这里插入图片描述

在这里借助一下卓晴老师的博文,因为我了解这些算法也是从智能车开始的。祝智能车比赛越办越好!

从公式里可以看出,对于信号x(n)和y(n)来说,
假设信号接收时间相同的话,
也就是信号接收没有延迟。
那么两个信号自变量都将是n。
如果y信号对于x信号来说, 有l单位的延迟,
那么信号y的自变量将是(y-l)。
那么就很容易理解了,l是y信号相对于x信号的偏移量。
再看左侧Rxy函数,自变量是l, 
那么就是以l为自变量的一个函数。
n的取值从负无穷到正无穷, 
实际对应起来就是做互相关函数的自变量区间。

这个公式实际运算就相当于相乘再求和, 信号偏移量l从0到n取值,计算出所有的偏移量,然后比较最大的相关值对应的就是最适合的偏移量。
但是这里是有问题的,这里n的取值是要远远大于真实的偏移量才行, 否则计算出的偏移量准确性难以保证。(我就在这里犯过错,后来才想起来有这个原因。)

C语言代码分析

代码片.

#include "stdio.h"

int x[50] = { 12,11,5,8,7,3,5, 1, 3,5,01,5,2,41,5,2,4, 5,2,1,54, };//定义数组,当然也可以用循环来定义
int y[50] = { 1,6 ,8,4,5,3,1,12,11,5, 8,7,3, 5,1,3,5,01,5,2,41, };
int z[99];
/*****************************相关函数******************************/
int relevant()
{
	//rxx[l]=∑n=−∞∞x[n]x[n−l]
	int l = 0;
	for (int i = 0; i < 50; i++)
	{
		l = i + 1;
		z[i] = 0;  //结果Z数组初始化
		for (int n = 49; n > 0; n--)
		{
			z[i] += y[n] * x[n - l];//相关计算

		}
	}
	return;
}


void main()
{

	relevant();
	for (int i = 0; i <= 49; i++)
	{

		//printf("x[%d]=%d,--y[%d]=%d--,", i, x[i], i, y[i]);
		printf("z[%d]=%d\n", i, z[i]);

	}
	getchar();//保存结果
}
//这个结果已经验证过了,因为数组过短所以很多数组运算结果都不可以。 
 因为数组下标是从0开始,所以,运算结果最大值+1,即为偏移量。
Y数组向右偏移MAX+1个量。就是X数组的开端
程序里计算结果应该是6+1。
需要强调一下,这里n的取值是要远远大于真实的偏移量才行, 
否则计算出的偏移量准确性难以保证。
(我就在这里犯过错,后来才想起来有这个原因。)

大家好,这是第一篇推文。排版,语言什么的都没有特别的修改。
请大家见谅,后续还会更新信号的相关和FFT之类的文章。
把自己最近所学的东西给大家分享出来
``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值