Advertisement

DDMA信号处理以及数据处理的流程---doa估计

阅读量:

Hello!很高兴见到大家!我叫Xiaojie,请允许我向大家介绍 myself and share some insights about microwave radar technology with you. I plan to establish a series of articles focusing on DDMA signal processing and data analysis, specifically covering key modules such as target generation, signal simulation, distance measurement, speed measurement, CFAR detection, angle measurement, target clustering, and tracking. This series is expected to contain seven to eight in-depth articles that will systematically explore these topics.

最终效果如下:

整体文件的目录树如下:

本文主要聚焦于DOA估计技术领域,并系统性地介绍了几种经典的DOA估计方法:基于频域的伪谱法(DBF)、快速傅里叶变换(FFT)算法以及Capon加权法(Capon)。

基础知识

dbf角度估计

对DBF的相关介绍已在本文中详尽阐述。如需进一步了解相关内容,请参考Xiaoije雷达之路—介绍DBF测角方法及TI的实现方法,如需进一步了解相关内容,请参考该链接。

fft角度估计

fft测角从原理上讲,可以理解为dbf测角的一个特例。

capon角度估计

capon算法是在dbf上的基础上增加了最小方差准则。

基于给定预期信号的方向信息以及参考信号的前提条件,在已知期待信号的来波方向和参考信号的基础上,最小方差准则通过优化阵列输出以降低噪声方差,在此基础上实现了对目标信号X_s(t)的有效增强效果;经过加权后的波束形成器输出结果表现为

y(t)=W^HX(t)=W^HX_s(t)+W^HX_n(t)

输出功率可以表示为:

P_{out}=E[|y(t)|^2]=E[(W^HX(t))(W^HX(t))^H]=W^HR_XW

为了确保波束形成器在信号X_s(t)方向上的增益,在权向量设计时应施加限制条件。具体而言,在该方向上实现一定的增益水平,并通过设计滤波器使对期望信号的响应保持恒定

W^Ha(\theta)=g

式中,a(\theta)为期望信号的导向矢量,g是一个复增益,通常为1。

采用拉格朗日乘子法,得到最优权向量为

W_{opt}=\frac{gR_n^{-1}a(\theta)}{a^H(\theta)R_n^{-1}a(\theta)}

则得到capon的空间谱为

P_{out} = \frac{g}{a^H(\theta)R_n^{-1}a(\theta)}

代码仿真

generateParameter.m文件更新

对generateParameter.m文件进行更新,具体代码如下:

