一、问题描述
试验生成大量的.mat文件,但只有接收信号数据,无上位机信号发射数据,且研究内容需要用到信号的发射时间、结束时间以及其时间间隔,现对其进行标注。
1.信号结构
这是一组试验数据,峰值较高位置为接收到的信号,此处共13处信号,一共六百万个数据点,我需要较为精确地标出每个信号的起始和结束时间,手动标注较为麻烦且误差较大,因此在对其进行处理之前可以先自动标注。
2.主要内容
因为信号起伏较大,且有短暂噪声的影响,因此采用添加时间窗口取平均值,在这个时间窗口内,平均值大于阈值则认为在信号时间内,平均值小于阈值则认定在信号静默内。
二、解决程序
clear all;
% 加载数据
load('data5.mat'); % 替换为自己的文件夹路径和文件名称
data=p_data; %因为我导入的data5.mat中有三个变量,P_data、vx、vy,对我们有用的是p_data,因此将其取出
Fs = 50000; % 采样频率
threshold = 0.2; % 阈值,根据自己数据选择合适的阈值
window_size = 1000; % 窗口大小,根据自己数据选择合适的窗口大小,我这6000000因此可以选择略大的1000
num_samples = length(data);
total_time = num_samples / Fs; % 总时间
% 计算数据绝对值的滑动窗口平均值
abs_data = abs(data);%信号有正负,取绝对值
avg_values = movmean(abs_data, window_size);
% 找出平均值超过阈值的点
above_threshold = avg_values > threshold;
% 找出起始和终止时间点
start_end_points = [];
in_segment = false;
start_point = 0;
for i = 1:num_samples
if above_threshold(i) && ~in_segment
in_segment = true;
start_point = (i - 1) / Fs; % 转换为时间
elseif ~above_threshold(i) && in_segment
in_segment = false;
end_point = (i - 1) / Fs; % 转换为时间
start_end_points = [start_end_points; start_point, end_point];
end
end
% 如果最后一个窗口仍在段内,则结束时间为最后一个点
if in_segment
end_point = num_samples / Fs;
start_end_points = [start_end_points; start_point, end_point];
end
% 显示结果
disp('起始和终止时间点(秒):');
disp(start_end_points);
% 可视化结果
time = (0:num_samples-1) / Fs; % 时间轴
figure;
plot(time, data);
hold on;
for i = 1:size(start_end_points, 1)
x = [start_end_points(i, 1), start_end_points(i, 2)];
y = [0, 0];
plot(x, y, 'r', 'LineWidth', 2);
end
hold off;
xlabel('时间 (秒)');
ylabel('数据值');
title('数据及幅值较大段的起始和终止时间点');
三、结果
在命令行窗口中显示内容如下:
可视化结果如下:
命令行窗口得到的数据值即为红线的两端对应的横坐标值。
联系作者:2230648022@qq.com