Model for Simulating ECG and PPG Signals with Arrhythmia Episodes 1.3.1

File: <base>/ECG_PPG_model/simPAF_gen_multilead_P_waves.m (5,202 bytes)
function multilead_P_waves = simPAF_gen_multilead_P_waves(num)
%
% multilead_P_waves = simPAF_gen_multilead_P_waves() returns multilead (15
% lead) simulated P waves. P waves are simulated using Hermite functions as
% a basis.
%
% Copyright (C) 2017  Andrius Petrenas
% Biomedical Engineering Institute, Kaunas University of Technology
%
% Available under the GNU General Public License version 3
% - please see the accompanying file named "LICENSE"
%
% num - number of P waves to be generated.
%
% Generated leads:
% multilead_P_waves(1,:) - I        multilead_P_waves(7,:) - V1           
% multilead_P_waves(2,:) - II       multilead_P_waves(8,:) - V2        
% multilead_P_waves(3,:) - III      multilead_P_waves(9,:) - V3        
% multilead_P_waves(4,:) - aVR      multilead_P_waves(10,:) - V4 
% multilead_P_waves(5,:) - aVL      multilead_P_waves(11,:) - V5 
% multilead_P_waves(6,:) - aVF      multilead_P_waves(12,:) - V6 
%
% multilead_P_waves(13,:) - X
% multilead_P_waves(14,:) - Y
% multilead_P_waves(15,:) - Z
%
multilead_P_waves = zeros(15,num,150);
p_frank = zeros(3,150);
% Guillem transform matrix  
D = [-0.266  0.027  0.065  0.131 0.203 0.220  0.370 -0.154;
      0.088 -0.088  0.003  0.042 0.047 0.067 -0.131  0.717;
     -0.319 -0.198 -0.167 -0.099 0.009 0.060  0.184  0.114];
