Приложение 1
Листинг программы
close all;
%П1. Параметры волн
%Нормального ритма waves_N = struct( ...
'name', {'P','Q','R','S','ST','T'}, ...
'A', {0.11, -0.004, 1.453, -1.053, 0.063, 0.52}, ...
'b1', {0.014, 0.008, 0.008, 0.007, 0.04, 0.056}, ...
'b2', {0.014, 0.008, 0.008, 0.007, 0.04, 0.024}, ...
'mu', {0.399, 0.45, 0.474, 0.495, 0.574, 0.7} ...
);
%Депрессии ST сегмента
waves_D = struct( ...
'name', {'P','Q','R','S','ST','T'}, ...
'A', {0.04, 0, 0.64, -0.1, -0.23, 0.06}, ...
'b1', {0.03, 0.066, 0.016, 0.03, 0.15, 0.1}, ...
'b2', {0.03, 0.066, 0.026, 0.03, 0.2, 0.08}, ...
'mu', {0.203, 0.266, 0.296, 0.4, 0.45, 0.7} ...
);
% П3. Генерация нескольких комплексов
Fs = |
500; |
% частота дискретизации (Гц) |
Fcss |
= 60; |
% базовая длительность ЧСС (Гц) |
t0 = |
60/Fcss; |
% базовая длительность комплекса (мс) |
N = 20; |
% количество комплексов |
|
V = -0.2:0.01:0.2; |
% диапазон вариации длительности |
|
dA = |
-0.2:0.01:0.2; |
% диапазон вариации амплитуд |
%Генерация идеального нормального ритма ecg_N = do_ecg(20, waves_N,t0,Fs, 0, 0);
%Генерация нормального ритма с вариацией t ecg_N1 = do_ecg(20, waves_N,t0,Fs, V, 0);
%Генерация нормального ритма с вариацией А ecg_N2 = do_ecg(20, waves_N,t0,Fs, 0, dA);
%Генерация идеального депрессивного ритма ecg_D = do_ecg(20, waves_D, t0, Fs, 0, 0);
%Генерация нормального ритма со всеми вариациями
%дейфом изолинии и сетевой наводкой.
%Сначала генерируем базовый сигнал
ecg_M = do_ecg(20, waves_N, t0, Fs, V, dA);
% Рассчитываем его интервал t_M = (0:length(ecg_M)-1) / Fs;
%Накладываем наводку 0.2 от максимума частотой 50 Гц
%и дрейф из-за дыхания 0.5 от максимума частотой
%12 вдохов в минуту
ecg_M = ecg_M + 0.2*(max(ecg_M))*sin(2*pi*50*t_M)...
+0.5*(max(ecg_M))*sin(2*pi*12/60*t_M);
%П4. Построение графиков
%Сравнение нормальных экг figure('Name','Normal ECG');
%С вариацией по времени subplot(2,2,1);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([0 20]);
title('Нормальная ЭКГ (нормальная форма с вар. врем.)'); grid on;
11
hold on;
t = (0:length(ecg_N1)-1) / Fs;
plot(t, ecg_N1, 'r', 'LineWidth', 0.5); % Увеличенное -//-
subplot(2,2,3);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([2 4]);
title('Нормальная ЭКГ (увеличенный)'); grid on;
hold on;
t = (0:length(ecg_N1)-1) / Fs;
plot(t, ecg_N1, 'r', 'LineWidth', 0.5);
%С вариацией амплитуды subplot(2,2,2);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([0 20]);
title('Нормальная ЭКГ (нормальная форма с вар. ампл.)'); grid on;
hold on;
t = (0:length(ecg_N2)-1) / Fs;
plot(t, ecg_N2, 'r', 'LineWidth', 0.5);
%Увеличенное -//-
subplot(2,2,4);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([2 4]);
title('Нормальная ЭКГ (увеличенный)'); grid on;
hold on;
t = (0:length(ecg_N2)-1) / Fs;
plot(t, ecg_N2, 'r', 'LineWidth', 0.5);
%Сравнение нормальной экгс депрессивной figure('Name','Depressed ECG'); subplot(2,1,1);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([0 20]);
title('ЭКГ в норме и с ST депрессией'); grid on;
hold on;
t = (0:length(ecg_D)-1) / Fs;
plot(t, ecg_D, 'r', 'LineWidth', 0.5);
%Увеличенный
subplot(2,1,2);
t = (0:length(ecg_N)-1) / Fs; plot(t, ecg_N, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([2 4]);
title('ЭКГ в норме и с ST депрессией (увеличенный)'); grid on;
hold on;
12
t = (0:length(ecg_D)-1) / Fs;
plot(t, ecg_D, 'r', 'LineWidth', 0.5);
%Построение симуляции реальной ЭКГ figure('Name','Simulated ECG'); subplot(2,1,1);
plot(t_M, ecg_M, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([0 20]);
title('ЭКГ в норме и со всеми добавлениями'); grid on;
%Увеличенный вариант
subplot(2,1,2);
plot(t_M, ecg_M, 'b', 'LineWidth', 1); xlabel('Время, с'); ylabel('Амплитуда');
xlim([2 4]);
title('ЭКГ в норме и со всеми добавлениями'); grid on;
% П3. Покомплексный расчёт
function [out] = do_ecg(N, waves, t0, Fs, V, dA) ecg = [];
for m = 1:N
%Вариация длительности
%(умножаем на случайный коэфф и переводим в секунды) t0m = t0 * (1 + datasample(V,1));
waves_m = waves;
%Вариация амплитуда
for i = 1:length(waves)
waves_m(i).A = waves_m(i).A.*(1 + datasample(dA,1));
end
%Моделирование одного комплекса ecg1 = model_cmpx(waves_m, t0m, Fs);
%Добавление к массиву
ecg = [ecg, ecg1];
end
out = ecg;
end
% П2. Функция моделирования одного комплекса function out = model_cmpx(waves, t0m, Fs)
%Временные отсчёты time_grid = 0:1/Fs:t0m;
%Нулевой вектор отсчётов
out = zeros(1, length(time_grid)); % Расчёты сложные пипец
for i = |
1:length(waves) |
w = |
waves(i); |
num |
= (time_grid - w.mu).^2; |
den |
= zeros(size(time_grid)); |
for |
k = 1:length(time_grid) |
|
if time_grid(k) < w.mu |
|
den(k) = w.b1^2; |
|
else |
|
den(k) = w.b2^2; |
|
end |
end |
|
out |
= out + w.A * exp(-num ./ (2*den)); |
end |
|
end
13
