在复现widar3.0的过程中,一个是CSI process的细节,二是Location和Oriention的具体实现。
1、非线性幅度和相位误差消除
由硬件内部不完善的模拟域滤波器实现引起的,使得提取的CSI幅度和相位被非线性函数等效地处理。在OFDM调制过程中,各个子载波应具有相同的增益。当使用同轴电缆连接收发器端口时,CSI的幅频特性应该是一条水平直线。但实际测量表明,即使没有多径无线信道,仍然存在类似的“频率选择性衰落”特性,即各个频段的增益不同,呈现M形幅频特性曲线。同样,当使用同轴电缆连接收发端口时,NIC获得的CSI相频特性也不是一条带有斜率的理想直线,而是一条具有一定非线性的S形曲线。经过广泛的研究和实验,观察到两个事实:
- 对于特定类型的NIC,CSI的非线性幅度/相位误差是固定的。在执行感知任务之前,测量一组代表性的CSI幅度和相位,记录非线性特征,并在后续步骤中消除非线性。
- 副载波的中间部分没有非线性误差,并且两侧的非线性特性也是固定的
解决CSI非线性问题可以通过以下步骤:
function[csi_calib_template] = set_template (csi_calib ,linear_interval ,calib_template_name)
[packet_num,subcarrier_num,anteena_num,extra_num]=size(csi_calib);
csi_amp = abs ( csi_calib ) ; % [T S A L]
csi_phase = unwrap ( angle ( csi_calib ) , [] , 2) ; % [T S A L]
csi_amp_template = mean ( csi_amp ./ mean ( csi_amp , 2) , 1) ; % [1 S A L]
nonlinear_phase_error = zeros ( size ( csi_calib ) ) ; % [T S A L]
for p = 1: packet_num
for a = 1: antenna_num
for e = 1: extra_num
linear_model = fit ( linear_interval , squeeze ( csi_phase (p ,
linear_interval , a , e ) ) ', 'poly1 ') ;
nonlinear_phase_error (p , : , a , e ) = csi_phase (p , : , a , e ) -
linear_model (1: subcarrier_num ) ';
end
end
end
csi_phase_template = mean ( nonlinear_phase_error , 1) ; % [1 S A L]
csi_phase_template (1 , linear_interval , : , :) = 0;
csi_calib_template = csi_amp_template .* exp (1 i * csi_phase_template ) ; % [1 S A L]
csi = csi_calib_template ;
save ( calib_template_name , 'csi ') ; % [1 S A L]
end
- 读入使用同一接口测量的一组CSI数据
- 获取幅度和相位,将幅值进行归一化记录为幅值模板
- 展开相位(unwrap),然后对其子载波的中间部分进行线性拟合。减去线性拟合结果即可得到非线性相位误差模板。
csi_calib 是给定距离和角度下的参考csi——【T S A L】
Linear_interval 是 csi 阶段的线性范围,不同类型的网卡有所不同
calib_template_name为生成模板的保存路径
csi_calib_template是为csi校准生成的模板
参考:Hands-on Wireless Sensing with Wi-Fi: A Tutorial