% Compute inversion of Guillem's transformation matrix for the purpose to
% generate 12 leads
T=pinv(D'*D)*D';  
% Time array (generates 150 samples)
t = -3.8:0.05:3.7-0.03;

% Get parameters for P wave in Frank lead X
kx0 = simPAF_gen_rand_num(0.04, 0.09);
kx1 = simPAF_gen_rand_num(-0.02, 0.02);
kx2 = simPAF_gen_rand_num(0, 0.02);

bx0 = simPAF_gen_rand_num(0.8, 1);
bx1 = simPAF_gen_rand_num(0.5, 1);
bx2 = simPAF_gen_rand_num(0.5, 1); 
% Get parameters for P wave in Frank lead Y
ky0 = simPAF_gen_rand_num(0.05, 0.15);
ky1 = simPAF_gen_rand_num(-0.03, 0.03);
ky2 = simPAF_gen_rand_num(0, 0.03);

by0 = simPAF_gen_rand_num(0.8, 1);
by1 = simPAF_gen_rand_num(0.5, 1);
by2 = simPAF_gen_rand_num(0.5, 1);
% Get parameters for P wave in Frank lead Z
kz0 = simPAF_gen_rand_num(-0.02, 0.02);  
kz1 = simPAF_gen_rand_num(-0.02, -0.05);  
kz2 = simPAF_gen_rand_num(-0.02, 0); 

bz0 = simPAF_gen_rand_num(0.5, 1); 
bz1 = simPAF_gen_rand_num(0.7, 1); 
bz2 = simPAF_gen_rand_num(0.6, 1); 

% Generate dominant frequency of P variability (between 1 and 3 Hz)
fk0 = simPAF_gen_rand_num(1, 3);
fk1 = simPAF_gen_rand_num(1, 3);
fk2 = simPAF_gen_rand_num(1, 3);

fb0 = simPAF_gen_rand_num(1, 3);
fb1 = simPAF_gen_rand_num(1, 3);
fb2 = simPAF_gen_rand_num(1, 3);

% Generate phase for each variability related frequency
if rand(1,1)> 0.5
    phaseX = 0;
else 
    phaseX = pi;
end

if rand(1,1)> 0.5
    phaseY = 0;
else 
    phaseY = pi;
end

if rand(1,1)> 0.5
    phaseZ = 0;
else 
    phaseZ = pi;
end

% Generate required number of P waves in Frank leads X, Y, Z
for n = 1:num
  
kx0m = simPAF_gen_P_morf_variab(fk0, phaseX, kx0, 0.04, 0.09, n);
kx1m = simPAF_gen_P_morf_variab(fk1, phaseX, kx1, -0.02, 0.02, n);
kx2m = simPAF_gen_P_morf_variab(fk2, phaseX, kx2, 0, 0.02, n);

bx0m = simPAF_gen_P_morf_variab(fb0, phaseX, bx0, 0.8, 1, n);
bx1m = simPAF_gen_P_morf_variab(fb1, phaseX, bx1, 0.5, 1, n);
bx2m = simPAF_gen_P_morf_variab(fb2, phaseX, bx2, 0.5, 1, n);
    
[p_frank(1,:), ~, ~, ~] =  simPAF_gen_single_P_wave(t,kx0m,kx1m,kx2m,bx0m,bx1m,bx2m);
 
ky0m = simPAF_gen_P_morf_variab(fk0, phaseY, ky0, 0.05, 0.15, n);
ky1m = simPAF_gen_P_morf_variab(fk1, phaseY, ky1, -0.03, 0.03, n);
ky2m = simPAF_gen_P_morf_variab(fk2, phaseY, ky2, 0, 0.03, n);

by0m = simPAF_gen_P_morf_variab(fb0, phaseY, by0, 0.8, 1, n);
by1m = simPAF_gen_P_morf_variab(fb1, phaseY, by1, 0.5, 1, n);
by2m = simPAF_gen_P_morf_variab(fb2, phaseY, by2, 0.5, 1, n);
    
[p_frank(2,:), ~, ~, ~] =  simPAF_gen_single_P_wave(t,ky0m,ky1m,ky2m,by0m,by1m,by2m);
 
kz0m = simPAF_gen_P_morf_variab(fk0, phaseZ, kz0, -0.02, 0.02, n);
kz1m = simPAF_gen_P_morf_variab(fk1, phaseZ, kz1, 0.02, 0.05, n);
kz2m = simPAF_gen_P_morf_variab(fk2, phaseZ, kz2, -0.02, 0, n);

bz0m = simPAF_gen_P_morf_variab(fb0, phaseZ, bz0, 0.5, 1, n);
bz1m = simPAF_gen_P_morf_variab(fb1, phaseZ, bz1, 0.7, 1, n);
bz2m = simPAF_gen_P_morf_variab(fb2, phaseZ, bz2, 0.6, 1, n);
    
[p_frank(3,:), ~, ~, ~] =  simPAF_gen_single_P_wave(t,kz0m,kz1m,kz2m,bz0m,bz1m,bz2m);

p_frank(1,:) = p_frank(1,:)*1.5;
p_frank(2,:) = p_frank(2,:)*1.2;
p_frank(3,:) = p_frank(3,:)*1.5;
p_sim = T*p_frank; 
 
 multilead_P_waves(1:8,n,:) = p_sim(1:8,:); % V1, V2, V3, V4, V5, V6, I, II, 
 multilead_P_waves(9,n,:) = p_sim(8,:) - p_sim(7,:);     % III
 multilead_P_waves(10,n,:) = -(p_sim(7,:) + p_sim(8,:))/2; % aVR
 multilead_P_waves(11,n,:) =  p_sim(7,:) - p_sim(8,:)/2;   % aVL
 multilead_P_waves(12,n,:) =  p_sim(8,:) - p_sim(7,:)/2;   % aVF
    
 multilead_P_waves(13,n,:) = p_frank(1,:); % X
 multilead_P_waves(14,n,:) = p_frank(2,:); % Y
 multilead_P_waves(15,n,:) = p_frank(3,:); % Z

end

p_waves_temp = multilead_P_waves;
multilead_P_waves(1:6,:,:) = multilead_P_waves(7:12,:,:);
multilead_P_waves(7:12,:,:) = p_waves_temp(1:6,:,:);

end