Wifi csi跌倒检测—数据处理
为了降低实时处理时间,采用粗暴地边读边插值的方法,如果当前数据包间隔上一个数据包超过100,就插值。
·
一、插值
为了降低实时处理时间,采用粗暴地边读边插值的方法,如果当前数据包间隔上一个数据包超过100,就插值。
for i = 1:row
%读取第i条数据
csi_entry_N = csi_trace{i};%结构体形式
if isstruct(csi_entry_N) == 0 %判断是否为空,0为空
continue;
end
%读取并存储第i条数据的时间戳
current_timestamp = csi_trace{i}.timestamp_low;
result_matrix(i,241) = csi_trace{i}.timestamp_low;
% 检测时间戳间隔
if i > 1 % 添加这个条件来避免第一次循环时的错误
timestamp_interval = current_timestamp - prev_timestamp;
% 计算需要补足的数据包数量
num_missing_packets = round(timestamp_interval / 100) - 1;
% 使用矩阵运算进行线性插值
if num_missing_packets > 0
prev_amplitude = result_matrix(i-1, 1:120);
prev_phase = result_matrix(i-1, 121:240);
current_amplitude = result_matrix(i, 1:120);
current_phase = result_matrix(i, 121:240);
% 计算振幅和相位的差值
amplitude_diff = current_amplitude - prev_amplitude;
phase_diff = current_phase - prev_phase;
% 计算插值的倍数
interpolation_factors = (1:num_missing_packets) / (num_missing_packets + 1);
% 广播插值的倍数,并计算插值后的振幅和相位
interpolated_amplitude = prev_amplitude + amplitude_diff .* interpolation_factors';
interpolated_phase = prev_phase + phase_diff .* interpolation_factors';
% 插入补足的数据包
new_row_index_range = new_row_index + (1:num_missing_packets);
result_matrix(new_row_index_range, 1:120) = interpolated_amplitude;
result_matrix(new_row_index_range, 121:240) = interpolated_phase;
result_matrix(new_row_index_range, 241) = prev_timestamp + (1:num_missing_packets) * 100; % 更新时间戳
% 更新新数据包的索引
new_row_index = new_row_index + num_missing_packets;
end
end
% 更新前一个时间戳
prev_timestamp = current_timestamp;
%读取第i条数据的CSI值
csi = get_scaled_csi(csi_entry_N);%复数矩阵,2*2*30
csi1 = squeeze(csi);% 去掉全为1的数组,复数矩阵
[h,l,y]=size(csi);H=[H h];L =[L l];
if (h==2 && l==2)
% 提取当前时刻的信号数据包
current_packet = csi1;
% 计算振幅信息
amplitude = abs(current_packet);
%disp(amplitude);
% 计算相位信息
phase = angle(current_packet);
%disp("------------------------")
% 将振幅和相位信息存储到result_matrix中
result_matrix(i, 1:120) = reshape(amplitude, 1, []); %把amplitude这个数组改编为1*n的形式
%disp(result_matrix);
result_matrix(i, 121:240) = reshape(phase, 1, []);
% 更新新数据包的索引
new_row_index = new_row_index + 1;
else
continue;
end
end
二、hanple极值点去除
% 这一节得到是降噪后的result_matrix
% 需要设置的参数:window_size、num_dev
% 获取振幅数据
amplitude_data = result_matrix(:, 1:120);
% 可视化
figure;
% 画出原始数据
subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
plot(amplitude_data);
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(原始)');
hold on
% 设定hampel滤波器参数
window_size = 5; % 窗口大小,可根据需要调整
num_dev = 1; % 定义异常值的标准偏差范围
% 对每一个子载波进行处理
for k = 1:90
% 使用hampel函数进行滤波
filtered_data = hampel(amplitude_data(:, k), window_size, num_dev);
% 存回到result_matrix
result_matrix(:, k) = filtered_data;
end
% 画出经Hampel处理后的数据
subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
plot(result_matrix(:, 1:120));
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(Hampel)');
三、低通滤波器处理
%% 降噪二:低通滤波器处理
% 这一节得到是降噪后的result_matrix
% 需要设置的参数:Fc、order、Fs
% 提取振幅和相位数据
amplitude_data = result_matrix(:, 1:120);
% 可视化
figure;
% 画出原始数据
subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
plot(amplitude_data);
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(原始)');
hold on
% 设计低通滤波器
Fc = 40; % 截止频率,根据实际情况进行调整,但确保小于15Hz
order = 4; % 滤波器阶数,可以根据需要进行调整
Fs = 100; % 采样频率,已经给出是30Hz
lowpass_filter = designfilt('lowpassiir', 'FilterOrder', order, 'HalfPowerFrequency', Fc, 'SampleRate', Fs, 'DesignMethod', 'butter');
% 对每个子载波上的振幅和相位数据应用低通滤波器
filtered_data = zeros(size(amplitude_data));
for i = 1:120
filtered_data(:, i) = filtfilt(lowpass_filter, amplitude_data(:, i));
end
% 将滤波后的振幅和相位数据保存回result_matrix
result_matrix(:, 1:120) = filtered_data;
% 画出经低通滤波器处理后的数据
subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
plot(result_matrix(:, 1:120));
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(lowpass)');
hold off
四、离散小波变换
%% 降噪三:离散小波变换
% 这一节得到是降噪后的result_matrix
% 提取振幅和相位数据
amplitude_data = result_matrix(:, 1:120);
% 可视化
figure;
% 画出原始数据
subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
plot(amplitude_data);
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(原始)');
hold on
% 初始化去噪后的数据矩阵
filtered_data = zeros(size(amplitude_data));
% 对每个子载波上的振幅和相位数据应用小波去噪
for i = 1:120
maxLevel = wmaxlev(size(amplitude_data, 1), 'sym4'); % 获取最大可能的分解级别
level = min(10, maxLevel); % 保证选择的分解级别不超过最大可能级别
filtered_data(:, i) = wden(amplitude_data(:, i), 'heursure', 's', 'one', level, 'sym4');
end
% 将去噪后的振幅和相位数据保存回result_matrix
result_matrix(:, 1:120) = filtered_data;
% 画出经小波变换处理后的数据
subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
plot(result_matrix(:, 1:120));
xlabel('时间');
ylabel('振幅');
title('振幅随时间的变化(DWT)');
hold off
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)