From 9cfc66de4879957b4a7ba42c088825c9836e1064 Mon Sep 17 00:00:00 2001 From: "St. Zhang" <119722046+StZhang-B@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:41:39 +0800 Subject: [PATCH] Add files via upload --- .../DCA1000_Read_Data.m | 55 +++++++++++++++ Basic Mmwave Signal Processing/demo.m | 69 +++++++++++++++++++ .../generateParameter.m | 37 ++++++++++ 3 files changed, 161 insertions(+) create mode 100644 Basic Mmwave Signal Processing/DCA1000_Read_Data.m create mode 100644 Basic Mmwave Signal Processing/demo.m create mode 100644 Basic Mmwave Signal Processing/generateParameter.m diff --git a/Basic Mmwave Signal Processing/DCA1000_Read_Data.m b/Basic Mmwave Signal Processing/DCA1000_Read_Data.m new file mode 100644 index 0000000..9417841 --- /dev/null +++ b/Basic Mmwave Signal Processing/DCA1000_Read_Data.m @@ -0,0 +1,55 @@ +function data_radar=DCA1000_Read_Data(fname) + global parameter; + global frame; + + %% 读取回波数据 + fid = fopen(fname,'rb'); + %16bits,复数形式(I/Q两路),4RX,3TX,有符号16bit + sdata = fread(fid,frame*parameter.Samples*parameter.Chirps*4*3*2,'int16'); + sdata = sdata((frame-1)*parameter.Samples*parameter.Chirps*4*3*2+1:frame*parameter.Samples*parameter.Chirps*4*3*2); + + %% 1843+DCA1000 + fileSize = size(sdata, 1); + lvds_data = zeros(1, fileSize/2); + count = 1; + for i=1:4:fileSize-5 + lvds_data(1,count) = sdata(i) + 1i*sdata(i+2); + lvds_data(1,count+1) = sdata(i+1)+1i*sdata(i+3); + count = count + 2; + end + lvds_data = reshape(lvds_data, parameter.Samples*parameter.txNum*parameter.rxNum, parameter.Chirps); + lvds_data = lvds_data.'; + cdata = zeros(parameter.txNum*parameter.rxNum,parameter.Chirps*parameter.Samples); + for row = 1:parameter.txNum*parameter.rxNum + for i = 1: parameter.Chirps + cdata(row,(i-1)*parameter.Samples+1:i*parameter.Samples) = lvds_data(i,(row-1)*parameter.Samples+1:row*parameter.Samples); + end + end + fclose(fid); + data_radar_1 = reshape(cdata(1,:),parameter.Samples,parameter.Chirps); %TX1 RX1 + data_radar_2 = reshape(cdata(2,:),parameter.Samples,parameter.Chirps); %TX1 RX2 + data_radar_3 = reshape(cdata(3,:),parameter.Samples,parameter.Chirps); %TX1 RX3 + data_radar_4 = reshape(cdata(4,:),parameter.Samples,parameter.Chirps); %TX1 RX4 + data_radar_5 = reshape(cdata(5,:),parameter.Samples,parameter.Chirps); %TX2 RX1 + data_radar_6 = reshape(cdata(6,:),parameter.Samples,parameter.Chirps); %TX2 RX2 + data_radar_7 = reshape(cdata(7,:),parameter.Samples,parameter.Chirps); %TX2 RX3 + data_radar_8 = reshape(cdata(8,:),parameter.Samples,parameter.Chirps); %TX2 RX4 + data_radar_9 = reshape(cdata(9,:),parameter.Samples,parameter.Chirps); %TX3 RX1 + data_radar_10 = reshape(cdata(10,:),parameter.Samples,parameter.Chirps); %TX3 RX2 + data_radar_11 = reshape(cdata(11,:),parameter.Samples,parameter.Chirps); %TX3 RX3 + data_radar_12 = reshape(cdata(12,:),parameter.Samples,parameter.Chirps); %TX3 RX4 + data_radar=[]; + data_radar(:,:,1)=data_radar_1; %三维雷达回波数据 + data_radar(:,:,2)=data_radar_2; + data_radar(:,:,3)=data_radar_3; + data_radar(:,:,4)=data_radar_4; + data_radar(:,:,5)=data_radar_5; + data_radar(:,:,6)=data_radar_6; + data_radar(:,:,7)=data_radar_7; + data_radar(:,:,8)=data_radar_8; + data_radar(:,:,9)=data_radar_9; + data_radar(:,:,10)=data_radar_10; + data_radar(:,:,11)=data_radar_11; + data_radar(:,:,12)=data_radar_12; + +end \ No newline at end of file diff --git a/Basic Mmwave Signal Processing/demo.m b/Basic Mmwave Signal Processing/demo.m new file mode 100644 index 0000000..a50762d --- /dev/null +++ b/Basic Mmwave Signal Processing/demo.m @@ -0,0 +1,69 @@ +clear;close all;clc; + +%% 雷达参数(使用mmWave Studio默认参数) +global parameter; +parameter = generateParameter(); +Range_Res=parameter.c/(2*parameter.BandwidthValid); %距离分辨率 +Range_Index=Range_Res*(1:parameter.rangeBin); +Speed_Res=parameter.lambda/(2*parameter.dopplerBin*parameter.Tc); +Speed_Index=(-parameter.dopplerBin/2:1:parameter.dopplerBin/2-1)*Speed_Res; +Azimuth_Index=(-parameter.angleBin/2:1:parameter.angleBin/2-1); +global frame; +frame = 1; %第frame帧 + +%% 读取原始ADC数据 +fname='C:\ti\mmwave_studio_02_01_01_00\mmWaveStudio\PostProc\adc_data.bin'; +data_radar=DCA1000_Read_Data(fname); + +%% 距离FFT +range_win = hamming(parameter.Samples); %加海明窗 +doppler_win = hamming(parameter.Chirps); +range_profile = zeros(parameter.Samples,parameter.Chirps,parameter.txNum*parameter.rxNum); +for k=1:parameter.txNum*parameter.rxNum + for m=1:parameter.Chirps + temp=data_radar(:,m,k).*range_win; %加窗函数 + temp_fft=fft(temp,parameter.rangeBin); %对每个chirp做N点FFT + range_profile(:,m,k)=temp_fft; + end +end + +%% 多普勒FFT +speed_profile = zeros(parameter.Samples,parameter.Chirps,parameter.txNum*parameter.rxNum); +for k=1:parameter.rxNum + for n=1:parameter.rangeBin + temp=range_profile(n,:,k).*(doppler_win)'; + temp_fft=fftshift(fft(temp,parameter.dopplerBin)); %对rangeFFT结果进行M点FFT + speed_profile(n,:,k)=temp_fft; + end +end + +%% 方位角FFT +angle_profile = zeros(parameter.Samples,parameter.Chirps,parameter.angleBin); +for n=1:parameter.rangeBin %range + for m=1:parameter.dopplerBin %chirp + temp=speed_profile(n,m,:); + temp=temp(1:8); + temp_fft=fftshift(fft(temp,parameter.angleBin)); %对2D FFT结果进行Q点FFT + angle_profile(n,m,:)=temp_fft; + end +end + +%% 绘制2D FFT的三维视图 +figure(1); +speed_profile_temp = reshape(speed_profile(:,:,1),parameter.rangeBin,parameter.dopplerBin); +speed_profile_Temp = speed_profile_temp'; +[X,Y]=meshgrid((0:parameter.rangeBin-1)*parameter.Fs*parameter.c/parameter.rangeBin/2/parameter.Slope,(-parameter.dopplerBin/2:parameter.dopplerBin/2-1)*parameter.lambda/parameter.Tc/parameter.dopplerBin/2); +mesh(X,Y,(abs(speed_profile_Temp))); +xlabel('距离(m)');ylabel('速度(m/s)');zlabel('信号幅值'); +title('2D FFT处理三维视图'); +xlim([0 (parameter.rangeBin-1)*parameter.Fs*parameter.c/parameter.rangeBin/2/parameter.Slope]); ylim([(-parameter.dopplerBin/2)*parameter.lambda/parameter.Tc/parameter.dopplerBin/2 (parameter.dopplerBin/2-1)*parameter.lambda/parameter.Tc/parameter.dopplerBin/2]); + +%% 得到Range-Azimuth热力图 +angle_profile_display=abs(angle_profile); +angle_profile_display=squeeze(sum(angle_profile_display,2)); +figure(2); +imagesc(Azimuth_Index,Range_Index,angle_profile_display); +set(gca,'YDir','normal'); +title('Range-Azimuth Heatmap', 'FontWeight', 'bold'); +xlabel('Azimuth(°)'); +ylabel('Range(m)'); diff --git a/Basic Mmwave Signal Processing/generateParameter.m b/Basic Mmwave Signal Processing/generateParameter.m new file mode 100644 index 0000000..a2622ae --- /dev/null +++ b/Basic Mmwave Signal Processing/generateParameter.m @@ -0,0 +1,37 @@ +%% 雷达参数设置 +function parameter = generateParameter() + + parameter.c = 3e8; %光速 + + parameter.stratFreq = 77e9; %起始频率 + + parameter.Tr = 60e-6; %扫频时间 + parameter.Idle_time = 100e-6; %空闲时间 + parameter.Tc = parameter.Tr+parameter.Idle_time; %Chirp之间的间隔 + parameter.Samples = 256; %采样点 + parameter.Fs = 10e6; %采样率 + parameter.Tframe_set = 80e-3; % 帧周期 + + parameter.rangeBin = parameter.Samples ; %rangebin + parameter.Chirps = 128; %chirp数 + parameter.dopplerBin = parameter.Chirps; %dopplerbin + + parameter.Slope = 29.982e12; %chirp斜率 + parameter.Bandwidth = parameter.Slope * parameter.Tr ; %发射信号有效带宽 + parameter.BandwidthValid = parameter.Samples/parameter.Fs*parameter.Slope; %发射信号带宽 + parameter.centerFreq = parameter.stratFreq + parameter.Bandwidth / 2; %中心频率 + parameter.lambda = parameter.c / parameter.centerFreq; %波长 + + parameter.txAntenna = ones(1,3); %发射天线个数 + parameter.rxAntenna = ones(1,4); %接收天线个数 + parameter.txNum = length(parameter.txAntenna); + parameter.rxNum = length(parameter.rxAntenna); + parameter.virtualAntenna = length(parameter.txAntenna) * length(parameter.rxAntenna); + parameter.angleBin = 180; %anglebin + + parameter.dz = parameter.lambda / 2; %接收天线俯仰间距 + parameter.dx = parameter.lambda / 2; %接收天线水平间距 + + parameter.numCPI = 50; % 帧数 + +end