CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80272146,0,101,0,0,80.363225,384,[101 -48 5 0 0 0 0 0 0 0 5 2 23 12 25 13 27 16 28 19 27 20 24 22 22 23 20 24 19 25 18 25 20 27 20 27 18 26 16 26 16 25 16 25 14 23 12 21 12 21 12 20 14 19 15 18 14 17 16 17 18 16 18 14 10 6 20 11 20 10 22 10 22 10 23 10 25 11 25 10 24 8 25 7 27 5 27 5 26 6 26 7 27 8 27 7 28 6 29 5 27 4 25 3 25 3 26 4 26 4 26 3 26 3 25 3 24 1 5 0 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80275970,0,101,0,0,80.368088,384,[101 -48 5 0 0 0 0 0 0 0 -4 2 -16 8 -18 8 -19 9 -21 8 -22 6 -22 4 -23 3 -22 3 -21 2 -22 1 -23 0 -23 0 -21 0 -21 -1 -20 -1 -20 -1 -18 -1 -18 -1 -17 0 -16 -1 -16 -1 -16 0 -16 1 -16 2 -16 3 -15 4 -8 2 -15 6 -15 8 -15 8 -14 8 -14 8 -15 9 -15 9 -15 9 -15 11 -14 12 -14 13 -15 11 -15 11 -14 12 -14 13 -14 13 -14 13 -13 13 -12 12 -12 12 -13 12 -13 11 -12 12 -11 12 -11 12 -11 12 -3 3 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80279740,0,101,0,0,80.373439,384,[101 -48 5 0 0 0 0 0 0 0 3 -3 15 -10 16 -10 18 -9 20 -8 21 -6 20 -5 20 -4 20 -3 20 -3 20 -2 21 -2 21 -2 20 -1 19 -1 19 0 18 -1 18 0 16 0 15 0 15 0 15 -1 15 -1 14 -3 14 -4 14 -5 14 -6 7 -3 14 -6 13 -8 13 -9 13 -9 14 -9 15 -10 15 -11 14 -11 13 -11 12 -12 12 -13 13 -13 13 -13 13 -13 13 -13 14 -14 14 -14 12 -14 11 -14 11 -14 11 -13 11 -12 10 -13 10 -14 11 -13 9 -13 2 -4 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80287386,0,101,0,0,80.384055,384,[101 -48 5 0 0 0 0 0 0 0 -5 0 -20 2 -21 2 -22 1 -23 0 -22 -2 -22 -3 -22 -4 -21 -5 -20 -6 -20 -6 -21 -7 -22 -8 -21 -7 -19 -8 -18 -8 -19 -7 -18 -6 -16 -6 -16 -6 -15 -6 -15 -6 -15 -5 -16 -5 -16 -3 -17 -2 -16 -1 -8 0 -16 1 -16 2 -17 3 -16 2 -16 2 -17 3 -18 4 -17 4 -17 5 -17 7 -18 7 -18 6 -18 7 -18 7 -17 7 -18 7 -18 8 -18 9 -16 8 -15 8 -15 7 -16 7 -15 8 -15 9 -15 8 -15 7 -4 1 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80291741,0,101,0,0,80.389379,384,[101 -48 5 0 0 0 0 0 0 0 3 2 14 10 15 11 15 13 15 15 13 16 12 17 11 17 10 17 9 17 9 18 9 19 10 20 8 19 7 18 7 17 7 17 6 16 5 15 6 14 6 14 6 14 6 13 6 12 7 11 9 11 10 10 5 5 11 11 12 10 13 9 13 9 13 9 14 10 14 9 15 9 15 8 16 7 16 7 16 8 17 8 17 7 16 7 16 7 17 7 16 6 14 6 14 6 15 7 15 6 16 5 16 4 15 5 14 5 3 1 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-69,11,0,0,0,0,0,0,0,0,0,-93,0,1,1,80297164,0,101,0,0,80.394009,128,[101 -48 5 0 0 0 0 0 0 0 -6 0 -23 0 -24 -1 -25 -1 -26 -2 -26 -4 -26 -6 -25 -6 -25 -8 -24 -9 -24 -10 -23 -10 -23 -10 -22 -9 -21 -9 -20 -9 -20 -8 -20 -9 -19 -8 -18 -7 -18 -6 -18 -5 -18 -5 -17 -4 -17 -3 -17 -1 -17 0 -8 1 -17 2 -18 3 -18 4 -18 4 -17 5 -18 7 -18 7 -18 8 -18 8 -19 8 -19 8 -19 8 -19 9 -20 9 -20 8 -19 9 -19 9 -19 9 -18 9 -18 9 -17 9 -17 9 -17 10 -16 10 -16 10 -15 10 -4 2 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80359978,0,101,0,0,80.416456,384,[101 -48 5 0 0 0 0 0 0 0 3 4 12 18 11 19 12 22 11 24 9 25 8 26 7 26 5 25 3 24 3 24 3 26 3 27 2 26 1 24 1 23 2 22 2 21 1 19 2 19 2 19 2 19 2 18 3 16 4 15 6 16 7 17 4 8 10 16 11 15 12 15 12 14 12 14 13 16 14 16 15 14 16 13 17 11 17 12 16 13 16 13 16 13 17 12 17 12 18 12 17 11 17 9 16 9 16 10 16 10 16 9 16 9 16 9 17 9 4 2 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80361810,0,101,0,0,80.420739,384,[101 -48 5 0 0 0 0 0 0 0 -6 -2 -21 -7 -23 -8 -24 -11 -25 -14 -23 -15 -22 -16 -22 -16 -20 -16 -19 -17 -19 -18 -20 -19 -20 -18 -19 -18 -17 -19 -16 -19 -16 -18 -13 -17 -12 -15 -13 -14 -14 -14 -14 -14 -14 -12 -14 -11 -14 -11 -15 -11 -16 -10 -9 -5 -19 -8 -20 -7 -20 -5 -18 -5 -19 -6 -21 -5 -21 -4 -21 -3 -21 -2 -21 -1 -22 -1 -22 -3 -22 -2 -22 -2 -22 -2 -22 -1 -24 0 -23 1 -21 1 -21 1 -22 0 -21 0 -21 1 -20 2 -20 2 -19 2 -5 0 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80363014,0,101,0,0,80.426442,384,[101 -48 5 0 0 0 0 0 0 0 2 -4 12 -13 13 -14 15 -15 16 -15 17 -13 17 -12 19 -11 19 -9 19 -9 19 -9 20 -9 20 -9 19 -8 19 -7 19 -6 18 -7 17 -7 16 -7 14 -6 14 -6 14 -6 13 -7 12 -7 13 -8 12 -10 11 -10 5 -5 10 -11 10 -12 10 -13 10 -13 10 -13 10 -14 9 -14 8 -15 8 -16 7 -17 7 -17 8 -17 8 -17 8 -17 7 -17 7 -18 7 -18 6 -17 5 -17 6 -16 6 -16 6 -16 5 -16 5 -16 4 -16 4 -15 1 -4 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80363453,0,101,0,0,80.431686,384,[101 -48 5 0 0 0 0 0 0 0 -5 -1 -18 -4 -19 -5 -20 -7 -21 -8 -20 -9 -19 -10 -19 -12 -18 -13 -17 -13 -16 -14 -17 -14 -17 -14 -16 -14 -15 -14 -14 -14 -15 -14 -13 -12 -12 -12 -12 -12 -12 -12 -11 -11 -12 -9 -12 -8 -13 -8 -15 -8 -15 -7 -8 -3 -15 -6 -16 -5 -17 -4 -16 -4 -16 -4 -17 -4 -18 -3 -18 -3 -18 -2 -18 0 -18 1 -18 -1 -18 -2 -18 -1 -18 -1 -19 0 -20 0 -19 1 -17 1 -17 1 -17 1 -17 1 -18 1 -17 2 -17 1 -16 1 -4 0 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80363982,0,101,0,0,80.437394,384,[101 -48 5 0 0 0 0 0 0 0 5 -2 22 -7 24 -6 26 -4 27 -3 26 -1 25 1 26 4 25 5 25 5 25 4 26 5 26 6 24 6 22 7 22 6 22 5 20 5 18 5 19 4 19 4 18 3 18 3 17 2 18 1 19 -1 19 -1 9 -2 18 -5 18 -5 18 -7 18 -7 18 -8 19 -9 19 -10 19 -11 18 -12 17 -13 18 -13 19 -12 18 -12 18 -12 18 -12 18 -13 18 -14 17 -14 16 -13 15 -12 16 -12 16 -12 16 -13 15 -14 14 -14 12 -14 2 -4 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80364286,0,101,0,0,80.442491,384,[101 -48 5 0 0 0 0 0 0 0 5 -1 22 -1 24 0 26 2 26 5 25 6 25 7 24 8 23 9 23 10 23 11 24 12 25 12 24 12 21 12 20 12 19 11 18 10 18 9 17 9 16 9 16 9 16 8 16 7 16 6 18 4 18 2 8 0 17 0 18 -1 19 -2 18 -2 18 -2 20 -2 21 -2 21 -4 20 -5 19 -7 20 -7 20 -6 20 -5 21 -6 21 -7 21 -7 20 -8 20 -8 19 -7 18 -8 18 -7 18 -6 18 -7 18 -8 18 -8 17 -9 4 -3 0 0 0 0 0 0 0 0 ]
CSI_DATA,AP,3C:71:BF:6D:2A:78,-73,11,1,0,1,1,1,0,0,0,0,-93,0,1,1,80364698,0,101,0,0,80.447386,384,[101 -48 5 0 0 0 0 0 0 0 -1 -5 -4 -19 -4 -20 -3 -22 -1 -22 0 -22 0 -23 1 -22 3 -21 4 -20 5 -21 4 -22 4 -21 5 -19 5 -19 6 -19 6 -19 6 -19 6 -18 5 -16 4 -15 3 -15 1 -15 1 -15 1 -16 0 -16 -2 -16 -2 -8 -3 -16 -4 -16 -4 -16 -4 -16 -5 -16 -6 -17 -6 -18 -6 -18 -8 -16 -9 -15 -9 -16 -8 -16 -7 -16 -8 -16 -9 -16 -9 -16 -9 -17 -9 -16 -10 -15 -9 -14 -8 -15 -8 -16 -9 -15 -9 -14 -8 -14 -8 -13 -2 -3 0 0 0 0 0 0 0 0 ]
好的,让我们实际运行一下代码。我将指导您如何运行上述Python代码,并解释在每个步骤中会发生什么。
1. 准备工作
首先,确保您的计算机上安装了所需的Python包:
pip install numpy matplotlib scipy
2. 创建数据文件
将您的CSI数据保存到一个文本文件中,例如csi_data.txt
。根据您之前提供的数据,文件内容应类似于:
CSI_DATA,1,fa:0d:ac:ec:bc:7d,ff:ff:ff:ff:ff:ff,-74,11,0,0,0,0,0,0,0,-95,0,1,0,2024-10-10 10:22:56.658014,0,454,0,128,0, [0 0 -8 -11 -9 -12 -9 -12 ...]
CSI_DATA,2,fa:0d:ac:ec:bc:7d,ff:ff:ff:ff:ff:ff,-83,11,0,0,0,0,0,0,0,-95,0,1,0,2024-10-10 10:22:56.760452,0,454,0,128,0, [0 0 16 9 14 9 12 10 13 9 ...]
...
请将您提供的所有数据行复制到该文件中。
3. 编写并运行Python脚本
创建一个Python脚本文件,例如csi_analysis.py
,并将以下代码粘贴进去:
import re
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter
# 用于存储提取的数据
timestamps = []
csi_values = []
# 匹配CSI_DATA行的正则表达式
csi_pattern = re.compile(r'^CSI_DATA.*\[(.*)\]$')
# 从文本文件读取数据
with open('csi_data.txt', 'r') as file:
for line in file:
line = line.strip()
match = csi_pattern.match(line)
if match:
# 提取CSI值
csi_str = match.group(1)
csi_ints = [int(x) for x in csi_str.split()]
csi_complex = np.array(csi_ints[::2]) + 1j * np.array(csi_ints[1::2])
csi_values.append(csi_complex)
# 提取时间戳
parts = line.split(',')
timestamp = parts[20]
timestamps.append(timestamp)
# 将列表转换为NumPy数组
csi_values = np.array(csi_values)
# 计算幅度和相位
amplitudes = np.abs(csi_values)
phases = np.angle(csi_values)
# 选择子载波索引进行分析
subcarrier_index = 10 # 可根据需要更改
# 提取选定子载波的幅度随时间变化
subcarrier_amplitude = amplitudes[:, subcarrier_index]
# 对幅度数据应用Savitzky-Golay滤波器进行平滑
smoothed_amplitude = savgol_filter(subcarrier_amplitude, window_length=11, polyorder=3)
# 绘制平滑后的幅度
plt.figure(figsize=(12, 6))
plt.plot(smoothed_amplitude)
plt.title(f'平滑后的子载波{subcarrier_index}幅度')
plt.xlabel('数据包索引')
plt.ylabel('幅度')
plt.grid(True)
plt.show()
# 提取选定子载波的相位随时间变化
subcarrier_phase = phases[:, subcarrier_index]
# 展开相位以校正不连续性
unwrapped_phase = np.unwrap(subcarrier_phase)
# 绘制展开后的相位
plt.figure(figsize=(12, 6))
plt.plot(unwrapped_phase)
plt.title(f'子载波{subcarrier_index}的展开相位随时间变化')
plt.xlabel('数据包索引')
plt.ylabel('相位(弧度)')
plt.grid(True)
plt.show()
4. 运行脚本
在终端或命令提示符中,导航到脚本所在的目录,然后运行:
python csi_analysis.py
5. 查看结果
脚本运行后,将弹出两个图形窗口:
- 平滑后的子载波幅度图:显示选定子载波的幅度随时间的变化,经过平滑处理。
- 展开后的相位图:显示选定子载波的相位随时间的变化,经过相位展开处理。
6. 解释结果
-
平滑后的幅度图:
- 波动趋势:您可能会看到幅度随着时间的推移而变化,这可能反映了无线信道的变化,例如由于环境中的移动物体或信号阻塞。
- 平滑效果:通过Savitzky-Golay滤波器,原始数据中的高频噪声被消除,更容易观察整体趋势。
-
展开后的相位图:
- 相位连续性:原始相位数据可能存在跳变,通过
np.unwrap
函数,相位的不连续性被校正,呈现出连续的相位变化。 - 趋势分析:相位的变化可能反映了信道中的多径效应或发射器与接收器之间的相对运动。
- 相位连续性:原始相位数据可能存在跳变,通过
7. 注意事项
- 数据完整性:确保您的
csi_data.txt
文件包含所有CSI_DATA行,且格式正确。 - 窗口长度和多项式阶数:在应用Savitzky-Golay滤波器时,
window_length
应为奇数,且小于或等于数据点数量。polyorder
应小于window_length
。 - 子载波选择:您可以更改
subcarrier_index
的值来分析不同的子载波。例如,尝试索引5或15,看看结果有何不同。
8. 可能遇到的问题及解决方法
-
错误信息:IndexError:
- 原因:这可能是由于
subcarrier_index
超出了csi_values
数组的范围。 - 解决方法:检查
csi_values
的形状,确保subcarrier_index
在有效范围内。您可以打印csi_values.shape
来查看数组的尺寸。
- 原因:这可能是由于
-
图形未显示:
- 原因:可能是脚本执行后立即结束,导致图形窗口闪退。
- 解决方法:在绘图代码末尾添加
plt.show()
,确保图形窗口保持打开状态。
-
数据读取错误:
- 原因:
csi_data.txt
文件格式不正确,或路径不正确。 - 解决方法:检查文件路径,确保文件内容格式与预期一致。
- 原因:
9. 进一步分析
- 多子载波分析:您可以同时绘制多个子载波的幅度和相位,比较它们之间的差异。
- 特征提取:从幅度和相位数据中提取统计特征,如均值、标准差,用于后续的机器学习或模式识别。
- 实时分析:如果有实时的数据流入,您可以修改代码以适应实时数据处理。
10. 总结
通过实际运行上述代码,您可以:
- 解析CSI数据:将原始CSI数据转换为可分析的数值形式。
- 可视化信道特性:通过绘制幅度和相位图,直观地了解信道的变化。
- 为深入研究奠定基础:这些初步分析可以为进一步的研究和应用(如手势识别、室内定位)提供数据支持。
如果您在运行过程中遇到任何问题,或者对结果有疑问,请随时告诉我,我会尽力帮助您解决。