目录
一.雷达采集模块
毫米波雷达由发射天线和接收天线组成,分别用于发送电磁波和接收电磁波,通常发射的波形为三角波。发射波由于被目标物体反射从而到达雷达接收基产生回波信号,与发射信号进行混频,就得到表征道路车辆情况的中频信号,再经过滤波放大等处理,提供给单片机(含DSP模块)进行频谱分析(单片机主要是用ADC和DMA模块采集雷达发送过来的信号),通过频谱的强弱程度就可得出目标车辆所处车道和距离。
以上简单介绍一下毫米波雷达工作原理,如需详细原理,请参照我的博客FMCW雷达基本原理(通俗易懂)。
二.单片机ADC和DMA模块
本次实验所用的单片机型号为STM32F403,由于只用到ADC和DMA模块,只需要配置他们两个即可,其他的根据单片机教程默认配置即可。
1.ADC配置
主程序中启动ADC采集代码:
2.DMA配置
通过单片机串口助手XCOM可以打印出我们采集到的数据,是十六进制的:
三.车辆检测-matlab算法仿真
1.车辆判别介绍
通过ADC采集回来的数据是十六进制的,用matlab将其转换为10进制小数型数据:
这些数据就是雷达扫频周期所采集的数据(时域信息),里面包含了车辆信息、道路信息、道路边护栏信息等,我们对这些数据进行FFT快速傅里叶变换看一下效果:
图中 ,部分用红色框出来的点即为车辆,左右来看为车辆数,上下来看为不同车道。
数组为adc_value2[1024,392],1024是adc每个扫频周期采到1024个数据,392是共扫频392个周期,其实我们应该对1个扫频周期进行分析,即adc_value2[1024,1]进行分析,因为这样更符合单片机采集数据的逻辑。
接着把adc_value2[1024,1]一列数据进行FFT,得到频谱(频域数据):
由于做完FFT数据具有对称性质,因此1024个点只显示512个点即可,由图上以及多组数据实验可知,点0附近的峰值为马路反射值,点100处为道路护栏反射值,因此可以不作判别,在点39处为车辆反射值,需要进行判别有车。再次通过这下图可以看出,39点附近颜色很深,即为车辆:
点0处颜色为道路反射值,点100处颜色为道路护栏返回值。
同理,可通过如下图分析出该扫频周期内是没有车辆的:
如此循环往复,对多个扫频周期进行车辆的判别,即可得到一个时间段内该道路上的车流量。
2.算法实现
经过多次实验表明,车道一车辆总位于频谱点39-43,我们将其放大,以增加其容忍度,我们将起始点pos_start1设为36,终止点pos_end1设为42,可获得7个数据点,7个数据点进行求平均,得到gate_cal,设置车辆阈值gate_car为0.4,从而将gate_cal于gate_car进行比较,如果gate_cal高于gate_car,则表示有车,车辆计数car_num=car_num+1,从而每来一个扫频周期就进行一次算法的识别处理,就可以实现车流量的监测。
3.代码实现
部分代码已给出:
clc;clear;close all;
%数据预处理
txt_adc_value=textread('./data_11(30).txt','%s')';
adc_value2=fun_conversion(txt_adc_value,'h',N,-1);%adc_value2[1024,392]:1024是adc每个扫频周期采到1024个数据,392是共扫频392个周期
mubiao=fun_show_car(open_plot_mubiao,adc_value2,4,5);
%求平均值
%ADC采集的1024个点相加存入xx,xx/1024求平均,xx为平均值
adc_value3=adc_value2(:,c1);
xx=0;
for i=1:N
xx=adc_value3(i)+xx;
end
xx=xx/N;
%加窗函数
for i=1:N
x(i)=adc_value3(i)-xx;
x(i)=x(i)*fun_window(i,N);%x是减去平均值的数,非常小,window是一个正弦窗函数(0.08,1)
end
fun_plot2_1(open_plot,1,[2,2,3],size(x,2),x,'','加窗函数','');
%FFT傅里叶变换
xx_cfft_ri=fft(x-mean(x));
if(open_plot==1)
fun_plot2_1(open_plot,3,[2,2,2],size(xx_cfft_ri,2)/2,abs(xx_cfft_ri(1:end/2)),'','一个采样周期FFT','');
figure(3);subplot(2,2,1);imagesc(abs(xx_cfft_ri(1,1:512)'));title('一个采样周期FFT');
end
j=2;
for i=1:size(xx_cfft_ri,2)%提取实部虚部
xx_cfft(1,j-1)=real(xx_cfft_ri(i));
xx_cfft(1,j)=imag(xx_cfft_ri(i));
j=j+2;
end
[car_num,car_num_indx,car1_gate_cal,flag_add]=fun_suanfa1(xx_cfft_ri(1:512),[36,0,0,0],0.4,car1_gate_cal,car_num,car_num_indx,c1,flag_add,open_plot,[8,9]);%①[38,0,0,0] 0.4 /7②[36,0,0,0] 0.4 /7
4.仿真结果
车道一将近有30辆车(这个是真实值,在道路上一辆车一辆车数可能存在误差),下图是ADC返回的数据结果(较为准确):
利用算法进行判别得出结果:,是比较可靠的。
四.源码下载地址
内含数据集,来源于本人实地采集,代码简单,注释丰富,全中文,matlab直接运行即可:
链接:https://pan.baidu.com/s/1Hzk0trmkdHr0GfmBjk2KGA
提取码:6666