Matlab中隐式趋势线的去除

Matlab中隐式趋势线的去除,matlab,signal-processing,interpolation,normalization,Matlab,Signal Processing,Interpolation,Normalization,我有2[T,1]个向量,表示老鼠在几次试验中在线性轨道上来回奔跑的位置和速度 我的目标是“标准化”速度,这样在每个时间t,新的速度向量将不会反映绝对速度,而是“相对速度”,定义为大鼠在该位置的实际速度与其在该位置的中值(或平均)速度之间的差 这是我当前的代码,但我觉得它非常低效,因为(1)数值复杂性(2)无法“平滑”位置的中间值(3)需要定义分辨率与速度成反比的“网格”: %% NOTE, pos=position ranges from 0 to 420 & dir=direction

我有2[T,1]个向量,表示老鼠在几次试验中在线性轨道上来回奔跑的位置和速度

我的目标是“标准化”速度,这样在每个时间t,新的速度向量将不会反映绝对速度,而是“相对速度”,定义为大鼠在该位置的实际速度与其在该位置的中值(或平均)速度之间的差

这是我当前的代码,但我觉得它非常低效,因为(1)数值复杂性(2)无法“平滑”位置的中间值(3)需要定义分辨率与速度成反比的“网格”:

%% NOTE, pos=position ranges from 0 to 420 & dir=direction & is either 1/-1
med_speed=speed;
grid=linspace(0,max(pos),200);   %make grid of arbitrary spacing
[~,I]=histc(pos,grid);   
tic
for i=1:length(grid)
    I1=I==i & dir==1; I2=I==i & dir==-1;
    med_speed(I1)=median(med_speed(I1)); 
    med_speed(I2)=median(med_speed(I2));
end
toc  
norm_speed=speed-med_speed;

%%Plot
subplot(121), plot(pos,speed);
hold on, plot(pos,med_speed,'r','LineWidth',2), hold off
legend('Velocity','Median Velocity at that Position');
xlabel('Position'); ylabel('Speed'); axis tight
subplot(122), plot(pos,norm_speed)
xlabel('Position'); ylabel('Normalized Speed')    
获得的数字如下

我觉得有一种方法可以通过interp1实现这一点


任何帮助都将不胜感激!Thnx

您可以使用medfilt1,例如

med_speed=medfilt1(speed,10);
将计算贯穿整个时间序列的10个连续样本的中值

不确定您在标准化过程中如何处理尺度,即,通常您会将某一时期的中位数(或平均值)之间的差值除以标准偏差,以考虑数据中不同尺度的可能性。运行平均值和实际值之间的差异可能适用于一只老鼠,但如果要比较n只老鼠,则不适用,因为每只老鼠的基本速度不同