Wi-Fi CSI(Channel State Information) 是 ESP32 提供的一项技术,用于获取无线信道的状态信息。通过Wi-Fi CSI,ESP32能够在数据包发送和接收时测量信道的物理层状态,如信号强度、相位、噪声等。这些信息可以用来分析环境中的信道特性,从而进行精确的定位、手势识别或人体感知。
关键功能:
- 精确感知:通过信号反射等特性,可以感知移动物体和环境变化。
- 低功耗:利用ESP32的Wi-Fi模块实现,不需额外硬件支持。
- 应用场景:室内定位、活动监测、安全监控等。
要通过 Wi-Fi CSI 判断环境中是否有人的简单算法可以基于以下步骤:
步骤:
-
采集CSI数据:ESP32定期发送和接收Wi-Fi信号,通过API获取实时的Wi-Fi CSI数据。
-
处理数据:
- 计算CSI数据的幅度或相位变化。
- 设置阈值:在无人的情况下,CSI数据变化幅度较小,而当有人在场时,CSI数据会发生明显变化。
-
检测变化:
- 如果CSI数据的变化超出预设的阈值,则认为有人在场。
- 否则,判断无人。
简单示例代码框架:
void processCSIData(float* csi_data) {
float csi_variation = calculateCSIChange(csi_data);
if (csi_variation > threshold) {
Serial.println("Person detected");
} else {
Serial.println("No person detected");
}
}
以下是基于 Wi-Fi CSI 数据进行基本变化计算的示例代码,帮助判断环境中是否有人的活动:
1. CSI 数据幅度计算
Wi-Fi CSI 数据通常以复数形式表示,可以使用公式计算其幅度:
float calculateAmplitude(float real, float imag) {
return sqrt(real * real + imag * imag); // 计算幅度
}
2. CSI 数据变化计算
通过计算连续 CSI 数据之间的变化幅度,判断环境中是否有人的活动:
float calculateCSIChange(float* csi_data, int num_subcarriers) {
float variation = 0;
for (int i = 0; i < num_subcarriers - 1; i++) {
float real_diff = csi_data[2 * i] - csi_data[2 * (i + 1)];
float imag_diff = csi_data[2 * i + 1] - csi_data[2 * (i + 1) + 1];
variation += sqrt(real_diff * real_diff + imag_diff * imag_diff); // 计算相邻子载波的变化
}
return variation;
}
3. 判断是否有人活动
使用一个简单的阈值判断是否有人活动
void processCSIData(float* csi_data, int num_subcarriers) {
float csi_variation = calculateCSIChange(csi_data, num_subcarriers);
float threshold = 50.0; // 阈值根据实验调整
if (csi_variation > threshold) {
Serial.println("Person detected");
} else {
Serial.println("No person detected");
}
}
解释:
calculateAmplitude
用于计算 CSI 数据的幅度。calculateCSIChange
计算CSI数据的变化量。- 通过设置合适的阈值,可以判断是否有人的活动。
你可以根据实验环境调整阈值和处理逻辑,以提高算法的准确性。
esp-csi/examples/esp-radar/console_test/README_cn.md at master · espressif/esp-csi · GitHub
GitHub - zikunliu/ESP32_Sniffer_beacon_csi