%%粒子群算法
clear; clc;
%%初始化序列参数
RegCoff = [13,4,3,1] ;
RegLen = max(RegCoff) ;
CodeLen = 500 ; %序列长度
InitPhase = zeros(1,RegLen) ;
InitPhase(1) = 1 ;
mCode = CodeCreat(RegCoff, CodeLen, InitPhase) ; %产生m序列0,1
Rslt = zeros(3,6) ;
for counter = 1:3
CtrlNum = counter*4 ; %抽头数4,8,12
AcqRatio = zeros(1,6) ; %成功捕获概率
for counter1 = 1:6
Ec2No = counter1 - 6 ; % dB
No = 1 ; % No/2 为噪声的功率谱密度
Ec = 10^(Ec2No/10)*No ; %码元能量
MU = 0 ; %高斯噪声的均值
SIGMA = 1/(2*Ec/No) ; %高斯噪声的方差
RepeatNum = 100; RegAcqErr = zeros(1,RepeatNum) ;
for RepeatCount = 1:RepeatNum
RecMCode = MCodeIntel(mCode,MU,SIGMA) ;
[PhaseRslt,vCurt] = AcquCodeInv(RecMCode,RegCoff,InitPhase,CtrlNum) ;
% vCurt = vCurt/max(RegCoff) ;
RegAcqErr(RepeatCount) = symerr(sgn(PhaseRslt), -2*InitPhase+1) ;
end
AcqRatio(counter1) = length(find(RegAcqErr==0))/RepeatNum;
end
Rslt(counter,:) = AcqRatio;
end
function [PhaseRslt,vCurtInv] = AcquCodeInv(RecMCode,OrderRe,InitPhase,CtrlNum)
vLen = length(InitPhase) ;
vCodeLen = length(RecMCode) ;
Number = vCodeLen-3*vLen ;
vCurtInv = zeros(1, Number) ;
% vCtrlState = zeros(1,vLen) ;
% vTempCodeSect = zeros(1,vLen) ;
%%控制抽头
InvOrderRe = vLen - OrderRe ;
InvOrderRe( find(InvOrderRe==0) ) = vLen ;
InvOrderRe = fliplr( sort(InvOrderRe) ) ;
OriCtrlReg = eye(vLen) ;
% RelaCtrlReg = zeros(1,vLen) ;
for vCounter = 1:vLen-1
[OriCtrlReg,RelaCtrlReg] = CtrlRegRenew(OriCtrlReg,InvOrderRe) ;
end
%%初始状态
% PhaseRslt = RecMCode(1:vLen) ;
PhaseRslt = zeros(1,vLen) ;
%进行捕获
for vCounter = 1:Number
%产生(更新)控制状态
[OriCtrlReg,RelaCtrlReg] = CtrlRegRenew(OriCtrlReg,InvOrderRe) ;
% 计算累加符号
for vCounter1 = 1:vLen
vTempIndex = vLen+vCounter+vCounter1-1 ;
vTempCodeSect = RecMCode( vTempIndex:(vTempIndex+vLen-1) ) ;
vTempCodeSect = fliplr( vTempCodeSect ) ;
vTempIndexVec = find( RelaCtrlReg==1 ) ;
vTempIncream = prod( vTempCodeSect(vTempIndexVec) ) ;
vTempSign = 1 ;
if vTempIncream<0
vTempSign = -1 ;
end
if length(vTempIndexVec)<=CtrlNum
vTempIncream = abs(vTempIncream)^(1/(length(vTempIndexVec)) ) ;
PhaseRslt(vCounter1) = PhaseRslt(vCounter1) + vTempSign*vTempIncream ;
%( length(vTempIndexVec) )^1.5 ;
end
end
%统计成功率
vCurtInv(vCounter) = vLen - symerr(sgn(PhaseRslt(1:vLen)),-2*InitPhase+1) ;
end
评论1