From 3a4b2f7c86c8b4f8a0b354d6aa2ed60da00ac6e6 Mon Sep 17 00:00:00 2001 From: "St. Zhang" <119722046+StZhang-B@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:51:18 +0800 Subject: [PATCH] Add files via upload --- main.m | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 main.m diff --git a/main.m b/main.m new file mode 100644 index 0000000..1534ed4 --- /dev/null +++ b/main.m @@ -0,0 +1,112 @@ +%% 功能:毫米波雷达点云生成流程MATLAB仿真 +%% 思考:如何将IWR1843EVM+DCA1000采集得到的数据移植到这份代码上 + +clc;clear;close all; + +Frame =1; %帧数设置; + +for frame =1:Frame %帧数设置 + +%% 雷达参数设置 +parameter = generateParameter(); +parameter.frame = frame; + +%% 雷达回波信号建模 +rawData = generateSignal(parameter); +firstChirp = rawData(1,:,1); + +figure(1); +plot(real(firstChirp)); +hold on; +plot(imag(firstChirp)); +xlabel('采样点数'); ylabel('幅值');title('原始数据实虚部');%第1个chirp。 + +%% 雷达信号处理 +rangeRes = parameter.c / (2 * parameter.BandwidthValid); %距离分辨率 有效带宽 +rangeIndex = (0:parameter.rangeBin-1) * rangeRes; +speedRes = parameter.lambda / (2 * parameter.dopplerBin * parameter.Tr); +dopplerIndex = (-parameter.dopplerBin/2:1:parameter.dopplerBin/2 - 1) * speedRes; +angleRes = parameter.lambda / (parameter.virtualAntenna * parameter.dx) * 180 / pi; +angleIndex = (-parameter.virtualAntenna/2:1:parameter.virtualAntenna/2 - 1) * angleRes; + +%% 1D FFT +fft1dData = fft(firstChirp); +figure(2); +plot(rangeIndex,db(abs(fft1dData)./max(abs(fft1dData)))); +xlabel('距离(m)'); ylabel('幅值(dB)');title('距离维FFT'); + +%% 2D FFT +%% 距离-多普勒谱 +channelNum = size(rawData,1); +rangebinNum = size(rawData,2); +dopplerbinNum = size(rawData,3); +fft2dDataPower= zeros(size(rawData)); +fft2dDataDB = zeros(size(rawData)); +fftRADataPower= zeros(size(rawData)); +for chanId = 1:1:channelNum + fft2dDataPower(chanId,:,:) = RDfftMatrix(rawData(chanId,:,:)); +end + +figure(3); +mesh(dopplerIndex',rangeIndex,db(abs(squeeze(fft2dDataPower(chanId,:,:))))); +view(2); +xlabel('速度(m/s)'); ylabel('距离(m)'); zlabel('幅值'); +title('距离-多普勒谱'); +mesh(abs(squeeze(fft2dDataPower(chanId,:,:)))); +display_static=[30,100,400,300]; +set(gcf,'Position',display_static); % [左下角x,左下角y,宽度,高度] + +%% 距离-角度谱 +for dopplerId = 1:1:dopplerbinNum + fftRADataPower(:,:,dopplerId) = RAfftMatrix(rawData(:,:,dopplerId)); +end + +figure(4); +imagesc(rangeIndex,angleIndex,(abs(squeeze(fftRADataPower(:,:,dopplerId))))); +view(2); +xlabel('距离(m)'); ylabel('角度'); zlabel('幅值'); +title('距离-角度谱'); + +%% 多通道非相干积累 +accumulateRD = chan_Accumulate((fft2dDataPower)); +figure(5); +imagesc(dopplerIndex',rangeIndex,db(accumulateRD)); +view(2); +xlabel('速度(m/s)'); ylabel('距离(m)'); zlabel('幅值'); +title(['通道积累 第',num2str(frame),'帧']); +pause(0.01); + +%% CFAR检测 +cfarParameter = generateCfarParameter(); %生成cfar数据 +[pointList,cfarRD] = cfar(cfarParameter,db(accumulateRD)); +figure(6); +mesh(dopplerIndex',rangeIndex,cfarRD); +xlabel('速度(m/s)'); ylabel('距离(m)'); zlabel('幅值'); +title('cfar'); +display_static=[30,100,400,300]; +set(gcf,'Position',display_static); % [左下角x,左下角y,宽度,高度] + +%% peakSearch +[RD_pearkSearch,peakSearchList] = peakSearch(cfarRD,pointList); +detectPointNum = size(peakSearchList,2); + +%% DOA估计 +for targetIdx = 1:detectPointNum + rangeBin = peakSearchList(1,targetIdx); + speedBin = peakSearchList(2,targetIdx); + range = (rangeBin - 1) * rangeRes; + speed = (speedBin - parameter.dopplerBin/2 - 1) * speedRes; + ant = squeeze(fft2dDataPower(:,rangeBin,speedBin)); + [angle,doa_abs] = doa(parameter,ant); + + figure(7); + angleIndex = asin((-512:1:512-1)/512) * 180 / pi; + hold on; + plot(angleIndex,doa_abs);grid on + title('测角结果'); + xlabel('角度');ylabel('幅值'); + fprintf('目标%d的距离为%f,速度为%f,角度为%f\n',targetIdx,range,speed,angle); + +end + +end