相敏检波原理及数字实现

文章目录

  • 前言
  • 一、相敏检波的应用背景
  • 二、具体操作步骤
  • 三、相敏检波数字实现


前言

主要介绍了2022年江苏省大学生电子设计竞赛E题(声源定位跟踪系统)所用到的主要技术原理。


一、相敏检波的应用背景

相敏检波原理及数字实现_第1张图片
如图所示,我们的目标是测量出乙、丙两地到甲地的距离差。
①但是我们是没有尺的,我们唯一能控制的是在甲地的一个喇叭,因此我们控制该喇叭发出声音的频率w。
②此时我们会在乙、丙两地收到两个同频,不同幅不同相的信号,之后通过测量两地的相位差,来达到测量距离差的目的。
③有了相位差delta_fai后,根据w=2paif,t=delta_fai/w,delta_d = v(声速)*t。即可求出距离差。

二、具体操作步骤

相敏检波原理及数字实现_第2张图片
1.设置甲地喇叭的声音频率为1kHz,即f=1000,w=2paif。
设置采样频率为10kHz,这里满足了香农采样定理的实际应用,采样频率应是信号频率的八倍以上,以保证信号不失真,此时在一个声音的周期内可以采样10个点(f_采样=10f_信号)。
设乙地单片机采得信号为 A_1
sin(wt+fai_1) (1)
设丙地单片机采得信号为A_2*sin(wt+fai_2) (2)
此时我们还需人为在单片机产生两个理想信号
sinwt (3)
coswt (4)
用(1)×(3)得(5)
(1)×(4)得(6)
对(5)式累计200次后,可滤除其中的交流分量而只保留直流分量,同理对(6)式累计两百次。之后利用arctan函数即可求出fai_1.
之后再用(2)×(3),(2)×(4)可求出fai_2。
delta_fai = fai_2-fai_1

三、相敏检波数字实现

虽然原理比较简单,但是自己写起代码来还是有很多注意点的,下方主要粘贴了和本文相关的部分代码。
理想信号是利用matlab对sin函数和cos函数等分取了10个值产生的。
还有一点是计算相位差时是从第300个点开始取的,因为前70个(左右)取得点因为数字滤波器的原因是不稳定的,索性从第三百个点开始取。
下图是乙、丙两地采得的信号值(即两路adc值),解释了为什么从第三百个点开始计算。
相敏检波原理及数字实现_第3张图片

/*----------------理想信号-------------------*/
float sinwt[10] = {0,0.5877853,0.9510565,0.9510564,0.5877850,0,-0.5877855,-0.9510566,-0.9510563,-0.5877847};//理想正弦信号
float coswt[10] = {1,0.8090169,0.3090168,-0.3090171,-0.8090171,-1,-0.8090167,-0.3090165,0.3090175,0.8090173};//理想余弦信号

	if(fai_i<300)
	{
		A0sinwt[fai_i] = data1;
		A1sinwt[fai_i] = data2;
		fai_i++;	
	}
		if((fai_i == 300) && (fai_j!=200))
	{
		for(fai_j = 0; fai_j<200; fai_j++)
		{
			X0wt[fai_j] = A0sinwt[fai_j+100] * sinwt[fai_j%10];
			Y0wt[fai_j] = A0sinwt[fai_j+100] * coswt[fai_j%10];
			X1wt[fai_j] = A1sinwt[fai_j+100] * sinwt[fai_j%10];
			Y1wt[fai_j] = A1sinwt[fai_j+100] * coswt[fai_j%10];
			X0_sum += X0wt[fai_j];
			Y0_sum += Y0wt[fai_j];
			X1_sum += X1wt[fai_j];
			Y1_sum += Y1wt[fai_j];
		}
		X0_ave = X0_sum/200;
		Y0_ave = Y0_sum/200;
		X1_ave = X1_sum/200;
		Y1_ave = Y1_sum/200;
		X0_sum = 0;
		Y0_sum = 0;
		X1_sum = 0;
		Y1_sum = 0;
		if(flag_adc == 1)
		{
			fai_0 = atan2(Y0_ave,X0_ave)*180/3.1415926;
			fai_1 = atan2(Y1_ave,X1_ave)*180/3.1415926;		
			delta_fai01 = fai_0-fai_1;
			flag = 1;
//			delta_fai01 = Ave_Delta_fai01(delta_fai01);
//			Delta_fai01_KLM(0);
			d_0 = delta_fai01 * 0.944444;			//单位mm,(fai0-fai1)*340*10e3(声速,单位mm)/(360 * 1000)	  d = v*t = v*delta_fai/(2pai*f)		 	
		}
	}

你可能感兴趣的:(电子设计,算法)