信号相关的C语言实现

信号相关的C语言实现

  • 相关函数理论分析
    • 互相关函数
    • 互相关函数有什么用呢
    • 相关函数计算公式
  • C语言代码分析

相关函数理论分析

互相关函数

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

互相关函数有什么用呢

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

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

相关函数计算公式

信号相关的C语言实现_第1张图片

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

从公式里可以看出,对于信号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之类的文章。
把自己最近所学的东西给大家分享出来
``

你可能感兴趣的:(智能车过程,信号处理,c语言,算法)