-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPCG_segmentation.py
111 lines (95 loc) · 3.6 KB
/
PCG_segmentation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""
Segmenting & Timing
Created on Wed Nov 14 05:55:10 2018
@author: colossus
"""
import os
import numpy as np
#import wavio as wa
#import sounddevice as sd
import ppfunctions_1 as ppf
import scipy.io.wavfile as wf
import matplotlib.pyplot as plt
# -----------------------------------------------------------------------------
# Signal Loading Process
# -----------------------------------------------------------------------------
print('importing all training-a data base')
# Looking for heart sounds data absolute path
l1=os.path.abspath('Data Base HS\\non_pathologic\\1.1.wav')
#l1=os.path.abspath('Data Base HS\\pathologic\\2.1.wav')
l1=l1.replace('\\','/')
l2=os.path.abspath('Data Base HS\\pathologic\\2.3.wav')
l2=l2.replace('\\','/')
l3=os.path.abspath('Data Base HS\\pathologic\\3.2.wav')
l3=l3.replace('\\','/')
l4=os.path.abspath('Data Base HS\\pathologic\\4.3.wav')
l4=l4.replace('\\','/')
l5=os.path.abspath('Data Base HS\\pathologic\\4.5.wav')
l5=l5.replace('\\','/')
# reading file
Fs1, data1 = wf.read(l1)
Fs2, data2 = wf.read(l2)
Fs3, data3 = wf.read(l3)
Fs4, data4 = wf.read(l4)
Fs5, data5 = wf.read(l5)
# Clear paths
del l1, l2, l3, l4, l5
# -----------------------------------------------------------------------------
# Pre-Process: Signal basic information (SBI)
# -----------------------------------------------------------------------------
duration1 = 1/Fs1*np.size(data1)
duration2 = 1/Fs2*np.size(data2)
duration3 = 1/Fs3*np.size(data3)
duration4 = 1/Fs4*np.size(data4)
duration5 = 1/Fs5*np.size(data5)
vt1 = np.linspace(0,duration1,np.size(data1)) # Vector time 1
vt2 = np.linspace(0,duration2,np.size(data2)) # Vector time 3
vt3 = np.linspace(0,duration3,np.size(data3)) # Vector time 5
vt4 = np.linspace(0,duration4,np.size(data4)) # Vector time 7
vt5 = np.linspace(0,duration5,np.size(data5)) # Vector time 9
data1 = ppf.vec_nor(data1)
data2 = ppf.vec_nor(data2)
data3 = ppf.vec_nor(data3)
data4 = ppf.vec_nor(data4)
data5 = ppf.vec_nor(data5)
# -----------------------------------------------------------------------------
# Pre-Process: Segmentationg and Timing
# -----------------------------------------------------------------------------
# Segmenting in an specific frequency band
pcgPeaks, peaks, allpeaks = ppf.PDP(data1, Fs1)
f_data1 = ppf.butter_bp_fil(data1, 50, 150, Fs1)
f_pcgPeaks, f_peaks, f_allpeaks = ppf.PDP(f_data1, Fs1)
# -----------------------------------------------------------------------------
# Time processing
dT = 0.4 # Diastole time in ms
timeV = []
timeV.append(0)
pointV = []
pointV.append(0)
segmV = np.zeros(len(data1))
for i in range(len(pcgPeaks)-1):
if pcgPeaks[i]>0.5:
timeV.append(i/Fs1) # Gives the time when a peak get found
pointV.append(i) # Gives the time when a peak get found
if (pointV[-1]/Fs1)-(pointV[-2]/Fs1)< dT:
segmV[pointV[-2]:pointV[-1]] = 0.6 # Marc a diastolic segment
else:
segmV[pointV[-2]:pointV[-1]] = 0.4 # Marc a systolic segment
# -----------------------------------------------------------------------------
# Plotting Time Signal
# -----------------------------------------------------------------------------
plt.figure(1)
plt.title('Pathologic Heart sounds in time')
plt.subplot(3,1,1)
plt.plot(vt1, data1,'r', vt1, pcgPeaks, 'b')
plt.subplot(3,1,2)
plt.plot(vt1, data1,'r', vt1, peaks, 'b')
plt.subplot(3,1,3)
plt.plot(vt1, data1,'r', vt1, allpeaks, 'b')
plt.figure(2)
plt.title('Pathologic Heart sounds in time')
plt.subplot(3,1,1)
plt.plot(vt1, data1,'r', vt1, pcgPeaks, 'b')
plt.subplot(2,1,2)
plt.plot(vt1, data1,'r', vt1, segmV, 'b')
plt.show()