Skip to content

Commit 2c8d65f

Browse files
committed
improved convolution -> no more risk of wraparound
1 parent db70721 commit 2c8d65f

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

code/matlab/IRM.m

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ function create_timecourse(self,FUN,xdata)
194194
n_observations(p)) + 1;
195195
end
196196

197-
tc = zeros(self.n_samples,self.n_points);
197+
tc = zeros(self.n_samples + self.l_hrf,self.n_points);
198198
x = zeros(self.n_predictors,1);
199199
for j=1:self.n_points
200200
for p=1:self.n_predictors
201201
x(p) = self.xdata{p}(self.idx(j,p));
202202
end
203-
tc(:,j) = FUN(self.stimulus,x);
203+
tc(1:self.n_samples,j) = FUN(self.stimulus,x);
204204

205205
progress(j / self.n_points * 20);
206206
end
@@ -258,9 +258,9 @@ function create_timecourse(self,FUN,xdata)
258258

259259
if size(self.hrf,2)==1
260260
hrf_fft = fft([self.hrf;...
261-
zeros(self.n_samples-self.l_hrf,1)]);
262-
tc = zscore(ifft(self.tc_fft.*hrf_fft))';
263-
261+
zeros(self.n_samples,1)]);
262+
tc = ifft(self.tc_fft.*hrf_fft);
263+
tc = zscore(tc(1:self.n_samples, :))';
264264
mag_tc = sqrt(sum(tc.^2,2));
265265
for m=1:n_voxels
266266
v = voxel_index(m);
@@ -278,11 +278,12 @@ function create_timecourse(self,FUN,xdata)
278278
end
279279
else
280280
hrf_fft_all = fft([self.hrf(:,mask);...
281-
zeros(self.n_samples-self.l_hrf,n_voxels)]);
281+
zeros(self.n_samples,n_voxels)]);
282282
for m=1:n_voxels
283283
v = voxel_index(m);
284284

285-
tc = zscore(ifft(self.tc_fft.*hrf_fft_all(:,m)))';
285+
tc = ifft(self.tc_fft.*hrf_fft_all(:,m));
286+
tc = zscore(tc(1:self.n_samples, :))';
286287
mag_tc = sqrt(sum(tc.^2,2));
287288

288289
CS = (tc*data(:,m))./...

code/matlab/pRF.m

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ function set_stimulus(self,stimulus)
184184
else
185185
self.stimulus = stimulus;
186186
end
187+
self.stimulus = [self.stimulus,...
188+
zeros(self.r_stimulus^2, self.l_hrf)];
187189
end
188190

189191
function import_stimulus(self)
@@ -218,6 +220,9 @@ function import_stimulus(self)
218220
self.stimulus = (reshape(self.stimulus,...
219221
self.r_stimulus^2,...
220222
self.n_samples)-mn)/range;
223+
224+
self.stimulus = [self.stimulus,...
225+
zeros(self.r_stimulus^2, self.l_hrf)];
221226
end
222227

223228
function create_timecourses(self,varargin)
@@ -350,9 +355,10 @@ function create_timecourses(self,varargin)
350355

351356
if size(self.hrf,2)==1
352357
hrf_fft = fft(repmat([self.hrf;...
353-
zeros(self.n_samples-self.l_hrf,1)],...
358+
zeros(self.n_samples,1)],...
354359
[1,self.n_points]));
355-
tc = zscore(ifft(self.tc_fft.*hrf_fft))';
360+
tc = ifft(self.tc_fft.*hrf_fft);
361+
tc = zscore(tc(1:self.n_samples, :))';
356362
mag_tc = sqrt(sum(tc.^2,2));
357363
for m=1:n_voxels
358364
v = voxel_index(m);
@@ -373,11 +379,12 @@ function create_timecourses(self,varargin)
373379
end
374380
else
375381
hrf_fft_all = fft([self.hrf(:,mask);...
376-
zeros(self.n_samples-self.l_hrf,n_voxels)]);
382+
zeros(self.n_samples,n_voxels)]);
377383
for m=1:n_voxels
378384
v = voxel_index(m);
379385

380-
tc = zscore(ifft(self.tc_fft.*hrf_fft_all(:,m)))';
386+
tc = ifft(self.tc_fft.*hrf_fft_all(:,m));
387+
tc = zscore(tc(1:self.n_samples, :))';
381388
mag_tc = sqrt(sum(tc.^2,2));
382389

383390
CS = (tc*data(:,m))./...

0 commit comments

Comments
 (0)