Добавил:
koba004
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
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]);
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 депрессия (увеличенный)');
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
% П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]);
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 депрессия (увеличенный)');
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
Соседние файлы в папке 3
