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

根据离散傅里叶变换对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]<0 or 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 <= xf[idx] <= 30]
    pds_denom = [np.abs(yf[idx]) for idx in range(len(xf)) if
                 0 <= xf[idx] <= 125]
    p_sqi_score = float(np.round(sum(pds_num) / sum(pds_denom), 3))

    return p_sqi_score

总结:

250Hz的ECG信号的傅里叶变换后的主要频段是6-30Hz。而且QRS波的能量占整个ECG信号的0.5-0.7时,信号质量比较好。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值