function [a,e,k] = aryule( x, p)
narginchk(2,2)
p = signal.internal.sigcasttofloat(p,'double','aryule','ORDER',...
'allownumeric');
isXsingle = signal.internal.sigcheckfloattype(x,'single','aryule','X');
if isvector(x)
x = x(:);
end
validateattributes(x,{'numeric'},{'nonempty','finite','2d'},'arburg','X');
if size(x,1) < p
if isvector(x)
error(message('signal:aryule:InvalidVectorLength'));
else
error(message('signal:aryule:InvalidNumberOfRows'));
end
elseif isempty(p) || ~(p == round(p))
error(message('signal:aryule:MustBeInteger'))
end
if issparse(x)
error(message('signal:aryule:Sparse'))
end
a = zeros(size(x,2),p+1);
e = zeros(1,size(x,2));
k = zeros(p,size(x,2));
for chan = 1:size(x,2)
R = xcorr(x(:,chan),p,'biased');
% LEVINSON does not support 'R' of data type 'Single'. Hence this cast.
R = double(R);
[a(chan,:),e(chan),k(:,chan)] = levinson(R(p+1:end),p);
end
% Cast to enforce precision rules
if isXsingle
a = single(a);
e = single(e);
k = single(k);
end
评论1