1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- % RES = STEER(BASIS, ANGLE, HARMONICS, STEERMTX)
- %
- % Steer BASIS to the specfied ANGLE.
- %
- % BASIS should be a matrix whose columns are vectorized rotated copies of a
- % steerable function, or the responses of a set of steerable filters.
- %
- % ANGLE can be a scalar, or a column vector the size of the basis.
- %
- % HARMONICS (optional, default is N even or odd low frequencies, as for
- % derivative filters) should be a list of harmonic numbers indicating
- % the angular harmonic content of the basis.
- %
- % STEERMTX (optional, default assumes cosine phase harmonic components,
- % and filter positions at 2pi*n/N) should be a matrix which maps
- % the filters onto Fourier series components (ordered [cos0 cos1 sin1
- % cos2 sin2 ... sinN]). See steer2HarmMtx.m
- % Eero Simoncelli, 7/96.
- function res = steer(basis,angle,harmonics,steermtx)
- num = size(basis,2);
- if ( any(size(angle) ~= [size(basis,1) 1]) & any(size(angle) ~= [1 1]) )
- error('ANGLE must be a scalar, or a column vector the size of the basis elements');
- end
- %% If HARMONICS are not passed, assume derivatives.
- if (exist('harmonics') ~= 1)
- if (mod(num,2) == 0)
- harmonics = [0:(num/2)-1]'*2 + 1;
- else
- harmonics = [0:(num-1)/2]'*2;
- end
- else
- harmonics = harmonics(:);
- if ((2*size(harmonics,1)-any(harmonics == 0)) ~= num)
- error('harmonics list is incompatible with basis size');
- end
- end
- %% If STEERMTX not passed, assume evenly distributed cosine-phase filters:
- if (exist('steermtx') ~= 1)
- steermtx = steer2HarmMtx(harmonics, pi*[0:num-1]/num, 'even');
- end
- steervect = zeros(size(angle,1),num);
- arg = angle * harmonics(find(harmonics~=0))';
- if (all(harmonics))
- steervect(:, 1:2:num) = cos(arg);
- steervect(:, 2:2:num) = sin(arg);
- else
- steervect(:, 1) = ones(size(arg,1),1);
- steervect(:, 2:2:num) = cos(arg);
- steervect(:, 3:2:num) = sin(arg);
- end
- steervect = steervect * steermtx;
- if (size(steervect,1) > 1)
- tmp = basis' .* steervect';
- res = sum(tmp)';
- else
- res = basis * steervect';
- end
-
-
|