function [PRN] = PRNgen_CA(prn_sequence, prn_num, shift) % PRN C/A sequence generater 10 bit registers % inputs % prn_sequence: 1 + x^3 + X^10 (-1,1) as column vector, % prn_num: PRN number, from 1-10 % shift: number of bits to shift % output % PRN: C/A sequence (-1,1) as column vector % % returns zero if error is detected % David Benson % 7/3/01 % Check for valid input if nargin ~= 3 if nargin == 2 shift = 0; else disp([ 'Error: wrong number of inputs']) PRN = 0; return end end n = 10; % number of bits in register switch prn_num case 1 tap1 = 2; tap2 = 6; case 2 tap1 = 3; tap2 = 7; case 3 tap1 = 4; tap2 = 8; case 4 tap1 = 5; tap2 = 9; case 5 tap1 = 1; tap2 = 9; case 6 tap1 = 2; tap2 = 10; case 7 tap1 = 1; tap2 = 8; case 8 tap1 = 2; tap2 = 9; case 9 tap1 = 3; tap2 = 10; case 10 tap1 = 2; tap2 = 3; otherwise PRN = 0; disp([' Error: not valid PRN number (1 - 10)']) return end if tap1 == tap2 disp([' Error: Tap locations are the same']) PRN = 0; return elseif ((tap1 > n) | (tap1 < 1) | (tap2 > n) | (tap2 < 1)) disp([' Error: Tap locations out of range']) PRN = 0; return end % initilize variables %register1 = ones(1,n); register2 = ones(1,n); epochcheck = zeros(1,n); count = 0; % run loop until all ones are found in the register while sum(epochcheck) ~= n % add counter count = count + 1; % check XOR logic circuit on first register %o1 = xor(register1(3), register1(10)); % check XOR logic circuit on second register o2 = xor(register2(2),xor(register2(3),xor(register2(6),xor(register2(8),xor(register2(9),register2(10)))))); % Save final PRN sequence if prn_sequence(count) == 1 reg1 = 0; else reg1 = 1; end PRN(count,:) = xor(reg1, xor(register2(tap1), register2(tap2))); % shift values for i = (n-1):-1:1 %register1(i+1) = register1(i); register2(i+1) = register2(i); end %register1(1) = o1; register2(1) = o2; % epoch chech epochcheck = register2; % check for too long of a sequence if count == 2^n break end end % check if PRN sequence is max length if count ~= (2^n - 1) disp([' Warning: PRN sequence is not max length']) end % check shift range if shift >= count disp([' Error: shift out of range']) PRN = 0; return end % shift PRN sequence if shift < 0 shift = -shift; PRNtemp = PRN((shift+1):end); PRNtemp = [PRNtemp; PRN(1:shift)]; PRN = PRNtemp; elseif shift > 0 shift = count - shift; PRNtemp = PRN((shift+1):end); PRNtemp = [PRNtemp; PRN(1:shift)]; PRN = PRNtemp; end % reset high/low values to -1/1 for i = 1:length(PRN) if PRN(i) == 1 PRNtemp(i,:) = -1; else PRNtemp(i,:) = 1; end end PRN = PRNtemp;