-
Notifications
You must be signed in to change notification settings - Fork 0
/
filt_pos.m
127 lines (75 loc) · 3.3 KB
/
filt_pos.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function [FigPosN, FigPos] = filt_pos(posData, Vel, Direction)
% Filter position data
% DAQ sampling rate
Ds = 1000;
% filter data
Fc = 3.*Vel; % signal is at 10, 20, or 30fps
[b, a] = butter(2, Fc/(Ds/2),'low');
posDataFilt = filtfilt(b, a, posData);
% clean up posdata
% find where jumps from 5 to 0V are
dpos = abs(diff(posData));
dpos(dpos < 1) = 0;
[pks, pind] = findpeaks(dpos, 'MINPEAKHEIGHT', 1);
% make sure that display didn't freeze for entire trial
if ~isempty(pind) == 1
dpos = abs(diff(posDataFilt));
[pks, sind] = findpeaks(dpos, 'MINPEAKHEIGHT', 0.0015*Vel/10, 'MINPEAKDISTANCE', round(Ds.*(1/Vel/2)));
mm = 1;
% save first position
FigPos = nan(length(posDataFilt),1);
FigPos(1:sind(1)) = mean(posDataFilt(2:(Ds*0.1)+1));
% clean-up position data
for kk = 1:length(sind)-1
if abs(pind(mm)-sind(kk)) <= round(Ds.*(1/Vel/2)) % if current peak close to transition
if Direction == 1 % clockwise
FigPos(sind(kk):sind(kk+1)) = 5/96; % at transition, force to zero
elseif Direction == -1 % counterclockwise
FigPos(sind(kk):sind(kk+1)) = 5; % at transition, force to 5V
end
if mm < length(pind)
mm = mm + 1;
else
mm = length(pind);
end
else
if Direction == 1 %clockwise
FigPos(sind(kk):sind(kk+1)) = FigPos(sind(kk)-1) + 5/96; % add step
elseif Direction == -1 %counterclockwise
FigPos(sind(kk):sind(kk+1)) = FigPos(sind(kk)-1) - 5/96; % substract step
end
end
end
% add end
FigPos(sind(kk+1):end) = FigPos(sind(kk));
% convert V to angle
v2s = 96/5; % 96 positions over 5V
% s = 3.75; % 3.75 deg per step
FigPos = FigPos .* v2s; % convert to steps
% CLEAN UP
dposN = abs(diff(FigPos));
[pks, ssind] = findpeaks(dposN, 'MINPEAKHEIGHT', .1*Vel/10, 'MINPEAKDISTANCE', round(Ds.*(1/Vel/2)));
FigPosN = nan(length(FigPos),1);
% save first position, dont allow 0
if FigPos(1) < 1
FigPosN(1:ssind(1)) = 1;
else
FigPosN(1:ssind(1)) = round(FigPos(1));
end
% for each step
for kk = 1:length(ssind)-1
if Direction == 1 %clockwise
FigPosN(ssind(kk):ssind(kk+1)) = FigPosN(ssind(kk)-1) + 1; % add step
if FigPosN(ssind(kk)) >= 96
FigPosN(ssind(kk):ssind(kk+1)) = 1;
end
elseif Direction == -1 %counterclockwise
FigPosN(ssind(kk):ssind(kk+1)) = FigPosN(ssind(kk)-1) - 1; % substract step
if FigPosN(ssind(kk)) < 1
FigPosN(ssind(kk):ssind(kk+1)) = 96;
end
end
end
% add end
FigPosN(ssind(kk+1):end) = FigPosN(ssind(kk));
end