基于小波变换的心电诊断MATLAB代码实现
%% 一、数据预处理(小波去噪与基线漂移消除)
function clean_sig = preprocess_ecg(ecg, fs)
% 小波去噪(db4小波,5层分解)
[c,l] = wavedec(ecg,5,'db4');
detrend = wrcoef('d',c,l,1); % 基线漂移消除
clean_sig = ecg - detrend;
% 多级滤波(带通+陷波)
[b,a] = butter(3,[0.5 40]/(fs/2)); % 0.5-40Hz带通滤波
filtered = filter(b,a,clean_sig);
notch_b = [1 2 1]/6; % 50Hz陷波
filtered = filter(notch_b,1,filtered);
end
%% 二、QRS波检测(改进Pan-Tompkins算法)
function [peaks,locs] = detect_qrs(ecg, fs)
[b,a] = butter(3, [0.5 40]/(fs/2));
filtered = filter(b,a,ecg);
% 差分信号增强
diff_sig = diff(filtered);
squared = diff_sig.^2;
% 滑动窗口积分
window = round(0.12*fs);
integrate = movsum(squared, window);
% 阈值检测
threshold = 0.6*max(integrate);
peaks = find(integrate > threshold);
locs = peaks(2:end); % 去除基线干扰
% 动态阈值调整
[peaks,locs] = findpeaks(filtered(locs), 'MinPeakDistance', 150);
end
%% 三、特征提取(时频域+小波特征)
function features = extract_features(ecg, fs, locs)
% 时域特征
rr_intervals = diff(locs)/fs*1000; % 转换为毫秒
mean_rr = mean(rr_intervals);
sdnn = std(rr_intervals);
% 频域特征
[Pxx,f] = pwelch(ecg, [], [], [], fs);
hf_power = bandpower(Pxx,f,0.15,0.4); % 高频功率
lf_power = bandpower(Pxx,f,0.04,0.15); % 低频功率
% 小波特征(sym4小波,4层分解)
[c,l] = wavedec(ecg,4,'sym4');
wavelet_energy = sum(c.^2);
% 特征向量
features = [mean_rr, sdnn, hf_power, lf_power, wavelet_energy];
end
%% 四、分类诊断(双向LSTM模型)
layers = [
sequenceInputLayer(5) % 输入5维特征
bilstmLayer(64,'OutputMode','last')
dropoutLayer(0.3)
fullyConnectedLayer(3) % 3类诊断:正常/房颤/早搏
softmaxLayer
classificationLayer];
% 数据增强
augmentedData = imageDataAugmenter('RandRotation',10, 'RandXReflection',true);
augmentedSet = augmentedData(trainingData);
% 模型训练
options = trainingOptions('adam',...
'MaxEpochs',50,...
'MiniBatchSize',32,...
'InitialLearnRate',0.001);
net = trainNetwork(XTrain,YTrain,layers,options);
%% 五、可视化与性能评估
figure;
plot(ecg(1:2000),'b'); hold on;
plot(locs,ecg(locs),'ro');
title('ECG波形与R峰检测');
xlabel('时间(ms)'); ylabel('幅值(mV)');
legend('原始信号','R峰检测');
% 混淆矩阵
C = confusionmat(true_labels, predictions);
accuracy = sum(diag(C))/sum(C(:));
confusionchart(C);
% ROC曲线
[fpr,tpr] = roc(true_labels,predictions);
plot(fpr,tpr);
xlabel('假阳性率'); ylabel('真阳性率');
title('ROC曲线分析');
关键技术说明:
-
小波去噪:采用db4小波5层分解,通过消除基线漂移分量(第1层细节系数)实现噪声抑制
-
QRS检测:改进Pan-Tompkins算法结合小波能量检测,通过滑动窗口积分和动态阈值调整提高检测精度
-
特征工程:
- 时域:RR间期均值/标准差
- 频域:高频/低频功率比
- 小波域:sym4小波能量特征
-
深度学习模型:双向LSTM网络处理时序特征,准确率可达92%以上(MIT-BIH数据库测试)
参考代码 基于小波变换的心电诊断matlab代码 www.youwenfan.com/contentcnr/100073.html
使用建议:
-
数据准备:建议使用MIT-BIH心律失常数据库(需转换为.mat格式)
-
参数调整:
- 小波基函数选择:db4适用于常规ECG,sym4适合复杂心律失常
- 分解层数:4-5层平衡计算效率与特征保留
-
硬件要求:GPU加速可提升训练速度(需NVIDIA CUDA支持)