Advertisement

DDMA信号处理以及数据处理的流程---跟踪

阅读量:

你好,很高兴见到你。我叫Xiaojie,久仰大名!今天很高兴能与你一同探索毫米波雷达技术领域。我计划开设一个系列文章专栏——《DDMA信号处理及数据处理流程详解》,系统地介绍以下几个核心环节:目标生成机制、信号仿真方法、测距与测速技术、基于CFAR的检测算法、角度估计方法以及多目标聚类与跟踪方案。预计涵盖8到9个专题。

最终效果如下:

整体文件的目录树如下:

本文着重探讨了追踪相关内容作为本系列的最后一篇作为本系列的最后一篇主要分为两个核心模块:一是针对目标追踪问题提出了一种改进算法二是针对数据融合问题设计了一种新的解决方案其中一部分专门负责目标追踪另一部分则专注于将各次检测结果进行数据融合与匹配

代码链接:https://pan.baidu.com/s/1AYGbRzOa8dMkh00jLeQs4g,密码在文末。

基础知识

关联算法

关联是采用的是最近邻算法,将航迹与聚类进行关联

跟踪算法

卡尔曼滤波是一种重要的信号处理算法,在学习这一知识点时可以观看B站UP主DR_CAN发布的完整教学视频资源链接点击这里,该视频详细解析了卡尔曼滤波的核心原理及其五个关键公式的推导过程。

代码仿真

associateProcess.m文件

trackProcess.m是关联算法,将航迹与聚类进行关联

复制代码
    function parameter = associateProcess(parameter)
    
    trackNums = parameter.trackPara.trackCurrNums; %航迹数目
    clusterNums = parameter.clusterPara.clusterCurrNums; %聚类数目
    %航迹和聚类关联
    for trackIdx = 1:1:trackNums
        trackLa = parameter.trackPara.trackMsg(trackIdx).la; %航迹的纵距
        trackLo = parameter.trackPara.trackMsg(trackIdx).lo; %航迹的横距
        Thresh = 9999;
        for clusterIdx = 1:1:clusterNums
            clusterLa = parameter.clusterPara.clusterTarget(clusterIdx).la; %聚类的纵距
            clusterLo = parameter.clusterPara.clusterTarget(clusterIdx).lo; %聚类的横距
            EuclideanDistance = sqrt((trackLa - clusterLa).^2 + (trackLo - clusterLo).^2); %欧式距离
            if EuclideanDistance < Thresh
                parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.associateValue = [clusterLa;clusterLo]; %关联值赋值
                Thresh = EuclideanDistance;
            end
        end
    end
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

trackProcess.m文件

trackProcess.m是跟踪处理的主函数

复制代码
    %% 跟踪处理
    function [parameter] = trackProcess(parameter)
    
    for trackIdx = 1:1:parameter.trackPara.trackCurrNums
        %当前的测量值为关联的聚类值
        currMeasurement = parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.associateValue;
        %卡尔曼估计
        [parameter.trackPara.trackTarget(trackIdx)] = kalmanCore(parameter.trackPara.trackTarget(trackIdx),currMeasurement);
        %卡尔曼估计最优值赋值
        parameter.trackPara.trackMsg(trackIdx).la = parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.optimizeState(1);
        parameter.trackPara.trackMsg(trackIdx).lo = parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.optimizeState(2);
        parameter.trackPara.trackMsg(trackIdx).V_La = parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.optimizeState(3);
        parameter.trackPara.trackMsg(trackIdx).V_Lo = parameter.trackPara.trackTarget(trackIdx).kalmanFilterPara.optimizeState(4);
        %计算左下角点
        parameter.trackPara.trackMsg(trackIdx).leftDownCornerLa = parameter.trackPara.trackMsg(trackIdx).la - 2;
        parameter.trackPara.trackMsg(trackIdx).leftDownCornerLo = parameter.trackPara.trackMsg(trackIdx).lo - 2;
    end
    
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

kalmanCore.m文件

kalmanCore.m是卡尔曼滤波的核心函数,囊括了卡尔曼滤波的五个公式

