main文件
负责遍历所有文件,创建文件夹,保存数据
clear;
clc;
close all;
dir_name='res';
% 调用函数,遍历名为'dir'的文件夹及其所有子文件夹
traverseFolders(dir_name);
function traverseFolders(folderPath)
% 获取指定文件夹下的所有文件和子文件夹
currentDir = dir(fullfile(folderPath, "*"));
% 遍历当前文件夹下的所有文件和子文件夹
for i = 1:length(currentDir)
if ~isfolder(fullfile(folderPath, currentDir(i).name))
bin_file = currentDir(i).name(length(currentDir(i).name) - length('.bin')+ 1:length(currentDir(i).name));
% 如果不是文件夹,则是文件,可以执行相应的操作
if strcmp(bin_file, '.bin')
[file_number, ~] = strsplit(currentDir(i).name, '.');
file_number = file_number{1};
fprintf("%s \n", file_number)
file_path = fullfile(folderPath, currentDir(i).name);
[X,Y,Z] = convert_main(file_path, 0);
dst_path = strrep(file_path, "res", "dots");
dst_path = strrep(dst_path, "bin", "txt");
fprintf("%s--%d--d:%s\n", bin_file, file_number, dst_path)
dlmwrite(strrep(dst_path, file_number, "X" + file_number), X, ' ');
% dlmwrite('output_column.txt', Y, ' ');
% dlmwrite('output_column.txt', Z, ' ');
end
% fprintf('文件: %s\n', fullfile(folderPath, currentDir(i).name));
else
% 如果是文件夹,则递归遍历子文件夹
if strcmp(currentDir(i).name, '.') || strcmp(currentDir(i).name, '..')
% 忽略当前文件夹和父文件夹
continue;
end
% 递归调用traverseFolders函数处理子文件夹
if ~exist(fullfile("dots", currentDir(i).name), 'dir')
mkdir(fullfile("dots", currentDir(i).name));
disp('文件夹已成功创建。');
else
disp('文件夹已存在。');
end
traverseFolders(fullfile(folderPath, currentDir(i).name));
end
end
end
convert_main
负责转换数据
function [RX, RY, RZ] = convert_main(fileName, show)
% fileName='12.bin';
SampleNum = 128;
ChirpNum = 128;
[retVal] = readDCA1000_convert(fileName,SampleNum);
Frame = 100;
waveLength = 300/61200;
elementDistance = 2.5e-3;
x_range=zeros(1,200);
y_range=zeros(1,200);
z_range=zeros(1,200);
X=zeros(1,200);
Y=zeros(1,200);
Z=zeros(1,200);
for FrameNum = 1:Frame
data1 = retVal(1,(FrameNum-1)*SampleNum*ChirpNum+1:SampleNum*ChirpNum*(FrameNum));
data2 = reshape(data1,SampleNum,[]);
%T1R1 = data2(:,1:3:end);
T2R1 = data2;
%T3R1 = data2(:,3:3:end);
if show
plot(real(T2R1))
end
data1 = retVal(2,(FrameNum-1)*SampleNum*ChirpNum+1:SampleNum*ChirpNum*(FrameNum));
data2 = reshape(data1,SampleNum,[]);
%T1R2 = data2(:,1:3:end);
T2R2 = data2;
%T3R2 = data2(:,3:3:end);
data1 = retVal(3,(FrameNum-1)*SampleNum*ChirpNum+1:SampleNum*ChirpNum*(FrameNum));
data2 = reshape(data1,SampleNum,[]);
%T1R3 = data2(:,1:3:end);
T2R3 = data2;
%T3R3 = data2(:,3:3:end);
data1 = retVal(4,(FrameNum-1)*SampleNum*ChirpNum+1:SampleNum*ChirpNum*(FrameNum));
data2 = reshape(data1,SampleNum,[]);
%T1R3 = data2(:,1:3:end);
T2R4 = data2;
%T3R3 = data2(:,3:3:end);
%plot(real(T2R4))
% ces_T2R1 = T2R1(:,64)-T2R1(:,1);
% RangeFFTces1 = fft( ces_T2R1.*hann(64) );
% [cesvalue1,cesloc1] = max(RangeFFTces1(2:20));
% RangePhaseInRad1ces1 = angle( RangeFFTces1(cesloc1+1) );
% track(FrameNum,1) = cesloc1;
%
% ces_T2R2 = T2R2(:,64)-T2R2(:,1);
% RangeFFTces2 = fft( ces_T2R2.*hann(64) );
% [cesvalue2,cesloc2] = max(RangeFFTces2(2:20));
% RangePhaseInRad1ces2 = angle( RangeFFTces2(cesloc2+1) );
% track2(FrameNum,1) = cesloc2;
%%
for ii=1:128
if(sum(T2R1(:,ii))==0)
T2R1(:,ii)=T2R1(:,ii-1);
end
RangeFFT1(:,ii) = fft( T2R1(:,ii).*hann(128) );
RangePhaseInRad1(:,ii) = angle( RangeFFT1(:,ii) );
end
RangeFFT1(1,:)=0;
for ii=1:128
VelFFT1(ii,:) = fft( RangeFFT1(ii,:).*hann(128)' );
VelocityPhaseInRad1(ii,:) = angle( VelFFT1(ii,:) );
end
VelFFT1(:,1)=0;
for ii=1:128
if(sum(T2R2(:,ii))==0)
T2R2(:,ii)=T2R2(:,ii-1);
end
RangeFFT2(:,ii) = fft( T2R2(:,ii).*hann(128) );
RangePhaseInRad2(:,ii) = angle( RangeFFT2(:,ii) );
end
RangeFFT2(1,:)=0;
for ii=1:128
VelFFT2(ii,:) = fft( RangeFFT2(ii,:).*hann(128)' );
VelocityPhaseInRad2(ii,:) = angle( VelFFT2(ii,:) );
end
VelFFT2(:,1)=0;
for ii=1:128
if(sum(T2R3(:,ii))==0)
T2R3(:,ii)=T2R3(:,ii-1);
end
RangeFFT3(:,ii) = fft( T2R3(:,ii).*hann(128) );
end
RangeFFT3(1,:)=0;
for ii=1:128
VelFFT3(ii,:) = fft( RangeFFT3(ii,:).*hann(128)' );
VelocityPhaseInRad3(ii,:) = angle( VelFFT3(ii,:) );
end
VelFFT3(:,1)=0;
for ii=1:128
if(sum(T2R4(:,ii))==0)
T2R4(:,ii)=T2R4(:,ii-1);
end
RangeFFT4(:,ii) = fft( T2R4(:,ii).*hann(128) );
end
RangeFFT4(1,:)=0;
for ii=1:128
VelFFT4(ii,:) = fft( RangeFFT4(ii,:).*hann(128)' );
VelocityPhaseInRad4(ii,:) = angle( VelFFT4(ii,:) );
end
VelFFT4(:,1)=0;
% if(FrameNum>25)
% FrameNum
% figure(2)
% %mesh(abs(VelFFT1(2:50,3:127)));
% mesh(abs(VelFFT1))
% axis([3 127 0 50 0 1e5]);
% pause(0.5);
% end
% figure(2)
% plot(abs(RangeFFT(2:50,:)))
% axis([0 50 0 0.8e5]);
% pause(0.5);
% if (FrameNum==120)
% pause(0.1);
% end
%%
TargetRange=[];
TargetVelocity=[];
TargetAmp=[];
LoopTargetNumber=0;
% maxvelvalue = max(max(abs(VelFFT1(2:20,3:31))));
% [maxrow , maxcol] = find(abs(VelFFT1(2:20,3:31)) == maxvelvalue);
% rowlast = maxrow+1;
% collast = maxcol+2;
%
% maxvelvalue1 = max(max(abs(VelFFT2(2:20,3:31))));
% [maxrow1 , maxcol1] = find(abs(VelFFT2(2:20,3:31)) == maxvelvalue1);
% rowlast1 = maxrow1+1;
% collast1 = maxcol1+2;
%
% ZhaoYaobuniubidejiaodu(FrameNum,1) = AngleProcess(VelocityPhaseInRad3(rowlast,collast),VelocityPhaseInRad3(rowlast1,collast1),elementDistance, waveLength);
for p=3:127%15
[pks2,locs2] = findpeaks(abs(VelFFT1(7:15,p)));%20
for z=1:length(pks2)
if( pks2(z)>20000 ) %(locs2(z)+1)<10 &&13
LoopTargetNumber = LoopTargetNumber+1;
TargetRange(LoopTargetNumber)=locs2(z)+5;
TargetVelocity(LoopTargetNumber)=p;
TargetAmp(LoopTargetNumber)=pks2(z);
end
end
end
% for p=3:127%15
% [pks2,locs2] = findpeaks(abs(VelFFT2(6:20,p)));%20
% for z=1:length(pks2)
% if( pks2(z)>40000 ) %(locs2(z)+1)<10 &&13
% LoopTargetNumber = LoopTargetNumber+1;
% TargetRange(LoopTargetNumber)=locs2(z)+5;
% TargetVelocity(LoopTargetNumber)=p;
% TargetAmp(LoopTargetNumber)=pks2(z);
% end
% end
% end
if(FrameNum==25)
pause(0.1);
end
if ( length(TargetRange) > 0 )
for r=1:length(TargetRange)
PitchAngle(r,FrameNum) = AngleProcess( VelocityPhaseInRad2(TargetRange(r),TargetVelocity(r)), VelocityPhaseInRad1(TargetRange(r),TargetVelocity(r)), elementDistance, waveLength );
AzimuthAngle(r,FrameNum) = AngleProcess( VelocityPhaseInRad3(TargetRange(r),TargetVelocity(r)), VelocityPhaseInRad1(TargetRange(r),TargetVelocity(r)), elementDistance, waveLength );
if( abs(PitchAngle(r,FrameNum))<60 && abs(AzimuthAngle(r,FrameNum))<60 )
Y(r,FrameNum)=cos( AzimuthAngle(r,FrameNum) *pi/180)*TargetRange(r)*0.085;%Y(r,ii)
X(r,FrameNum)=sin( AzimuthAngle(r,FrameNum) *pi/180)*TargetRange(r)*0.085;%cos( PitchAngle(r,ii) *pi/180)*% X(r,ii) Z( round(X(r,ii)) +20, round(Y(r,ii))+20 )
Z(r,FrameNum)=sin( PitchAngle(r,FrameNum) *pi/180)*TargetRange(r)*0.085;
end
end
% Y(Y<5)=0;
% X(X<5)=0;
% Z(Z<5)=0;
x_range(FrameNum)=sum( X(:,FrameNum))/length(nonzeros(X(:,FrameNum)));
y_range(FrameNum)=sum( Y(:,FrameNum))/length(nonzeros(Y(:,FrameNum)));
z_range(FrameNum)=sum( Z(:,FrameNum))/length(nonzeros(Z(:,FrameNum)));
% figure(3)
% plot3(X(:,FrameNum), Y(:,FrameNum),Z(:,FrameNum),'.')
% hold on
% grid on
% axis([-2 2 -2 2 0 3])
% pause(0.1)
if show
figure(4);
plot(X(:,FrameNum), Y(:,FrameNum),'*');
axis([-2 2 -2 2])
hold on
pause(0.01);
figure(5);
plot(X(:,FrameNum), Z(:,FrameNum),'*');
axis([-2 2 -2 2]);
hold on
pause(0.01);
end
else
RangeOut(ii)=0;
VelOut(ii)=0;
% PitchAngle(1,ii) =0;
% AzimuthAngle(1,ii)=0;
end
end
RX = X;
RY = Y;
RZ = Z;
end
readDCA1000_convert
负责转换DCA数据
%%% This script is used to read the binary file produced by the DCA1000 and Mmwave Studio
%%% Command to run in Matlab GUI -
function [retVal] = readDCA1000_convert(fileName,SampleNum)
%% global variables
% change based on sensor config
numADCSamples = SampleNum; % number of ADC samples per chirp
numADCBits = 16; % number of ADC bits per sample
numRX = 4; % number of receivers
numLanes = 2; % do not change. number of lanes is always 2
isReal = 0; % set to 1 if real only data, 0 if complex data0
%% read file
% read .bin file
fid = fopen(fileName,'r');
adcData = fread(fid, 'int16');
% if 12 or 14 bits ADC per sample compensate for sign extension
if numADCBits ~= 16
l_max = 2^(numADCBits-1)-1;
adcData(adcData > l_max) = adcData(adcData > l_max) - 2^numADCBits;
end
fclose(fid);
fileSize = size(adcData, 1);
% real data reshape, filesize = numADCSamples*numChirps
if isReal
numChirps = fileSize/numADCSamples/numRX;
LVDS = zeros(1, fileSize);
%create column for each chirp
LVDS = reshape(adcData, numADCSamples*numRX, numChirps);
%each row is data from one chirp
LVDS = LVDS.';
else
% for complex data
% filesize = 2 * numADCSamples*numChirps
numChirps = fileSize/2/numADCSamples/numRX;
LVDS = zeros(1, fileSize/2);
%combine real and imaginary part into complex data
%read in file: 2I is followed by 2Q
counter = 1;
for i=1:4:fileSize-1
LVDS(1,counter) = adcData(i) + sqrt(-1)*adcData(i+2);
LVDS(1,counter+1) = adcData(i+1)+sqrt(-1)*adcData(i+3);
counter = counter + 2;
end
% create column for each chirp
LVDS = reshape(LVDS, numADCSamples*numRX, numChirps);
%each row is data from one chirp
LVDS = LVDS.';
end
%organize data per RX
adcData = zeros(numRX,numChirps*numADCSamples);
for row = 1:numRX
for i = 1: numChirps
adcData(row, (i-1)*numADCSamples+1:i*numADCSamples) = LVDS(i, (row-1)*numADCSamples+1:row*numADCSamples);
end
end
% return receiver data
retVal = adcData;