python使用FastICA提取胎儿心电的尝试记录

仅作为尝试记录,大佬请跳过。程序可运行


python的FastICA的使用参考博主文章传送门

心电数据

2013.mat:官网下载

使用两通道心电提取胎儿心电

import scipy.io as sio
# from matplotlib.pyplot import *
import numpy as np
import matplotlib.pyplot as plt
import pywt
from scipy import signal
import mysubplot
import fftandshow
from sklearn.decomposition import FastICA

mat_contents = sio.loadmat(r'E:\2013mat\a01.mat')
tm=mat_contents['tm']
fs=mat_contents['Fs']
sig=mat_contents['signal']

sig=np.array(sig/np.max(sig,axis=0))    # 归一化

# plt.plot(sig[:,0]);plt.plot(sig[:,1]);plt.plot(sig[:,2]);plt.plot(sig[:,3]);plt.show()            # 单图展示
# mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,1]],[tm,sig[:,2]],[tm,sig[:,3]]]);plt.show()    # 多图展示所有心电通道

# mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,2]]]);plt.show()  # 选记录通道,作为原始混叠信号
signals=np.array([sig[:,0],sig[:,2]]).T
ica=FastICA(n_components=2)
signals_pro=ica.fit_transform(signals)
mysubplot.mysubplot_addx([[tm,signals[:,0]],[tm,signals[:,1]],[tm,signals_pro[:,0]],[tm,signals_pro[:,1]]]);plt.show()  # 展示原始混叠信号和分离信号
plt.plot(signals_pro[:,0]),plt.plot(signals_pro[:,1]);plt.show()


print('ok')

在这里插入图片描述
在这里插入图片描述

使用三通道心电提取

import scipy.io as sio
# from matplotlib.pyplot import *
import numpy as np
import matplotlib.pyplot as plt
import pywt
from scipy import signal
import mysubplot
import fftandshow
from sklearn.decomposition import FastICA

mat_contents = sio.loadmat(r'E:\2013mat\a01.mat')
tm=mat_contents['tm']
fs=mat_contents['Fs']
sig=mat_contents['signal']

sig=np.array(sig/np.max(sig,axis=0))    # 归一化

# plt.plot(sig[:,0]);plt.plot(sig[:,1]);plt.plot(sig[:,2]);plt.plot(sig[:,3]);plt.show()            # 单图展示
# mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,1]],[tm,sig[:,2]],[tm,sig[:,3]]]);plt.show()    # 多图展示所有心电通道



# mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,2]]]);plt.show()  # 选记录通道,作为原始混叠信号
signals=np.array([sig[:,0],sig[:,2],sig[:,3]]).T
ica=FastICA(n_components=2)
signals_pro=ica.fit_transform(signals)
mysubplot.mysubplot_addx([[tm,signals[:,0]],[tm,signals[:,1]],[tm,signals[:,2]],[tm,signals_pro[:,0]],[tm,signals_pro[:,1]],[tm,signals_pro[:,1]]]);plt.show()  # 展示原始混叠信号和分离信号
plt.plot(signals_pro[:,0]),plt.plot(signals_pro[:,1]);plt.show()

print('ok')

在这里插入图片描述
在这里插入图片描述


a02.mat数据:
在这里插入图片描述
a04.mat数据:
在这里插入图片描述

(所用到的两个自定义函数)

import mysubplot
import fftandshow

参考博主博文传送门,分别新建mysubplot.py和fftandshow.py,在“提取胎儿心电”程序的同一目录下;然后运行提取胎儿心电的程序即可。

分割线***

以上是纯粹的胎儿心电提取,没有滤波-信号有毛刺,现增加滤波

低通滤波

在归一化后面增加程序,允许40Hz以下的信号通过:

'''滤波'''
fn=40
wn=(fn/fs[0])   # 2*(fn/fs[0])
b, a = signal.butter(3, wn, 'low')
sig_ecg=[]
for i in range(4):
    sig_ecg.append(signal.filtfilt(b, a, sig[:,i]))
