在 MATLAB 中过滤(或制定算法?)非常 noisy/spikey 个位置数据
Filtering (or making an algorithm?) for very noisy/spikey position data in MATLAB
现在最长的时间里,我一直在努力为我从电位计(5K 线性电位计,如果重要的话以 500 Hz 采样)收集的一些数据过滤或开发算法。这里有两个样本集:
1) http://cl.ly/1N2716032h24?_ga=1.52620968.1407169386.1426657565
2) http://cl.ly/032K0M3f2q2Y?_ga=1.52620968.1407169386.1426657565
如您所见,数据中有许多尖峰,但它正在加剧,因为我可以看到它应该是什么样子。我可以看到它只是尖峰发生位置的 "minimum"(也许称之为基线?我不确定)。基本上,如果这些尖峰与相邻数据的其余部分一起下降,很明显我会得到正确的输出,因为它在大多数情况下应该只是线性增加和减少。我希望这是有道理的。
有什么办法可以过滤这个,或者开发某种算法吗?我似乎什么都做不了——我最近尝试的是中值过滤器,但在这个过程中我丢失了数据的形状。无论如何我可以将它过滤成它显然应该是什么样子的吗?我真的很感激任何帮助。
这个问题类似于神经科学家的经典问题,他们经常想从嘈杂、缓慢波动的背景中检测尖峰。这个问题有很多解决方案,其中最基本的(但非常有效!)是在滑动 window.
上使用 prctile
函数
这是一个尝试,我计算了基线 BL
,然后只保留离基线较近的点:
% --- Parameters
w = 5; % Half-width of the sliding window
th = 25; % Threshold for closiness to the baseline
% --- Load and plot data
a = load('pos1.mat');
x = 1:numel(a.pos1);
y = a.pos1;
plot(x, y, '.');
hold on
% --- Find the baseline
BL = y*NaN;
for i = 1:numel(x)
i1 = max(1,x(i)-w);
i2 = min(x(i)+w, numel(x));
BL(i) = prctile(y(i1:i2), 25);
end
plot(x, BL, 'r-');
% --- Select the points close to the baseline
I = abs(BL-y)<=th;
scatter(x(I), y(I), '+');
结果:
然后,根据您的需要,您可以仅保留这些数据点或进行插值以获得缺失值。
最佳,
现在最长的时间里,我一直在努力为我从电位计(5K 线性电位计,如果重要的话以 500 Hz 采样)收集的一些数据过滤或开发算法。这里有两个样本集:
1) http://cl.ly/1N2716032h24?_ga=1.52620968.1407169386.1426657565
2) http://cl.ly/032K0M3f2q2Y?_ga=1.52620968.1407169386.1426657565
如您所见,数据中有许多尖峰,但它正在加剧,因为我可以看到它应该是什么样子。我可以看到它只是尖峰发生位置的 "minimum"(也许称之为基线?我不确定)。基本上,如果这些尖峰与相邻数据的其余部分一起下降,很明显我会得到正确的输出,因为它在大多数情况下应该只是线性增加和减少。我希望这是有道理的。 有什么办法可以过滤这个,或者开发某种算法吗?我似乎什么都做不了——我最近尝试的是中值过滤器,但在这个过程中我丢失了数据的形状。无论如何我可以将它过滤成它显然应该是什么样子的吗?我真的很感激任何帮助。
这个问题类似于神经科学家的经典问题,他们经常想从嘈杂、缓慢波动的背景中检测尖峰。这个问题有很多解决方案,其中最基本的(但非常有效!)是在滑动 window.
上使用prctile
函数
这是一个尝试,我计算了基线 BL
,然后只保留离基线较近的点:
% --- Parameters
w = 5; % Half-width of the sliding window
th = 25; % Threshold for closiness to the baseline
% --- Load and plot data
a = load('pos1.mat');
x = 1:numel(a.pos1);
y = a.pos1;
plot(x, y, '.');
hold on
% --- Find the baseline
BL = y*NaN;
for i = 1:numel(x)
i1 = max(1,x(i)-w);
i2 = min(x(i)+w, numel(x));
BL(i) = prctile(y(i1:i2), 25);
end
plot(x, BL, 'r-');
% --- Select the points close to the baseline
I = abs(BL-y)<=th;
scatter(x(I), y(I), '+');
结果:
然后,根据您的需要,您可以仅保留这些数据点或进行插值以获得缺失值。
最佳,