首页 > 技术知识 > 正文

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);
<

猜你喜欢