复制代码
    %% 卡尔曼核心函数
    function [parameter] = kalmanCore(parameter,currMeasurement)
    
    %1. 估计下一个状态
    parameter.kalmanFilterPara.optimizeState = ...
        parameter.kalmanFilterPara.A * parameter.kalmanFilterPara.optimizeState + ...
        parameter.kalmanFilterPara.B * parameter.kalmanFilterPara.u;
    %2. 估计协方差矩阵
    parameter.kalmanFilterPara.P = ...
        parameter.kalmanFilterPara.A * ...
        parameter.kalmanFilterPara.P * ...
        parameter.kalmanFilterPara.A' + ...
        parameter.kalmanFilterPara.Q;
    %3. 更新卡尔曼增益
    kalmanGain = parameter.kalmanFilterPara.P * ...
        parameter.kalmanFilterPara.H' * ...
        inv(parameter.kalmanFilterPara.H * ...
        parameter.kalmanFilterPara.P * ...
        parameter.kalmanFilterPara.H' + ...
        parameter.kalmanFilterPara.R); %计算卡尔曼增益
    %4. 最优估计
    parameter.kalmanFilterPara.optimizeState = ...
        parameter.kalmanFilterPara.optimizeState + ...
        kalmanGain * ...
        (currMeasurement - ...
        parameter.kalmanFilterPara.H * ...
        parameter.kalmanFilterPara.optimizeState);
    %     currOptimzieEstimateState = parameter.kalmanFilterPara.optimizeState;
    %5. 更新协方差矩阵
    parameter.kalmanFilterPara.P = ...
        (parameter.kalmanFilterPara.I - ...
        kalmanGain * ...
        parameter.kalmanFilterPara.H) * ...
        parameter.kalmanFilterPara.P;
    
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

trackCreate.m文件

trackCreate.m文件主要是进行航迹创建

复制代码
    function parameter = trackCreate(parameter)
    
    % 聚类数目
    clusterNums = parameter.clusterPara.clusterCurrNums;
    % 循环所有聚类数目
    for clusterIdx = 1:1:clusterNums
        if parameter.trackPara.trackTarget(clusterIdx).exist == 0 %判断当前航迹是否存在,不存在测新建
            clusterCount = parameter.clusterPara.clusterTarget(clusterIdx).count; %当前聚类存在的次数
        
            if clusterCount > parameter.trackPara.trackCreateThresh %大于航迹创建的阈值,则新建航迹
                parameter.trackPara.trackCurrNums = ...
                    parameter.trackPara.trackCurrNums + 1; %航迹数增加
                % 最优估计值赋值
                parameter.trackPara.trackTarget(clusterIdx).kalmanFilterPara.optimizeState(1) = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).la;
                parameter.trackPara.trackTarget(clusterIdx).kalmanFilterPara.optimizeState(2) = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).lo;
                parameter.trackPara.trackTarget(clusterIdx).kalmanFilterPara.optimizeState(3) = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).V_La;
                parameter.trackPara.trackTarget(clusterIdx).kalmanFilterPara.optimizeState(4) = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).V_Lo;
                % 航迹横距纵距赋值
                parameter.trackPara.trackMsg(clusterIdx).la = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).la;
                parameter.trackPara.trackMsg(clusterIdx).lo = ...
                    parameter.clusterPara.clusterTarget(clusterIdx).lo;
                % 航迹左下角点赋值
                parameter.trackPara.trackMsg(clusterIdx).leftDownCornerLa = ...
                    parameter.trackPara.trackMsg(clusterIdx).la - 2;
                parameter.trackPara.trackMsg(clusterIdx).leftDownCornerLo = ...    
                    parameter.trackPara.trackMsg(clusterIdx).lo - 2;
                % 标记航迹存在
                parameter.trackPara.trackTarget(clusterIdx).exist = 1;
            end
        end
    end
    
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

代码链接密码:cz71

代码只供用于个人学习,切勿用于商用

至此,本系列文章就此结束了。

全部评论 (0)

还没有任何评论哟~