仅作为尝试记录,大佬请跳过。程序可运行
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数据: