Приложение 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.3 от максимума частотой 50 Гц
%и дрейф из-за дыхания 0.25 от максимума частотой
%16 вдохов в минуту
ecg_M = ecg_M + 0.3*(max(ecg_M))*sin(2*pi*50*t_M)...
+0.25*(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('t, с');
ylabel('А'); xlim([0 20]);
11
title('Вариабельность времени)'); grid on;
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('t, с');
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('t, с');
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('t, с');
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('t, с');
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('t, с');
ylabel('А'); xlim([2 4]);
title('Норма и ST депрессия (увеличенный)');
12
grid on; hold on;
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('t, с');
ylabel('А'); xlim([0 20]); title('Помехи'); grid on;
%Увеличенный вариант
subplot(2,1,2);
plot(t_M, ecg_M, 'b', 'LineWidth', 1); xlabel('t, с');
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