复制代码
    % 参数设置
    function parameter = generateParameter()
    
    parameter.frameNumLoops = 18; %初始化frame循环
    parameter.frameCount = 0; %帧计数
    parameter.targetNums = 1; %初始化真实目标
    
    parameter.c = 3e8; %光速
    parameter.frameNums = 70; %帧数
    parameter.frameTime = 60e-3; %帧周期
    parameter.startFreq = 76.2e9;  %起始频率
    parameter.Fs = 18.75e6; %采样率 实采样率37.5MHz的采样率  复采样率为18.75MHz的采样率
    parameter.tr = 1 / parameter.Fs; %采样间隔
    parameter.Slope = 20e12; %chirp斜率
    parameter.Samples = 512;  %采样点
    parameter.rangeBin = 512; %rangebin
    parameter.Chirps = 384;  %chirp数
    parameter.dopplerBin = 384; %dopplerbin
    parameter.dopplerBinHalf = parameter.dopplerBin / 2; %多普勒bin的一半
    parameter.TrValid = parameter.Samples / parameter.Fs; %采样有效时间
    parameter.TrTotal = 38e-6;  %chirp周期
    parameter.t = 0:parameter.tr:parameter.TrValid - parameter.tr; %chirp时间下标
    parameter.validBandWidth = parameter.Slope * parameter.TrValid; %有效带宽
    parameter.totalBandWidth = parameter.Slope * parameter.TrTotal; %总带宽
    parameter.centerFreq = parameter.startFreq + parameter.validBandWidth / 2; %中心频率
    parameter.lambda = parameter.c / parameter.centerFreq; %波长
    
    parameter.rangeRes = parameter.c / (2 * parameter.validBandWidth); %距离分辨率
    parameter.rangeMax = parameter.rangeRes * parameter.rangeBin; %最大作用距离
    parameter.rangeIdx = (0:1:parameter.Samples-1); %range索引
    parameter.range = parameter.rangeIdx * parameter.rangeRes; %距离下标
    parameter.dopplerRes = parameter.lambda / (2 * parameter.dopplerBin * parameter.TrTotal); %速度分辨率
    parameter.dopplerMax = parameter.dopplerRes * parameter.dopplerBin; %最大探测速度,不考虑负速度
    parameter.dopplerHalfMax = parameter.dopplerMax / 2; %最大探测速度,考虑正负速度
    parameter.dopplerIdx = (0:1:parameter.dopplerBin-1); %dopplerIdx
    parameter.doppler = (parameter.dopplerIdx - parameter.dopplerBinHalf) * parameter.dopplerRes; %速度下标
    
    parameter.txAntenna = [0 4 8 12]; %发射天线 暂不考俯仰 2944的方位发射天线
    parameter.rxAntenna = [0 1 2 3]; %接收天线 2944的方位接收天线
    parameter.txNum = length(parameter.txAntenna); %发射天线的数量
    parameter.rxNum = length(parameter.rxAntenna); %接收天线的数量
    parameter.virtualAntenna = sort([parameter.rxAntenna + parameter.txAntenna(1), ...
        parameter.rxAntenna + parameter.txAntenna(2), ...
        parameter.rxAntenna + parameter.txAntenna(3), ...
        parameter.rxAntenna + parameter.txAntenna(4)]); %虚拟的阵元相对位置
    parameter.aperture = parameter.virtualAntenna(end) - parameter.virtualAntenna(1); %天线孔径大小
    parameter.virtualAntennaNums = parameter.txNum * parameter.rxNum; %虚拟天线的数量
    parameter.dx = parameter.lambda / 2; %虚拟天线的方位最小间距
    parameter.thetaFOV = asind(parameter.lambda / (2 * parameter.dx)); %方位向FOV
    parameter.thetaRes = asind(2 / parameter.aperture); %方位角分辨率
    parameter.angleIdx = asin((-128:1:128-1)/128) * 180 / pi; %方位角下标
    parameter.doaMethod = 1; %测角方法选择 1-dbf 2-fft 3-capon
    parameter.k = 2 * pi / parameter.lambda; %波数
    parameter.weightVec = exp(-1i*parameter.k * parameter.dx .* parameter.virtualAntenna.' * sind(parameter.angleIdx)); %权系数
    
    parameter.subBand = 6; %子带数
    parameter.emptyBand = 2; %空子带数
    parameter.validBand = parameter.txNum; %有效子带为发射天线数量
    parameter.subDopplerBin = parameter.dopplerBin / parameter.subBand; %一个子带dopplerbin的数目
    parameter.subBandRelation = [0, 1, 2, 3] * parameter.subDopplerBin; %子带间的关系
    parameter.phaseShift = mod(2*pi .* (1:1:parameter.Chirps).' .* (0:1:parameter.txNum-1) ./ parameter.subBand, 2*pi); %chirp信号的相移值
    
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

getTargetAngle.m文件

该程序针对通过CFAR算法检测到的目标进行角度计算,并提供多种解算方案以供选择。具体采用了DBP、FFT和Capon三种解算方案来实现目标角度的精确求解。

复制代码
    function [angle] = getTargetAngle(parameter,antVec)
    
    doaMethod = parameter.doaMethod; %doa解角方法
    if doaMethod == 1 %dbf
        angle = dbfMethod(parameter,antVec);
    elseif doaMethod == 2 %fft
        angle = fftMethod(parameter,antVec);
    elseif doaMethod == 3 %capon
        angle = caponMethod(parameter,antVec);
    else
    end
    end
    
    function [angle] = dbfMethod(parameter,antVec)
    
    doa_dbf = antVec * conj(parameter.weightVec) ;
    doa_abs = abs(doa_dbf);
    [~,maxIdx]=max(doa_abs);
    angle = parameter.angleIdx(maxIdx);
    
    end
    
    function [angle] = fftMethod(parameter,antVec)
    doa_abs=abs(fftshift(fft(antVec,256)));
    [~,maxIdx]=max(doa_abs);
    angle = parameter.angleIdx(maxIdx);
    end
    
    function [angle] = caponMethod(parameter,antVec)
    R_Hat = antVec.' * conj(antVec);
    R_HatInv = inv(R_Hat);
    for i = 1:1:length(parameter.angleIdx)
        doa_capon(i) = 1 / ((parameter.weightVec(:,i).') * R_HatInv * conj(parameter.weightVec(:,i)));
    end
    doa_abs = abs(doa_capon);
    [~,maxIdx]=max(doa_abs);
    angle = parameter.angleIdx(maxIdx);
    end
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

到这里为止

全部评论 (0)

还没有任何评论哟~