根据离散傅里叶变换对ECG信号进行频谱分析

您所在的位置:网站首页 qrs波正常范围是多少 根据离散傅里叶变换对ECG信号进行频谱分析

根据离散傅里叶变换对ECG信号进行频谱分析

2023-12-14 08:52| 来源: 网络整理| 查看: 265

根据离散傅里叶变换对ECG信号进行频谱分析

根据ECG信号进行傅里叶变化频谱分析确定信号中QRS波的主要频率范围。

1、离散傅里叶变换基本原理

离散傅里叶变换是将时域信号转化为频域信号。基于时域的信号为原始信号,经过傅里叶变化得到各个频率的谐波的振幅和相位,也就是说将所有频率的谐波相加可以得到原始信号。 在这里插入图片描述

2、绘制ECG信号和频谱图 import matplotlib.pyplot as plt ecg_signal = signal_1[0] #原始ECG信号 fs = 250 #采样频率 ecg_signal_x = np.linspace(0,len(ecg_signal)/fs,len(ecg_signal)) #生成原始信号的X轴,以时间为维度 fft_x = np.linspace(0,fs,len(ecg_signal)) #生成频谱图的X轴,以频率为维度 plt.figure(figsize=(20,15)) ax0 = plt.subplot(211) ax0.set_title('ECG signal') ax0.plot(ecg_signal_x,ecg_signal) #绘制ECG原始信号 fft = np.fft.fft(ecg_signal) #对原始信号进行快速傅里叶变化 ax1 = plt.subplot(212) ax1.set_title('fft') ax1.plot(fft_x,fft) #绘制频谱图

频率的取值范围是0-250Hz(原始ECG信号的采样频率)。请添加图片描述

3、频谱图的对称性

根据离散傅里叶变换后的频谱图在频率上是对称的,所以分析ECG信号频率时,可以只针对前半部分或后半部分分析。下面进行频谱对称性的验证。 根据0-125Hz的频率信号进行反傅里叶变换。

fft = np.fft.fft(ecg_signal) for i in range(len(fft_x)): if fft_x[i]125: fft[i]=0 ifft = np.fft.ifft(fft) plt.figure(figsize=(20,5)) plt.title('fft_inverse') plt.plot(ecg_signal_x,ifft)

0-125Hz的频率信号进行反傅里叶变换结果请添加图片描述 将以上代码0和125改为126和250,查看126-250Hz频率信号的反变换结果。请添加图片描述 结果显示,0-125Hz和126-250Hz的信号相同。

4、确定QRS波的主要频段

0-50Hz,该频段的信号与0-125Hz信号近乎一样,得出这个范围是ECG信号的主要频段。 请添加图片描述 51-125Hz,可以看出这个范围的信号能量很小,0.03左右。 请添加图片描述 继续确定0-50Hz中的主要频段 经过不断的实验得出,6-30Hz是QRS波的主要频段。 6-30Hz频段的信号: 请添加图片描述

5、QRS波的能量

通过计算QRS波的能量和整个ECG信号的能量之比可以估算信号的质量。 计算QRS波与ECG信号的能量之比代码:

def psqi(ecg_signal: np.ndarray, sampling_frequency: int) -> float: """Computes the power spectrum Distribution of QRS Wave. It corresponds to the ratio of the energy of the QRS wave and the energy of the ECG signal. The energy of the QRS wave is computed on frequencies ranging from 6Hz to 30Hz, the energy of the ECG signal is computed on frequencies ranging from 0Hz to 125Hz. If interference exists, the high-frequency component increases, and pSQI decreases. Parameters ---------- ecg_signal : np.array Input ECG signal sampling_frequency : int Input ecg sampling frequency Returns ------- p_sqi_score : float """ n = len(ecg_signal) t = 1 / sampling_frequency yf = np.fft.fft(ecg_signal) xf = np.linspace(0.0, 1.0/(2.0*t), n//2) pds_num = [np.abs(yf[idx]) for idx in range(len(xf)) if 6


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3