60 GHz FMCW 雷达手势数据集及MATLAB仿真代码

科技   2024-11-01 08:53   江苏  

点击下方卡片,关注“调皮连续波
一起学习和科普雷达技术!
【正文】
编辑|雷达小助理  审核|调皮哥 

一、数据集介绍

IEEE数据集官方下载链接:https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset

随着人机交互领域的不断发展,人们越来越需要新的手势识别方法,这些方法可用于从游戏和娱乐到医疗保健和机器人等各种应用。虽然传统的手势识别方法依赖于摄像头或其他光学传感器,但这些系统可能会受到照明条件和遮挡等因素的限制。

为了应对这些挑战,研究人员开发了一种基于雷达传感技术的新手势数据集。该数据集包含 21000 个精心挑选的手势,使用 英飞凌BGT60TR13C XENSIV™ 60GHz 调频连续雷达传感器记录。

我们相信,该数据集将成为手势识别领域研究人员和开发人员的宝贵资源。通过提供大量多样化的基于雷达的手势数据,我们希望能够开发出新的创新应用程序,以增强广泛领域的人机交互。

二、数据集说明

该雷达系统配置的工作频率范围为 58.5 GHz 至 62.5 GHz(4GHz),距离分辨率为 37.5mm,最大分辨距离为 1.2 米。对于信号发射,雷达采用突发配置,每突发 32 个chirps,帧率为 33 Hz,脉冲重复时间为 300 µs。

这些手势由 8 个人在 6 个不同位置执行,视野为 ±45°,距离雷达 ≤ 1 米。数据集包括五种不同的手势类型,包括向左滑动、向右滑动、向上滑动、向下滑动和推,每个手势记录的平均持续时间为 0.5 秒或 10 帧。数据集的总大小为 48.1 GB

室内地点包括健身房、图书馆、厨房、卧室、共享办公室和封闭的会议室。

每个手势样本的数据集序列保存为一个4维的numpy数组,100x3x32x64,其中第一维表示每个手势的帧长,第二维表示虚拟天线的数量,第三维表示一帧中的chirps数量,第四维表示样本数量。每个numpy文件的格式为GestureName_EnvironmentLabel_UserLabel_SampleLabel.npy,分别表示手势名称、环境标签、用户标签和样本编号。

环境标志定义如下:

· e1:封闭式会议室

· e2:开放式办公室

· e3:图书馆

· e4:厨房

· e5:健身房

· e6:卧室

用户标签定义如下(原文为p,实际数据集为u):

· u1:男性

· u2:女性

· u3:女性

· u4:男性

· u5:男性

· u6:男性

· u7:男性

· u8:男性

文件名示例:SwipeUp_e4_u1_s394.npy

三、解析代码

代码功能:

(1)MATLAB读取.npy数据文件。可以直接采用python读取,不过用MATLAB也能读,就是需要下载一个库文件。库文件下载链接:https://github.com/kwikteam/npy-matlab

(2)设置雷达参数,读取数据后进行测距、静态杂波滤除、测速、测水平角、测俯仰角度等等,结果如下图所示。

(3)保存图形为gif格式,如下图所示(SwipeRight_e1_u2_s113.npy数据)。

顶层代码如下:

mainv1.m和mainv2.m,分别采用不同的静态杂波滤除方法。

clc;close all;clear ;%% 作者:调皮连续波,微信公众号%% 时间:20241101%% 功能:实现FMCW MIMO雷达雷达手势数据读取和处理,输出距离、速度和角度信息,并用于手势识别%% 数据集:https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset
%% 添加MATLAB读取npy数据的函数路径addpath('..\fulldata_zipped\npy-matlab') ;addpath('..\fulldata_zipped\fulldata');
%% 读取npy数据filename ='SwipeUp_e4_u1_s394.npy';your_data = readNPY(filename);
%% 第一维表示每个手势的帧长,第二维表示虚拟天线的数量,第三维表示一帧中的chirps数量,第四维表示样本数量frame =size(your_data,1);VirtualArray = size(your_data,2);chirps =size(your_data,3);AdcSamples = size(your_data,4);
%% 波形参数B = ( 62.5- 58.5) *1e9;c =3*10^8;f = 60*10^9;lambda = c/f;res =c/(2*B);FrameRate =33;Tf = 1/FrameRate;Tc = 300*10^-6;vres = lambda/(2*chirps*Tc);fftpoint =AdcSamples/2;
%% 坐标轴Rax = (0:fftpoint-1)*res;Vex = (-chirps/2:chirps/2-1)*vres;
Rangefft = complex(zeros(VirtualArray,chirps,AdcSamples/2));Doppler = complex(zeros(VirtualArray,chirps,AdcSamples/2));
RangefftMTI = complex(zeros(VirtualArray,chirps,AdcSamples/2));

