import matplotlib.pyplot as plt
import wfdb
import numpy as np
def SampEn(U, m, r):
def _maxdist(x_i, x_j):
return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
def _phi(m):
x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
B = [(len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) - 1.0) / (N - m+1) for x_i in x]
return (N - m + 1.0)**(-1) * sum(B)
N = len(U)
return -np.log(_phi(m+1) / _phi(m)+1e-5)
#=======================================程序参数设定=======================================
#采样率Hz
ADC_Fs = 250
#除数
ADC_CHU = 4
#=======================================程序运行部分=======================================
record = wfdb.rdrecord('C:/Users/李子毅/Desktop/demo/cu01')
print('记录名称:',record.record_name)
print('采样频率:',record.fs, 'Hz')
print(record.adc_gain)
print(type(record.d_signal))
print(type(record.p_signal))
d_signal = record.adc()
record.adc(inplace=True)
record.dac(inplace=True)
#print(d_signal[0:2000])
# 转化成list格式
ConvertList = d_signal.tolist()
# 因为采样率为12bit,所以加上2048作为中点
for i in range(0, len(ConvertList)):
ConvertList[i][0] = ConvertList[i][0] + 2048
# 以为采样率只有250Hz,但是我们的上位机使用1KHz的采样率,因此需要插值,每个值后面插三个值
# 定义差值后的list
InsertList = list()
for i in range(0, (len(ConvertList) - 1)):
# 第一个数,原来的数
InsertList.append(int(ConvertList[i][0] / 4))
# InsertList.append(int(ConvertList[i][0]))
# InsertList.append(int(ConvertList[i][0]))
# InsertList.append(int(ConvertList[i][0]))
# 计算插值分量,即为后一个数减去前一个数/(1KHz/采样率)
avr = (ConvertList[i + 1][0] - ConvertList[i][0]) / (1000 / ADC_Fs)
# 插值插入第二个数
InsertList.append(int((ConvertList[i][0] + int(avr)) / 4))
# 插值插入第三个数
InsertList.append(int((ConvertList[i][0] + int(avr * 2)) / 4))
# 插值插入第四个数
InsertList.append(int((ConvertList[i][0] + int(avr * 3)) / 4))
print(SampEn(InsertList[0:5000],2,0.2))
#plt.plot(d_signal[0: 2000])
#plt.show()
可以完成ECG数据的读取,只需去MIT官网下载数据库文件,更改文件的加载路径即可使用,