Скачиваний:
1
Добавлен:
12.02.2026
Размер:
6 Кб
Скачать
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
Соседние файлы в папке 3