脑电EEG信号的时域特征提取的意义和matlab代码脚本

提示:仅作个人学习记录使用


前言

脑电信号作为一种随机非平稳信号,有很多时域和频域特征可以计算,本篇笔记主要是记录了时域特征参数的计算和一些应用场景,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


总结

以上只是基于计算公式简单实现了时域参数的计算,如果需要分段拆分,直接对信号进行索引后循环计算即可。主要是为了博主自己记录使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值