提示:仅作个人学习记录使用
文章目录
前言
脑电信号作为一种随机非平稳信号,有很多时域和频域特征可以计算,本篇笔记主要是记录了时域特征参数的计算和一些应用场景,matlab脚本在下面已给出。
提示:以下是本篇文章正文内容,下面案例可供参考
一、时域特征有哪些
1. 平均绝对值(MAV)
意义:反映脑电信号的平均能量水平,与大脑的整体活跃度相关。
举例:
清醒状态:MAV较高(大脑活跃);
睡眠状态:MAV较低(大脑休息);
癫痫发作:MAV显著升高(异常兴奋)。
2. 均方根值(RMS)
意义:表示信号的能量强度,对突发性事件敏感。
举例:
癫痫 spike-wave 检测,正常背景活动:RMS相对稳定;癫痫发作期:RMS急剧增加。可用于发作检测和预警系统
3. 标准差(SD)
意义:反映脑电信号的波动程度,与神经活动的复杂性相关。
举例:
认知任务复杂度评估,简单任务:SD较小(信号相对规律);复杂任务:SD较大(神经活动更复杂)。注意力状态监测。
4. 波形因子(Form Factor)
意义:在脑电中反映信号的"峰度"特征,对尖波、棘波等异常波形敏感。
举例(典型数值):
正常背景活动:1.1-1.3
含有尖波:1.3-1.6
棘慢复合波:1.6-2.0
5. 峰值因子(Crest Factor)
意义:对脑电中的瞬态事件(如棘波、伪迹)极其敏感。
应用:癫痫样放电检测、眼动伪迹识别。
二、计算代码示例
%% 信号时域特征计算仿真脚本
% 计算MAV、MAS、SD、RMS等时域特征
% 直接基于数学公式实现
clear;
close all;
fclose('all');
clc;
%% 1. 生成示例信号(用于仿真测试)
% 可以使用实际信号替换这部分
N = 1000; % 信号长度
t = 0:N-1;
% 生成包含直流分量、正弦波和噪声的测试信号
signal = 2.0 + 1.5*sin(2*pi*0.05*t) + 0.5*randn(1, N);
fprintf('信号长度: %d\n', N);
%% 2. 计算时域特征(基于数学公式直接实现)
% 2.1 计算平均值(Mean)
mean_val = 0;
for i = 1:N
mean_val = mean_val + signal(i);
end
mean_val = mean_val / N;
fprintf('\n1. 平均值 (Mean): %.6f\n', mean_val);
% 2.2 计算平均绝对值(MAV - Mean Absolute Value)
%%%% 信号的绝对值的平均值
mav_val = 0;
for i = 1:N
mav_val = mav_val + abs(signal(i));
end
mav_val = mav_val / N;
fprintf('2. 平均绝对值 (MAV): %.6f\n', mav_val);
% 2.3 计算平均平方值(MAS - Mean Square Value)
%%%% 信号的平方值的均值
mas_val = 0;
for i = 1:N
mas_val = mas_val + signal(i) * signal(i); % 平方计算
end
mas_val = mas_val / N;
fprintf('3. 平均平方值 (MAS): %.6f\n', mas_val);
% 2.4 计算均方根(RMS - Root Mean Square)
%%%% MAS开根号
rms_val = sqrt(mas_val); % RMS = sqrt(MAS)
fprintf('4. 均方根值 (RMS): %.6f\n', rms_val);
% 2.5 计算标准差(SD - Standard Deviation)
%%%% 每个点和均值的差值的平方和,再除以信号长度(到这为止是方差),再开根号
variance = 0;
for i = 1:N
% 方差 = 每个值与均值之差的平方和 / N
variance = variance + (signal(i) - mean_val) * (signal(i) - mean_val);
end
variance = variance / N;
sd_val = sqrt(variance);
fprintf('5. 标准差 (SD): %.6f\n', sd_val);
% 2.6 计算方差(Variance) - 上面已经计算过,这里直接输出
fprintf('6. 方差 (Variance): %.6f\n', variance);
% 2.7 计算信号的峰峰值(Peak-to-Peak)
max_val = signal(1);
min_val = signal(1);
for i = 2:N
if signal(i) > max_val
max_val = signal(i);
end
if signal(i) < min_val
min_val = signal(i);
end
end
peak_to_peak = max_val - min_val;
fprintf('7. 峰峰值 (Peak-to-Peak): %.6f\n', peak_to_peak);
% 2.8 计算波形因子(Form Factor)
form_factor = rms_val / mav_val;
fprintf('8. 波形因子 (Form Factor): %.6f\n', form_factor);
% 2.9 计算峰值因子(Crest Factor)
crest_factor = max_val / rms_val;
fprintf('9. 峰值因子 (Crest Factor): %.6f\n', crest_factor);
%% 3. 验证计算结果(与MATLAB内置函数对比)
fprintf('\n=== 验证计算结果 ===\n');
fprintf('MAV验证: 手动计算=%.6f, MATLAB函数=%.6f\n', ...
mav_val, mean(abs(signal)));
fprintf('RMS验证: 手动计算=%.6f, MATLAB函数=%.6f\n', ...
rms_val, rms(signal));
fprintf('标准差验证: 手动计算=%.6f, MATLAB函数=%.6f\n', ...
sd_val, std(signal, 1)); % 使用std(signal,1)进行总体标准差计算
% 信号绝对值
subplot(2, 3, 2);
plot(abs(signal), 'r-', 'LineWidth', 1);
title('信号绝对值');
xlabel('采样点');
ylabel('绝对值');
grid on;
% 信号平方值
subplot(2, 3, 3);
plot(signal .* signal, 'g-', 'LineWidth', 1);
title('信号平方值');
xlabel('采样点');
ylabel('平方值');
grid on;
%% 4. 使用封装函数重新计算
fprintf('\n=== 使用封装函数计算 ===\n');
features = calculate_time_domain_features(signal);
feature_names = {'平均值', '平均绝对值', '平均平方值', '均方根值', ...
'标准差', '方差', '峰峰值', '波形因子', '峰值因子'};
feature_fields = {'mean', 'mav', 'mas', 'rms', 'sd', 'variance', ...
'peak_to_peak', 'form_factor', 'crest_factor'};
for i = 1:length(feature_names)
fprintf('%s: %.6f\n', feature_names{i}, features.(feature_fields{i}));
end
%% 5. 可视化结果
figure('Position', [100, 100, 1200, 800]);
% 原始信号
subplot(2, 3, 1);
plot(signal, 'b-', 'LineWidth', 1);
title('原始信号');
xlabel('采样点');
ylabel('幅值');
grid on;
%% 封装为函数(便于后续使用)
function features = calculate_time_domain_features(signal)
% 计算信号的时域特征
% 输入: signal - 信号向量
% 输出: features - 包含各种时域特征的结构体
N = length(signal);
% 初始化变量
sum_val = 0;
sum_abs = 0;
sum_square = 0;
max_val = signal(1);
min_val = signal(1);
% 第一次遍历:计算基本统计量
for i = 1:N
current_val = signal(i);
% 累加求和
sum_val = sum_val + current_val;
% 累加绝对值
sum_abs = sum_abs + abs(current_val);
% 累加平方值
sum_square = sum_square + current_val * current_val;
% 更新最大值和最小值
if current_val > max_val
max_val = current_val;
end
if current_val < min_val
min_val = current_val;
end
end
% 计算基本特征
features.mean = sum_val / N;
features.mav = sum_abs / N;
features.mas = sum_square / N;
features.rms = sqrt(features.mas);
% 第二次遍历:计算需要均值的特征(方差、标准差)
sum_variance = 0;
for i = 1:N
diff = signal(i) - features.mean;
sum_variance = sum_variance + diff * diff;
end
features.variance = sum_variance / N;
features.sd = sqrt(features.variance);
% 其他特征
features.peak_to_peak = max_val - min_val;
features.form_factor = features.rms / features.mav;
features.crest_factor = max_val / features.rms;
features.max_value = max_val;
features.min_value = min_val;
end
总结
以上只是基于计算公式简单实现了时域参数的计算,如果需要分段拆分,直接对信号进行索引后循环计算即可。主要是为了博主自己记录使用。
3074

被折叠的 条评论
为什么被折叠?



