【问题标题】:Extracting parts of varying length from time series从时间序列中提取不同长度的部分
【发布时间】:2014-09-04 12:23:45
【问题描述】:

我有一个很长的时间序列文件(以毫秒为单位记录),我需要从中提取不同长度的部分(基于来自不同数组/文件的值)。

时间序列文件 (data2.txt) 是从 EEGLab 工具箱中导出的,因为我需要尝试自定义分析。它有两列(第 1 列:以毫秒为单位的时间,第 2 列:来自 EEG 记录的值) - 见下文。 我以与 data2.txt 相同的格式将时代的时间(开始和结束)存储在不同的文件(epochs.txt:第一列 - 开始,第二列 - 结束)中em>。

我的文件 (data2.txt) 如下所示:

0.0000  -126.2498
1.9531  -91.8123
3.9063  -130.7185
5.8594  -67.2498
7.8125  -77.6560
9.7656  -83.0623
11.7188 -74.0310
13.6719 -110.4685
15.6250 -130.4373
17.5781 -143.4060
19.5313 -155.7498

我需要从部分时间序列中提取值(时间保存在外部文件 - epochs.txt)并将它们保存到另一个文件中。

我已将时代的时间(开始和结束)存储在不同的文件中(epochs.txt:第一列 - 开始,第二列 - 结束)。 epochs.txt 中的值可能并不总是与 data2.txt 中的相同,例如: (可以插值吗?)

2.391391554 5.381023353
6.129570888 7.39010542
10.65197062 12.96686866
14.47654996 17.31346859
17.84561721 18.88671436
22.3857703  23.25648467

文件在加载和打印时看起来很好:

EEG_data = importdata('C:\Users\Me\Desktop\data2.txt');
figure
plot(EEG_data(:,1), EEG_data(:,2));

我猜 Matlab 将我的文件视为 2×N 矩阵而不是时间序列,但我不确定如何更改它。我尝试将 EEG_data 转换为时间序列并提取相应的值,但我失败了。

我想获得包含两列(第一:时间,第二:脑电图值)的输出 (output.txt),下面可能的输出基于epochs.txtoutput.txt 的第一列),第二列是猜测的。 我不确定获得介于两者之间的值的最佳方法是什么。

2.391391554 -90.381023353
.
.
.
5.381023353 -75.96686866

任何想法如何解决这个问题?

【问题讨论】:

  • 不清楚你在问什么。一切似乎都很好。你到底做错了什么?
  • 我需要根据 epochs 中的时间(开始/结束)从 data2.txt 的第二列(第一列是时间)中提取值.txt。我不知道该怎么做。
  • @Memming epochs2.txt 的行是对应于data2.txt 的第一列的开始和结束时间,然后应该使用它来选择data2.txt 的第二列的值。主要问题似乎是时间不完全匹配,因此需要对值进行插值。
  • 问题是如何将非均匀采样的时间序列转换为另一个非均匀的时间网格?我建议您更新问题的标题。
  • 我认为如果您的信号是带限的(已知最高频率分量),并且您的非均匀采样高于广义奈奎斯特极限,您可以通过低-通过过滤。这是你想知道的吗?

标签: matlab time time-series


【解决方案1】:

基于 cmets,这里有一些代码可以帮助您入门。我使用以下数据来避免处理 start_index == end_index 的空切片。您可能需要添加一些代码来检查这种情况和其他有问题的情况。

epochs.txt

2.391391554 9.381023353
11.65197062 18.96686866

data2.txt

0.0000  -126.2498
1.9531  -91.8123
3.9063  -130.7185
5.8594  -67.2498
7.8125  -77.6560
9.7656  -83.0623
11.7188 -74.0310
13.6719 -110.4685
15.6250 -130.4373
17.5781 -143.4060
19.5313 -155.7498

代码

EEG_data = importdata('data2.txt');
epochs = importdata('epochs.txt');

output = zeros(0, 2);
for i = 1:size(epochs, 1)
    % extract an epoch from the EEG data
    start_time = epochs(i, 1);
    end_time = epochs(i, 2);

    % find corresponding indices
    % http://stackoverflow.com/q/3593717/553404
    start_index = find(EEG_data(:, 1) > start_time, 1);
    end_index = find(EEG_data(:, 1) > end_time, 1) - 1;

    % slice the required data for the epoch
    epoch_data = EEG_data(start_index:end_index, :);

    % append to output
    output = [output; epoch_data];
end

【讨论】:

  • 谢谢。奇迹般有效。我添加了 save(['epoch',num2str(i)],'epoch_data');将每个纪元保存在一个单独的文件中(我必须对其进行规范化)。
  • 没问题,很高兴它有帮助:)
猜你喜欢
  • 2018-12-01
  • 2022-07-06
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多