Loading...
首页专栏正文

基于Wi-Fi CSI的摔倒检测(五):CSI数据处理-相位校准

 
1人已赏
技术凯 发布于 2021-02-27 18:19:11 浏览 3700 点赞 96 收藏 11

1 为什么需要校准相位

  基于商用WiFi设备获取到的相位信息可靠性不是很高,准确率也不能达到要求。但是相位信息又很能反映环境的变化。所以我们必须将这些由于硬件上的缺陷以及在传输过程中因环境噪声的影响引起的误差进行校准和补偿。这些误差主要是由三个方面组成:采样频率的偏移,检测时延,中心频率偏移。发射端和接收端之间的载波频率无法做到完全同步。

2 相位校准主要步骤:

  我们假设这些相位偏差都是线性的,所以我们引入一种线性变化对原始随机相位进行处理。

3具体实现以及效果

原始混杂相位: 解卷绕之后的相位: 线性变换之后的相位: 校准后各个子载波相位随着时间的变化: 第一子载波: 第三子载波:

第七子载波:

第九子载波:

第十三子载波:

第十七子载波:

第二十子载波:

第二十九子载波:

第二十三子载波:

第二十五子载波:

  根据以上对比结果我们可以发现,相同时间下不同子载波的相位对于环境信息的感知是不同的,所以我们后续还要进行相位的PCA 或者制定子载波相位选择的可靠策略。 本节整体代码如下:

clear all
clc;
warning off;
csi_trace = read_bf_file('sample_data/logfallr111.dat');
data_size=length(csi_trace);
% Hcsi=[];
k=[-28:2:-2,-1,1:2:27,28];%30
sub_phase=zeros(990,1);
all=zeros(1,990);
selsub=zeros(9,990);
m=15;
for i=100:790
    csi_entry = csi_trace{i};%依次读各组数据包,为了平均
    %  rssi(i)=get_total_rss(csi_entry);
    csi = get_scaled_csi(csi_entry);
%     csi=csi(1,:,:);
    csi1=squeeze(csi).';

    csiabs=db(abs(squeeze(csi).'));%%判断该矩阵维数size(),中最小值是否为1,不是得话要选择一组作为有效值
    if(min(size(csiabs))>1)
        %         maxValue=max(max(csiabs));
        %         [line,colunm]=find(csiabs==maxValue);
        %         csiabs=csiabs(:,colunm(1));
        %         csi1=csi1(:,colunm(1));
        csiabs=csiabs(:,1);
        csi1=csi1(:,1);
    else
        csiabs=csiabs';
        csi1=csi1';
    end

    phrad_measure=angle(csi1);%rad
%     figure(1)
%     plot( phrad_measure)
%      xlabel('subcarriers');
%         ylabel('Phase (rad)');
%         title('未解卷绕原始相位');
%     hold on 
    phrad_measure_m(i)=phrad_measure(m);%24子载波原始相位
     % plot(phrad_measure10,'g')
%    hold on
     % phdeg=rad2deg(phrad);%phdeg=180*phrad/pi;
    phrad_true=unwrap(phrad_measure);
%     figure(2)
%   plot(phrad_true)
%    xlabel('subcarriers');
%         ylabel('Phase (rad)');
%         title('解卷绕原始相位');
%     hold on 
%   hold on
    for t=1:30
        afterTransph(t)=phrad_true(t)-(phrad_true(30)-phrad_true(1))/56*k(t)-1/30*sum(phrad_true);%linear transformation
    end

    subphd(i)=afterTransph(m);%m子载波线性变换后相位
    selsub(1,i)=afterTransph(1);
    selsub(2,i)=afterTransph(5);
    selsub(3,i)=afterTransph(7);
    selsub(4,i)=afterTransph(9);
    selsub(5,i)=afterTransph(13);
     selsub(6,i)=afterTransph(17);
      selsub(7,i)=afterTransph(20);
       selsub(8,i)=afterTransph(23);
        selsub(9,i)=afterTransph(25);

        figure(3)
       plot(afterTransph);
       hold on
        xlabel('subcarrier');
        ylabel('Phase (rad)');
        title('linear transformation');
end
      figure(4)
      plot(subphd);
      hold on
       xlabel('time');
        ylabel('Phase (rad)');
        title('linear transformation');

       lz=wden(selsub(3,:),'heursure','s','one',3,'sym3');
       selsub(3,:)=lz;
       figure(5);
       di=wden(diff(subphd),'heursure','s','one',4,'db5');
       plot(di);
       xlabel('time');
        ylabel('Phase (rad)');
        title('phase_diff_afterfilter');
        for j=1:9
            figure(j+9)
         plot(selsub(j,:));
      hold on
       xlabel('sub(j)');
        ylabel('Phase (rad)');
        title('chosed_subcarrier(j)');
        all=all+selsub(j,:);
        end

        figure(31)
         plot(all);
       xlabel('time');
        ylabel('Phase (rad)');
        title('sum-chosedsub');

*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。

精彩评论

  • Alson🍊 评论于 2021-02-27 18:20:02

    大神你好,我在看你的文章做复现,但发现文章标题和内容好像存在顺序和重复问题,我重新排了个序,不知道这样理解对不对:
    1.CSI数据的导入
    2.CSI数据预处理-Hampel异常值滤波器
    3.CSI数据预处理-离散小波变换
    4.CSI 数据降噪-巴特沃斯滤波器
    5.CSI数据处理-相位校准
    6.CSI数据处理-PCA降维

    0
内容存在敏感词
打赏
打赏作者
技术凯
您的支持将鼓励我继续创作!
金额:
¥1 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区