毫米波雷达车流量检测原理和代码-matlab代码

目录

一.雷达采集模块

二.单片机ADC和DMA模块

1.ADC配置

2.DMA配置

三.车辆检测-matlab算法仿真

1.车辆判别介绍

2.算法实现

3.代码实现

4.仿真结果

四.源码下载地址


一.雷达采集模块

毫米波雷达由发射天线接收天线组成,分别用于发送电磁波和接收电磁波,通常发射的波形为三角波。发射波由于被目标物体反射从而到达雷达接收基产生回波信号,与发射信号进行混频,就得到表征道路车辆情况的中频信号,再经过滤波放大等处理,提供给单片机(含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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也想搞机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值