113 lines
3.7 KiB
Mathematica
113 lines
3.7 KiB
Mathematica
![]() |
%% 功能:毫米波雷达点云生成流程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
|