EEG分类攻略2-Welch 周期图
在EEG信号处理的上下文中,使用Welch方法来估算信号的功率谱密度(Power Spectral Density, PSD)是一种常见的做法。你的代码片段是利用**scipy.signal.welch
**函数来进行功率谱密度估算,并且涉及到一些关键的参数和步骤。让我们逐步分析这个代码片段的含义和作用。
代码片段解释
win = 4 * sf freqs, psd = signal.welch(eeg_data[0,31], sf, nperseg=win)
1. 定义窗口长度:
win = 4 * sf
sf
: 这是EEG信号的采样率(sampling frequency)。采样率通常以赫兹(Hz)为单位,表示每秒钟采集的样本数。例如,如果sf = 256
,则意味着每秒钟采集256个数据点。win
: 这里的窗口长度win
是通过将采样率乘以4秒来定义的。这意味着每个窗口将包含4秒的数据。因此,窗口长度win
是4 * sf
个样本点。
2. Welch方法的调用:
freqs, psd = signal.welch(eeg_data[0,31], sf, nperseg=win)
signal.welch
: 这是scipy.signal
模块中的一个函数,用于估算信号的功率谱密度(PSD)。它采用傅里叶变换来计算信号在不同频率上的功率分布。eeg_data[0,31]
: 这表示从EEG数据集中提取信号。eeg_data
是一个多通道EEG信号的数组(通常维度为[channels, samples]
),在这个例子中,eeg_data[0,31]
指的是第1个电极(通常是0
表示第一个电极)的第32个样本(从0开始索引)。所以,这个语句表示提取第1个电极的数据。sf
: 这是EEG信号的采样频率。通过将采样频率传递给welch
函数,信号的频谱将被正确地估算。nperseg=win
: 这是Welch方法中的一个参数,定义每个子段(segment)的长度。通过将窗口长度win
(即4秒的数据样本数)传递给nperseg
,我们确定了用于计算功率谱的子段长度。
3. Welch方法的输出:
-
freqs
: 这个输出是一个包含频率的数组,表示功率谱中每个频率点的频率值。它的单位通常是赫兹(Hz)。该数组的大小与计算出的PSD的维度相同。freqs
给出了频谱的横轴,表示信号的不同频率。 -
psd
: 这是功率谱密度(Power Spectral Density),表示信号在不同频率上的功率分布。psd
的每个值对应于freqs
中相应频率点的功率。其单位通常是“功率/赫兹”(Power per Hertz),即每个频率段的功率大小。psd
是一个一维数组,其长度等于freqs
的长度。
Welch方法的工作原理
Welch方法是一种基于快速傅里叶变换(FFT)的功率谱估算方法。其基本流程如下:
-
信号分段:将原始EEG信号分成多个重叠的子段(在此代码中,每个子段的长度是
win = 4 * sf
个样本)。例如,如果sf = 256
,那么每个子段的长度就是1024个样本点(即4秒的数据)。 -
加窗函数:对每个子段应用窗函数(如Hamming窗),这样可以减少频谱泄露(spectral leakage),使得频谱估算更加准确。
-
傅里叶变换:对每个子段进行快速傅里叶变换(FFT),将时域信号转换到频域,计算其频谱。
-
功率谱估计:对每个子段的频谱进行平方,并通过平均所有子段的结果来估算最终的功率谱密度(PSD)。这就是得到的
psd
。
Welch方法的参数说明
eeg_data[0,31]
: 输入信号,选择了一个电极的数据。你可以通过选择不同的电极信号来计算每个电极的功率谱。sf
: 采样频率,决定了信号的时间分辨率。nperseg=win
: 每个窗口的样本数。这个参数会影响到功率谱的频率分辨率和时间分辨率。如果窗口太短,频率分辨率好,但时间分辨率差;如果窗口太长,则频率分辨率差,但时间分辨率好。
Welch方法的输出示例
假设sf = 256
,eeg_data[0,31]
是一个长度为N
的EEG信号数据,Welch方法可能会输出如下:
-
freqs
:一个包含频率的数组,从0 Hz开始,频率以等间隔增大,直到Nyquist频率(即sf / 2
)。对于sf = 256
,freqs
数组的长度为win / 2 + 1
,其中win = 4 * sf
。例如:
freqs = [0, 0.25, 0.5, 0.75, ..., 128]
-
psd
:与freqs
数组相对应的功率谱密度值。它表示信号在这些频率点的功率大小。例如:
psd = [0.1, 0.2, 0.15, 0.1, ..., 0.05]
EEG专业辅导