PKU-Millimeter-Wave-Radar-T.../main.m
2024-03-11 21:03:35 +08:00

113 lines
3.7 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% 功能毫米波雷达点云生成流程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