我有一个非恒定采样频率的EEG信号,如下图所示。
我正在尝试对EEG信号进行重新采样,以获得恒定的采样频率,以便更好地用于进一步分析。
现在,我将信号分成每个1秒的时间帧,并使用resample函数重新采样它们以获得恒定的采样频率。但是,由此产生的EEG信号似乎不正确,连接点出现奇怪的波动。
我不认为我这样做是正确的,所以如果有可能,有人可以提供更好的建议或指出我正确的方向吗?感谢。
现有代码(在for循环中执行,在每个1秒的时间范围内通过整个EEG信号):
% Calculate resampling factors p & q
% Fs(currSecond) gives the number of samples within that time frame of 1 second
% nFS is the target sampling frequency (constant) to be achieved for each time frame
[p, q] = rat(nFs/Fs(currSecond), 0.0000000001);
% Calculate the end of data to be resampled
endSample = currSample + Fs(currSecond) - 1;
% Resample EEG data
EEG_Data_Resampled = ...
resample(EEG_Data_Trimmed(currSample : endSample, 1:4), p, q, 0);
% Store resampled EEG data
nCombinedData(startRow : endRow, 2:5) = num2cell(EEG_Data_Resampled);
% Update starting sample for next iteration
currSample = currSample + Fs(currSecond);
修改:将resample
函数更改为使用n值0
% If you let n = 0, resample performs a nearest-neighbor interpolation
% Resample EEG data
EEG_Data_Resampled = ...
resample(EEG_Data_Trimmed(currSample : endSample, 1:4), p, q, 0);
它似乎给了我更好的重采样数据,但我仍然不确定是否为重采样版本保留了原始EEG信号的功能。
答案 0 :(得分:3)
重新采样只会从一个固定的采样率转换为另一个。要从非恒定采样率重新采样,您必须知道每个原始采样的时间。如果您知道这些时间为t_orig_sec
,则可以通过t_new_sec
命令将原始信号插入新的时基(interp1
)。您使用什么类型的插值(linear
,spline
等)会影响插值过程产生的失真或谐波类型。
我建议像:
%given: t_orig_sec and eeg_data
%interpolate to a new, fixed sample rate: fs
fs = 250; %new sample rate in Hz
dt_sec = 1/fs;
t_new_sec = [t_orig_sec(1):dt_sec:t_orig_sec(end)] %new time vector
new_eeg_data = interp1(t_orig_sec, eeg_data, t_new_sec, 'spline');
更大的问题是,你的eeg信号是否真的被采样不均匀。几乎每个数据采集系统都意味着连续信号(如EEG)以恒定速率采样。如果该数据未以恒定速率到达您的PC,则可能是由于数据采集系统中的延迟将数据推出串行通信线路,或者可能是由于操作系统延迟服务于接收到的串行数据通信。
在重新采样信号之前,我强烈建议您确认您的系统确实采样不均匀。我会将一个已知的恒定频率信号注入你的EEG系统(你可能需要用电阻器分割你注入的信号以获得更低的电压)。然后,我会查看为您注入的信号记录的数据。假设系统具有恒定的采样率并查看记录信号的频谱图。如果记录信号的频率稳定,那么您的EEG系统将以恒定的采样率正确记录。如果录制信号的频率发生变化,那么您将确认您的系统具有不同的采样率。
如果它变化,您有理由重新插入信号。要进行重新插入,你需要一个非常好的“时钟”来告诉你每个样本何时到达。我很确定PC中内置的时钟不会给你时间戳你需要的精确度......时钟值可能看起来具有良好的精度(即很多数字),但这并不意味着这是准确的,因为它可以在每个样品到达时立即为您提供准确的时间。我认为那里存在很多变化。这种可变性可能意味着您的重新插值会损坏信号,就像修复信号一样。