% Chan 算法,利用3BS对MS进行定位;
% CHAN_3BS:
% 参数说明:
% Noise: 测距误差方差.
% R: 小区半径.
% Also see: Chan_3BS.
% 参数检测:
if nargout ~=1,
error('Too many output arguments!')
end
if nargin ~= 3,
error('input arguments error!')
end
% 算法开始
MS = R*MSP
BS = R*NetworkTop(3)
% A矩阵:
X21 = BS(1,2) - BS(1,1)
X31 = BS(1,3) - BS(1,1)
Y21 = BS(2,2) - BS(2,1)
Y31 = BS(2,3) - BS(2,1)
A = inv([X21,Y21X31,Y31])
% B矩阵:
R1 = sqrt((BS(1,1) - MS(1))^2 + (BS(2,1) - MS(2))^2)
R2 = sqrt((BS(1,2) - MS(1))^2 + (BS(2,2) - MS(2))^2)
R3 = sqrt((BS(1,3) - MS(1))^2 + (BS(2,3) - MS(2))^2)
R21 = R2 - R1 + MeaNoise(Noise) % 需要加噪声
R31 = R3 - R1 + MeaNoise(Noise)
B = [R21R31]
% C矩阵:
K1 = BS(1,1)^2 + BS(2,1)^2
K2 = BS(1,2)^2 + BS(2,2)^2
K3 = BS(1,3)^2 + BS(2,3)^2
C = 0.5*[R21^2 - K2 + K1R31^2 - K3 + K1]
% 一元二次方程的系数:
a = B'*A'*A*B - 1
b = B'*A'*A*C + C'*A'*A*B
c = C'*A'*A*C
% 方程的两个根:
root1 = abs((-b + sqrt(b^2 - 4*a*c))/(2*a))
root2 = abs((-b - sqrt(b^2 - 4*a*c))/(2*a))
% 检验方程的根:
if root1 <R,
EMS = -A*(B*root1 + C)
else
EMS = -A*(B*root2 + C)
end
% 输出结果:
if nargout == 1,
X = EMS
else
disp(EMS)
end
应该不是因为对参数有特殊要求,例如,我运行下面的代码就没任何问题:
chan = rayleighchan(0.1,0)x = rand(1,2240)
y = filter(chan,x)
从你说的错误看,应该是rayleighchan函数出错,与后面的filter函数无关。rayleighchan的代码很短,除注释外,一共就以下几句(可能与具体版本有关,我的是R2008b):
error(nargchk(0, 4, nargin,'struct'))if nargin==1
error('comm:rayleighchan:numargs', ...
'Number of arguments must be 0, 2, 3, or 4.')
end
chan = channel.rayleigh(varargin{:})
前面几句是参数检查,真正的有效代码只有最后面一句,所调用的函数为
[MATLABROOT]\toolbox\comm\comm\@channel\@rayleigh\rayleigh.m
请检查你的MATLAB有没有这个文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)