【TI-mmWave】生命特征提取:呼吸&心跳检测(AWR1243+DCA1000)
〇、毫米波雷达的应用
- 汽车雷达AWR——高级辅助驾驶系统(Advanced Driving Assistance System, ADAS)
1.接近度传感器(~20m):开车门告警、自动停车、车内人员检测(驾驶员的心跳呼吸检测);
2.短距和超短距雷达(~80m):盲点检测(Blind Spot Detection, BSD);
3.车载前向雷达(~200m): 自适应巡航(Adaptive Cruise Control, ACC), 自动紧急制动(Autonomous Emergency Braking, AEB) - 工业雷达IWR(IWR与WAR功能相同,主要的区别是AWR系列的芯片要符合汽车安全等级,需要通过ASIL-B的等级认证,价格更高)
1.液位检测
2.双备份的安防领域监控(与摄像头融合,多传感器融合)、室内人员跟踪与人数统计(考虑到环境和个人隐私问题)
3.无人机测高和避障
4.医疗:呼吸心跳检测(~0.5m)
TI毫米波雷达应用介绍:
https://edu.21ic.com/video/2625 - 本章节的研究重点是心跳和呼吸的检测。
应用背景:驾驶员的心跳呼吸检测,及时发现驾驶员的健康问题,防止突发疾病造成交通事故。
优势:非接触式,不需要佩戴任何设备;毫米波检测精度高;单芯片解决方案,体积小。
一、毫米波雷达生命特征提取原理
1.TI官方资料
- 毫米波雷达的应用无处不在
https://edu.21ic.com/video/2625 - Vital Signs 68xx Developer's Guide
https://dev.ti.com/tirex/explore/node?devtools=IWR6843ISK&node=A__AMuRqMvrweG4DqrGojBlxw__com.ti.mmwave_industrial_toolbox__VLyFKFf__LATEST - mmWave生命体征实验
https://edu.21ic.com/video/2264 - 动态位置人员生命体征监测的系统实现方法
https://www.ti.com.cn/cn/lit/an/zhcaa51/zhcaa51.pdf?ts=1705220856718&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Ftool%252Fcn%252FIWR6843ISK%253FkeyMatch%253DIWR6843ISK
2.中文社区资料:
- TI毫米波雷达人体生命体征(呼吸、心跳)信号提取算法(IWR6843ISK+DCA1000EVM)
https://blog.csdn.net/m0_61934621/article/details/132047756?spm=1001.2014.3001.5506 - 毫米波雷达心率、呼吸原理实现(一)实例
https://blog.csdn.net/Poulen/article/details/127502203
3.参考文献
- 张兰春,顾海潮.基于毫米波雷达的生命体征检测[J].农业装备与车辆工程,2022,60(03):79-82.
二、实验配置
- 雷达参数配置
起始频率Fstart=77GHz(波长lambda=4mm),帧周期50mm(相应的采样频率Fs=20Hz),帧数2400,观测时间t=120s。
三、算法流程
0.算法流程图
1.原始生命体征信号 --> 距离FFT
%% 距离维FFT
% 时延误差校正
tI = 5.6248e-10; % Instrument delay for range calibration (corresponds to a 8.44cm range offset)
t = (0:Nadc-1)*Ts;
rangeBiasCorrector = exp(-1j*2*pi*K*tI*t).';
rawData = rawData.*rangeBiasCorrector;
% 距离FFT
nFFTtime = 1024;
rangeData = fft(rawData,nFFTtime).';
% 作图
rangeAxis = rangeRes*(0:nFFTtime-1)*(Nadc/nFFTtime);
[X,Y] = meshgrid(rangeAxis,(1:Nchirp));
figure;
mesh(X,Y,abs(rangeData));
xlabel('距离(m)');
ylabel('脉冲chrip数');
zlabel('幅度');
title('距离维-1DFFT结果');
由上图可见,待检测人员位于雷达正前方58cm左右,提取相应的距离门信息以获取相位信息。
2.相位计算
相位计算:检测范围限定-->最大值查找-->相位提取
%% 提取相位
angleData = angle(rangeData);
detaR = rangeRes*(Nadc/nFFTtime);
% Range-bin tracking 找出能量最大的点,即人体的位置
rangeAbs = abs(rangeData);
rangeSum = sum(rangeAbs);
% 限定检测距离
minRange = 0.3;
maxRange = 1.5;
minIndex = floor(minRange/detaR);
maxIndex = ceil(maxRange/detaR);
rangeSum(1:minIndex) = 0;
rangeSum(maxIndex:end) = 0;
[~,index] = max(rangeSum);
%% 取出能量最大点的相位 extract phase from selected range bin
angleTarget = angleData(:,index);%1024个chrip的某列range bin的相位
% 提取相位信号(原始)
figure;
plot(1:Nchirp,angleTarget);
xlabel('时间/点数(N):对应每个chrip');
ylabel('相位');
title('未展开相位信号');
phi=angleTarget;
3.相位解缠绕
%% 进行相位解缠
% unwrap函数:
phi=unwrap(phi);
figure;
plot(phi);
xlabel('点数(N):对应每个chrip');
ylabel('相位(rad)');
title('解缠后的相位');
angle_fft_last = phi;
4.相位差计算
相位差计算目的是获得ΔR信息。
%% phase difference 相位差分
%通过减去连续的相位值,对展开的相位执行相位差运算,
angle_fft_last2=zeros(1,Nchirp);
for i = 2:Nchirp
angle_fft_last2(i) = angle_fft_last(i) - angle_fft_last(i-1);
end
figure;
plot(angle_fft_last2);
xlabel('点数(N):对应每个chrip');
ylabel('相位(rad)');
title('相位差分后信号');
5.脉冲噪声去除
噪声去除采用的方法是滑动平均滤波。
%% 脉冲噪声去除:滑动平均滤波(选取0.25s(50ms*5)的滑动窗口,窗口长度为5)
% 去除由于测试环境引起的脉冲噪声
phi=smoothdata(angle_fft_last2,'movmean',5);
figure;
plot(phi);
title('滑动平均滤波相位信号');
6.信号分离与速率计算
分离呼吸和心跳信号并计算呼吸和心跳速率。
6.1 对相位差信号做FFT
%对相位差分信号作FFT
N1=length(phi);
FS=20; % 帧周期50ms --> Fs = 1/0.05 = 20Hz
FFT = abs(fft(phi)); %--FFT取模,幅度
f=(0:N1-1)*(FS/N1); %其中每点的频率
%傅里叶变换结果对称
figure;
plot(f(1:N1/8),FFT(1:N1/8)) %取前一部分放大观察
xlabel('频率(f/Hz)');
ylabel('幅度');
title('相位信号FFT ');
可见,呼吸和心跳信号频率在不同的频段,可通过带通滤波器分离两种信号。
滤波器设计参考:
- TI毫米波雷达人体生命体征(呼吸、心跳)信号提取算法(IWR6843ISK+DCA1000EVM)
https://blog.csdn.net/m0_61934621/article/details/132047756?spm=1001.2014.3001.5506
张兰春,顾海潮.基于毫米波雷达的生命体征检测[J].农业装备与车辆工程,2022,60(03):79-82.
6.2 呼吸信号分离
%% IIR带通滤波 Bandpass Filter 0.1-0.5hz,输出呼吸信号
fs =20; %呼吸心跳信号的采样率
%设计IIR,4阶巴特沃斯带通滤波器
load('coe3.mat', 'breath_pass');
breath_data = filter(breath_pass,phi);
figure;
plot(breath_data);
xlabel('时间(s)');
ylabel('幅度');
title('呼吸时域波形');
%% FFT-Peak
breath = abs(fft(breath_data));
figure;
plot(f(1:130),breath(1:130)); %取前一部分放大观察
xlabel('频率(f/Hz)');
ylabel('幅度');
title('呼吸信号FFT ');
[~,breath_index] = max(breath); %谱峰最大值搜索
breath_count =(fs*(breath_index-1)/Nchirp)*60; %呼吸频率解算
可见,呼吸信号频率为0.225Hz,即呼吸速率为0.225*60=13.5次/分钟。
6.3 心跳信号分离
%% IIR带通滤波 Bandpass Filter 0.8-2hz,输出心跳的数据
% 设计IIR,8阶巴特沃斯带通滤波器
load('coe4.mat', 'heart_pass');
heart_data = filter(heart_pass,phi);
figure;
plot(heart_data);
xlabel('时间(s)');
ylabel('幅度');
title('心跳时域波形');
N1=length(heart_data);
f=(0:N1-1)*(fs/N1); %其中每点的频率
heart=abs(fft(heart_data));
figure;
plot(f(1:200),heart(1:200));
xlabel('频率(f/Hz)');
ylabel('幅度');
title('心跳信号FFT');
[~,heart_index] = max(heart);
% 判断是否有人
%
heart_count =(fs*(heart_index-1)/Nchirp)*60;%心跳频率解算
可见,心跳频率为1.217Hz,即心跳速率为1.217*60 ≈ 73次/分钟。
讨论
1.传统的提取算法限于近距离出的检测(~1m),远距离检测呼吸和心跳始终是一个很大的挑战;
2.呼吸或身体抖动带来的谐波干扰会导致心跳信号检测不准。
3.提升系统鲁棒性,例如结合模态分解分离呼吸和心跳波形,使用MUSIC算法来估计频谱等。
4.动态位置人员的跟踪与生命体征监测;多用户的生命体征监测。