CSI数据的处理

利用CSI信息,为了做室内目标定位,我们将上一篇文章中获得的CSI数据进行可视化操作,本数据为一发一收 ,发射天线数为1,接收天线数为3,如果有需要数据的可以私聊

参考博客

WIFI信号状态信息 CSI 数据处理篇之读取数据与数据解析(二)_csi数据_Silver_777的博客-CSDN博客 

为了验证数据的好坏,以下为将数据读取出来的结果,我plot了所有子载波共90根,一共是4006个时间戳

振幅图比较直观,可以看到振幅随着时间的变化,在信号不受干扰的时候,振幅是平稳的,当活动发生时,信号开始波动;

而相位图由于相位跳变,且数据数量过大而导致图像显得很混乱,需要进行相位解卷绕处理。


WIFI信号状态信息 

%% 读取原始数据
str = 'test2.dat';% 输入文件名字
csi_trace = read_bf_file(str);
csi_trace(all(cellfun(@isempty,csi_trace),2),:) = [];%去掉空部分,以防设备传输出现丢数据问题
row = size(csi_trace,1);
result_matrix = zeros(row,181); % 第1~90列存储振幅,第91~180列存储相位,第181列存储时间戳
 
Fs = 1000; % 采样频率
%% 计算,将该dat原始文件的振幅和相位都存储在result_matrix矩阵中
% 这一节得到是result_matrix,维度为result_matrix
 
for i = 1:row
    %读取第i条数据
    csi_entry = csi_trace{i};%结构体形式
 
    %读取并存储第i条数据的时间戳
    result_matrix(i,181) = csi_trace{i}.timestamp_low;
 
    %读取第i条数据的CSI值
    csi = get_scaled_csi(csi_entry);%复数矩阵,1*3*30
    csi1 = squeeze(csi);% 去掉全为1的数组,复数矩阵,3*30
 
    % 提取当前时刻的信号数据包
    current_packet = csi1;
 
    % 计算振幅信息
    amplitude = abs(current_packet);
 
    % 计算相位信息
    phase = angle(current_packet);
 
    % 将振幅和相位信息存储到result_matrix中
    result_matrix(i, 1:90) = reshape(amplitude, 1, []);
    result_matrix(i, 91:180) = reshape(phase, 1, []);
 
end
 
% 可视化
% 振幅图
figure(1);
plot(result_matrix(:, 1:90));
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化');
grid on;
 
% 相位图
figure(2);
plot(result_matrix(:, 91:180));
xlabel('时间');
ylabel('相位 (弧度)');
title('相位随时间的变化');
grid on;
 
% 相位接卷绕后的图
phase_wrapped = result_matrix(:, 91:180); % 原始相位数据
phase_unwrapped = unwrap(phase_wrapped);
figure(3);
subplot(2, 1, 1);
plot(phase_wrapped);
title('Wrapped Phase');
subplot(2, 1, 2);
plot(phase_unwrapped);
title('Unwrapped Phase');
### ESP32采集和处理CSI数据的方法 #### 工具与环境准备 为了在ESP32上成功采集并处理CSI数据,需准备好特定的工具和设置好开发环境。这包括但不限于ESP32开发板(如ESP32-WROOM-32或ESP32-WROVER)、安装好的ESP-IDF环境以及可用作信号收发端的WiFi路由器[^3]。 #### 安装ESP-CSI库 借助ESP-CSI这一专门设计给ESP32/ESP32-S2平台使用的库来简化CSI数据的获取过程。该库充分利用了上述芯片内置的支持能力,使得开发者能够轻松获得关于无线信道特性的重要参数——CSI信息,从而为进一步的研究工作打下了坚实的基础[^2]。 #### 编程实例:基于Python脚本调用ESP32 CSI Tool 下面给出了一段简单的Python代码片段,展示了怎样通过`esp_csi_tool.py`这个图形化界面工具来进行CSI数据收集的工作流程: ```python import esp_csi_tool as csi def main(): try: # 初始化设备连接 device = csi.Device(port='COM3', baudrate=115200) # 连接到指定SSID的Wi-Fi网络 wifi_ssid = 'your_wifi_ssid' wifi_password = 'your_wifi_password' device.connect_to_wifi(wifi_ssid, wifi_password) # 开始记录CSI数据流至本地文件 output_file_path = './csi_data.csv' with open(output_file_path, mode='w') as file: while True: sample = device.get_next_sample() if not sample: continue timestamp, channel_info = sample['timestamp'], sample['channel'] line = f"{timestamp},{','.join(map(str, channel_info))}\n" file.write(line) except KeyboardInterrupt: print('Data collection stopped by user.') if __name__ == '__main__': main() ``` 此段代码实现了如下功能: - 建立与ESP32模块之间的稳定通讯链路; - 尝试接入预设名称及密码保护下的Wi-Fi热点; - 循环读取来自ESP32所感知到的新鲜CSI样本,并将其序列化成CSV格式存储于外部介质之上; 需要注意的是,在实际部署过程中可能还会碰到诸如编译器路径配置不当或是串口号冲突等问题,这些问题通常可以通过调整VSCode内的`.vscode`目录下相应JSON文件的内容得以解决,同时也建议确认正在使用的命令行工具是否正确指向到了ESP-IDF自带的那个版本而非系统默认提供的其他解释器[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值