%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% Generates set of receptive fields with specific frequency
%%% and orientation distribution.
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function basis = BaseGenerator(saveBasis, displayBasis, base_size, base_num)
s=base_size;
n=base_num;
sigma=2.5; % sigma of gaussian envelop of gabor patch
a=[];
for i=1:n
orient=rand()*180; % orientation measured from horizontal axis anticlockwise in degrees
theta=rand()*360; % phase shift of sin wave in degrees
lambda = rand()*s*5/3+s*1/3; % wavelength of sin wave in px - uniform lambda distribution results in 1/f^2 freq. distribution
shift_x=rand()*s*2/3-s*1/3; % shift wavelet away from patch center
shift_y=rand()*s*2/3-s*1/3;
delta_orient=2;
while(abs(delta_orient)>=1)
delta_orient=laprnd(1, 1, 0, 0.5);
end
delta_orient=delta_orient*90;
dispa=2;
while(abs(dispa)>=1)
dispa=laprnd(1, 1, 0, 1);
end
dispa=dispa*s/8;
p=0.35; % set balance of eye dominance. positive values equal left monocular bias
corr=2; % sets balance between left and right eye receptive subfield., -1=right monocular, 1=left monocular
while(abs(corr)>=1)
corr=normrnd(p,0.4);
end
% generate receptive field
base_l = Gabor(sigma,orient,lambda,theta,lambda/(0.8*s),s,[shift_x shift_y],+dispa);
base_r = Gabor(sigma,orient+delta_orient,lambda,theta,lambda/(0.8*s),s,[shift_x shift_y],-dispa);
%normalize left and right part of base
base_l=base_l(:)-mean(base_l(:)); % zero mean
base_r=base_r(:)-mean(base_r(:));
base_l=base_l/sqrt(sum(base_l.^2)); % normalize to unit norm
base_r=base_r/sqrt(sum(base_r.^2));
base=[(1+corr)*base_l(:);(1-corr)*base_r(:)]; % the more dissimilar left and right patch are the more monocular the RF becomes
a=[a, base]; % add receptive field to collection
end
basis=a;
basis=bsxfun(@rdivide,basis,sqrt(sum(basis.^2))); % normalize to unit norm, joint left and right subfield
if saveBasis
save('basis.mat','basis');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% Display Receptive Fields that have been generated
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if displayBasis
%####################################
orange=[255 153 24]./255;
blue=[39 48 73]./255;
green=[146 208 80]./255;
lightblue=[70 166 199]./255;
purple=[139 84 166]./255;
brown=[167 121 29]./255;
gray=[80 80 80]/255;
bgcolor= [255 255 255]./255;
%####################################
basisDisp = basis(:,:);
s=sqrt(size(basisDisp,1)/2);
n=size(basisDisp,2);
block=mat2gray(col2im(basisDisp,[s 2*s],[n*s 2*s],'distinct'));
M=10; % number of bases displayed in one row
N=5; % maximum number of rows to plot
k=1;
pic=[];
for j=1:N
row=[];
for i=1:M
base_l=block(1+(k-1)*s:k*s,1:s);
base_r=block(1+(k-1)*s:k*s,s+1:2*s);
brick=[-ones(1,s); base_l; -ones(1,s); base_r; -ones(1,s)]; %left receptive field part on top, right receptive field at bottom
brick=[-ones(2*s+3,1) brick -ones(2*s+3,1)];
row=[row brick];
k=k+1;
end
pic=[pic;row];
end
% %add frame
% pic=[-ones(size(pic,1),1) pic -ones(size(pic,1),1)];
% pic=[-ones(1,size(pic,2)); pic; -ones(1,size(pic,2))];
imshow(pic);
%colorize
red = pic;
green = pic;
blue = pic;
red(red==-1)= bgcolor(1);
green(green==-1)= bgcolor(2);
blue(blue==-1)= bgcolor(3);
test = zeros(size(pic,1),size(pic,2),3);
test(:,:,1)=red;
test(:,:,2)=green;
test(:,:,3)=blue;
imshow(test)
end