MtiSize =6; %MTI滑动窗长度MtiBuffer = complex(zeros(VirtualArray,AdcSamples/2,MtiSize));
%%gifName = '..\fulldata_zipped\fulldata\test.gif'; % 打开或者创建一个gif文件% 打开GIF文件以写入 if exist(gifName, 'file') delete(gifName); % 如果文件已存在,则删除 end fid = fopen(gifName, 'w');
for i =1:frame RadarData = squeeze(your_data(i,:,:,:)); for j =1:VirtualArray %时域信号 adcDataRowRx = squeeze(RadarData(j,:,:)); %%RangeFFT for k = 1:chirps temp= fft(adcDataRowRx(k,:)); Rangefft(j,k,:) =temp(:,1:AdcSamples/2); end %%静态杂波滤除算法 MtiBuffer(j,:,1:end -1) =MtiBuffer(j,:,2:end); MtiBuffer(j,:,end) = mean(squeeze(Rangefft(j,:,:)),1); RangefftMTI(j,:,:) = squeeze(Rangefft(j,:,:))-mean(squeeze(MtiBuffer(j,:,:)),2).'; %%DopplerFFT for m =1:AdcSamples/2 Doppler(j,:,m) = fftshift(fft(squeeze(RangefftMTI(j,:,m)))); end end
%%三个通道非相参积累 DopplerNCC = squeeze(sum(abs(Doppler),1));
% figure(1); % subplot(121); % mesh(abs(adcDataRowRx)); % xlabel('samples');ylabel('chirps');zlabel('Amp');title([filename,' # ADC data Frmes = ',num2str(i)]);grid on % % subplot(122); % imagesc(10*log10(abs(squeeze(RangefftMTI(1,:,:)))));axis xy % xlabel('Range(m)');ylabel('chirps');zlabel('Power(dB)');title('RangeFFT data');grid on

%%caponBFC测水平角 scale = -50:1:50; % 扫面范围 M=2; % 阵元单元 d = 0:lambda/2:(M-1)*lambda/2;% 阵列天线 N = size(Doppler,2); Rx(:,:,1) =squeeze(Doppler(1,:,:)); Rx(:,:,2) =squeeze(Doppler(3,:,:)); P_Capon =zeros(length(Rax),length(scale)); idR =0; for r =1:fftpoint idR =idR+1; Y =squeeze( Rx(:,r,:)).'; R = (Y*Y')/N; R_inv = pinv(R); idx = 1; for n=scale steeringVector = (exp(-1j*2*pi/lambda*d*sind(n))).'; % 转向矢量转置 P_Capon(idR,idx) =( 1/(steeringVector'*R_inv*steeringVector)); % Capon算法 idx = idx + 1; end end
%%caponBF测俯仰角    scale = -50:1:50;   % 扫面范围 M=2; % 阵元单元 d = 0:lambda/2:(M-1)*lambda/2;% 阵列天线 N = size(Doppler,2); Rx(:,:,1) =squeeze(Doppler(2,:,:)); Rx(:,:,2) =squeeze(Doppler(3,:,:)); P_CaponEle =zeros(length(Rax),length(scale)); idR =0; for r =1:fftpoint idR =idR+1; Y =squeeze( Rx(:,r,:)).'; R = (Y*Y')/N; R_inv = pinv(R); idx = 1; for n=scale steeringVector = (exp(-1j*2*pi/lambda*d*sind(n))).'; % 转向矢量转置 P_CaponEle(idR,idx) =( 1/(steeringVector'*R_inv*steeringVector)); % Capon算法 idx = idx + 1; end    end
figure(2); subplot(131); imagesc(Rax,Vex,10*log10(DopplerNCC));axis xy clim([30,40]) xlabel('Range(m)');ylabel('Doppler(m/s)');zlabel('Power(dB)');title(['DopplerFFT data # Frames = ',num2str(i)]);grid on
subplot(132); imagesc(scale,Rax,10*log10(abs(P_Capon))); axis xy clim([50,65]) xlabel('Horizontal Angle(°)');ylabel('Range(m)');zlabel('Power(dB)');title('Horizontal CaponBF DOA');grid on
subplot(133); imagesc(scale,Rax,10*log10(abs(P_CaponEle))); axis xy clim([50,65]) xlabel('Pitch Angle(°)');ylabel('Range(m)');zlabel('Power(dB)');title('Pitch CaponBF DOA');grid on
% 写入gif过程 frame = getframe(gcf); im{i} = frame2im(frame); [A,map] = rgb2ind(im{i},256); %将 RGB 图像转换为索引图像 A。map 最多包含 n 个颜色。 if i == 1 imwrite(A,map,gifName,'gif','LoopCount',Inf,'DelayTime',0.1);%'DelayTime'为每帧图像播放时间 else imwrite(A,map,gifName,'gif','WriteMode','append','DelayTime',0.1); end % pause(0.1)
endfclose(gifName);

四、全部代码和数据集下载方式

本文为感谢2024年度新/老会员(未过期论文品读专栏订阅读者的支持,本学习资料特此提供(可私信获取)。

年度会员雷达技术知识服务:年度会员权益说明(2024版)

论文品读专栏:点击跳转

参考资料

https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset

推荐阅读

FMCW MIMO雷达距离角度扇形谱图生成仿真代码

(四十九)使用60GHz雷达传感器实现基于深度学习的脚踢动作识别

4D毫米波雷达 :RADIal雷达数据分享(附下载链接)

【本期结束】

加雷达群(备注单位+研究方向)、产品推广(雷达芯片、雷达模组、雷达产品和解决方案)、企业品牌推广、招生/招聘宣传、展会/学术活动宣传、宣传推文撰写和代发、文章转载开白、雷达行业/技术交流、年度会员、付费咨询、代码仿真、资料代找、企业引流、公众号互推、文章投稿、其他合作或问题,请扫描下方二维码

喜欢文章可以一键四连【分享】【收藏】【在看】【点赞】,有疑问可以在文章最下方写留言给我留言!

调皮连续波
做好雷达科普,与大家一起成长!
 最新文章