sig=np.array(sig_ecg).T

a04.mat数据,去除了毛刺:
在这里插入图片描述

再1Hz高通滤波,去除基线漂移

根据资料传送门,采用1Hz高通滤波
在这里插入图片描述

在低通滤波代码后,加入程序:

fn=2    # 此时相当于是真正的1Hz滤波(2/2=1)————因为下一行代码按说是wn=2*(fn/fs[0]),只是当时低通滤波时*2效果不好而去掉了
wn=(fn/fs[0])   # 2*(fn/fs[0])
b, a = signal.butter(3, wn, 'high')
sig_ecg=[]
for i in range(4):
    sig_ecg.append(signal.filtfilt(b, a, sig[:,i]))
sig=np.array(sig_ecg).T

a04.mat数据,去除了漂移:
在这里插入图片描述

滤波后的使用三通道心电提取

import scipy.io as sio
# from matplotlib.pyplot import *
import numpy as np
import matplotlib.pyplot as plt
import pywt
from scipy import signal
import mysubplot
import fftandshow
from sklearn.decomposition import FastICA

mat_contents = sio.loadmat(r'E:\2013mat\a04.mat')
tm=mat_contents['tm']
fs=mat_contents['Fs']
sig=mat_contents['signal']

sig=np.array(sig/np.max(sig,axis=0))    # 归一化

'''滤波'''
fn=40
wn=(fn/fs[0])   # 2*(fn/fs[0])
b, a = signal.butter(3, wn, 'low')
sig_ecg=[]
for i in range(4):
    sig_ecg.append(signal.filtfilt(b, a, sig[:,i]))
sig=np.array(sig_ecg).T

'''基线漂移'''
fn=2    # 此时相当于是真正的1Hz滤波(2/2=1)————因为下一行代码按说是wn=2*(fn/fs[0]),只是当时低通滤波时*2效果不好而去掉了
wn=(fn/fs[0])   # 2*(fn/fs[0])
b, a = signal.butter(3, wn, 'high')
sig_ecg=[]
for i in range(4):
    sig_ecg.append(signal.filtfilt(b, a, sig[:,i]))
sig=np.array(sig_ecg).T
# plt.plot(sig[:,0]);plt.plot(sig[:,1]);plt.plot(sig[:,2]);plt.plot(sig[:,3]);plt.show()            # 单图展示
mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,1]],[tm,sig[:,2]],[tm,sig[:,3]]]);plt.show()    # 多图展示所有心电通道

'''两通道原信号提取胎儿心电'''
# # mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,2]]]);plt.show()  # 选记录通道,作为原始混叠信号
# signals=np.array([sig[:,0],sig[:,2]]).T
# ica=FastICA(n_components=2)
# signals_pro=ica.fit_transform(signals)
# mysubplot.mysubplot_addx([[tm,signals[:,0]],[tm,signals[:,1]],[tm,signals_pro[:,0]],[tm,signals_pro[:,1]]]);plt.show()  # 展示原始混叠信号和分离信号
# plt.plot(signals_pro[:,0]),plt.plot(signals_pro[:,1]);plt.show()

'''三通道原信号提取胎儿心电'''
# mysubplot.mysubplot_addx([[tm,sig[:,0]],[tm,sig[:,2]]]);plt.show()  # 选记录通道,作为原始混叠信号
signals=np.array([sig[:,0],sig[:,2],sig[:,3]]).T
ica=FastICA(n_components=2)
signals_pro=ica.fit_transform(signals)
mysubplot.mysubplot_addx([[tm,signals[:,0]],[tm,signals[:,1]],[tm,signals[:,2]],[tm,signals_pro[:,0]],[tm,signals_pro[:,1]],[tm,signals_pro[:,1]]]);plt.show()  # 展示原始混叠信号和分离信号
plt.plot(signals_pro[:,0]),plt.plot(signals_pro[:,1]);plt.show()

print('ok')

a04.mat数据:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41529093/article/details/113244204