信号相关的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之类的文章。
把自己最近所学的东西给大家分享出来
``
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言支持信号处理功能,可以通过相应的库函数和系统调用来实现信号发生器。 首先,我们需要使用signal()函数来注册信号处理函数。例如,可以使用以下代码将Ctrl+C信号(SIGINT)注册为自定义的处理函数: ```c #include <stdio.h> #include <signal.h> void sigHandler(int signum) { printf("接收到信号:%d\n", signum); } int main() { signal(SIGINT, sigHandler); //注册信号处理函数 while(1) { //无限循环,等待信号 } return 0; } ``` 在上述代码中,我们定义了一个名为sigHandler()的信号处理函数,用于在接收到SIGINT信号时打印相关信息。在main()函数中,我们使用signal()函数将SIGINT信号和sigHandler()函数进行绑定。之后,进入一个无限循环,等待信号的到来。 接下来,我们可以使用raise()函数来模拟信号的发送。例如,我们可以在程序中的任意位置调用raise(SIGINT)来发送SIGINT信号,如下所示: ```c #include <stdio.h> #include <signal.h> void sigHandler(int signum) { printf("接收到信号:%d\n", signum); } int main() { signal(SIGINT, sigHandler); //注册信号处理函数 printf("程序开始\n"); raise(SIGINT); //发送SIGINT信号 printf("程序结束\n"); return 0; } ``` 在上述代码中,我们在程序开始和结束处分别打印相关信息,并在程序中间位置调用raise(SIGINT)来发送SIGINT信号。当接收到信号时,将会触发sigHandler()函数,打印相关信息。 这样,我们就实现了一个简单的C语言信号发生器。当程序运行时,我们可以手动发送信号或通过系统调用来触发信号处理函数的执行。这在一些特定的应用场景中非常有用,比如在收到某个特定信号时触发一些特定操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值