www.gusucode.com > LTE仿真Matlab源码 > LTE_common_gen_Synchronization_Signal.m

    function[PrimSync, PrimMapping, SecSync, SecMapping, SyncUsedElements,ReservedMapping,ResUsedElements,ResNElements] = LTE_common_gen_Synchronization_Signal(NIDcell, Nrb, Nsc,Ns,subframe)
% Synchronization signal generation and mapping
% Generation and Mapping based on one subframe slot of 1 ms, 3GPP TS 36.211 V.8.2.0 section 6.11
% [PrimSync, PrimMapping, SecSync, SecMapping] = LTE_Common_gen_Synchronization_Signal(NIDcell, Nrb, Nsc,Ns,subframe)
% Author: Qi Wang, qwang@nt.tuwien.ac.at
% (c) 2008 by INTHFT
% www.nt.tuwien.ac.at
%
% input :   NIDcell             ... [1 x 1]double cell identity
%           Nrb                 ... [1 x 1]double number of resource blocks
%           Nsc                 ... [1 x 1]double number of subcarriers in one resource block
%           Ns                  ... [1 x 1]double number of OFDM symbols in one slot
%           subframe            ... [1 x 1]double number of the subframe transmitted             
% output:   PrimSync            ... [62 x 1]double generated primary synchronization signals
%           PrimMapping         ... [LTE_params.Nsc*Nrb x 2*Ns]logical mapping matrix
%           SecSync             ... [62 x 1]double generated primary synchronization signals
%           SecMapping          ... [LTE_params.Nsc*Nrb x 2*Ns]logical mapping matrix
%
% date of creation: 2008/08/11
% last changes: 2008/09/03  Bosanska    added output SyncUsedElements for multi-
%                                       -user implementation and resource mapping

NID1 = floor(NIDcell/3);
NID2 = mod(NIDcell,3);

%% Primary synchronization signal
switch NID2
    case 0 
        u = 25;
    case 1
        u = 29;
    case 2
        u = 34;
    otherwise
         error('invalid NID2.');
end
PrimSync_temp = zeros(31,2);
for n=1:31
    PrimSync_temp(n,1) = exp(-1i*pi*u*(n-1)*n/63);
    PrimSync_temp(n,2) = exp(-1i*pi*u*(n+31)*(n+32)/63);
end

PrimSync = reshape(PrimSync_temp,62,[]);

% Primary synchronization signal mapping and used resource elements per
% resource blocks
PrimMapping = false(Nrb*Nsc,Ns);
SyncUsedElements = zeros(Nrb,2);
k = zeros(62,1);
for n=1:62
    k(n)=n-32+Nrb*Nsc/2;
end
k = k+1;    % corrected to matlab indices (zero excluded) - without this the Synchronisationsignal is not exactly in the middle
PrimMapping(k,Ns/2)=1;

SyncUsedElements(ceil(k(1)/Nsc),1) = 2*(ceil(k(1)/Nsc)*Nsc-k(1)+1);
% SyncUsedElements(ceil(k(1)/Nsc),1) = 2*(ceil(k(1)/Nsc)*Nsc-k(1)+1);
if(mod(k(end),Nsc) == 0)
    SyncUsedElements(ceil(k(1)/Nsc)+1:ceil(k(end)/Nsc),1) = 2*12;
else
    SyncUsedElements(ceil(k(1)/Nsc)+1:ceil(k(end)/Nsc)-1,1) = 2*12;
    SyncUsedElements(ceil(k(end)/Nsc),1) = 2*12-2*(ceil(k(end)/Nsc)*Nsc-k(end));
%     SyncUsedElements(ceil(k(end)/Nsc),1) = 2*(ceil(k(end)/Nsc)*Nsc-k(end));
end

%% Secondary synchronization signal
qq = floor(NID1/30);
q = floor((NID1+qq*(qq+1)/2)/30);
mm = NID1+q*(q+1)/2;
m0 = mod(mm,31);
m1 = mod(m0+floor(mm/31)+1, 31);

PN_gen = commsrc.pn('GenPoly',       [1 0 0 1 0 1], ...
                     'InitialStates', [1 0 0 0 0],   ...
                     'Shift',         0,   ...
                     'NumBitsOut',    31);
PN_seq_temp = generate(PN_gen).';
PN_seq = 1-2*PN_seq_temp;

SC_gen1 = commsrc.pn('GenPoly',       [1 0 1 0 0 1], ...
                     'InitialStates', [1 0 0 0 0],   ...
                     'Shift',         0,   ...
                     'NumBitsOut',    31);
SC_seq1_temp = generate(SC_gen1).';
SC_seq1 = 1-2*SC_seq1_temp;

SC_gen2 = commsrc.pn('GenPoly',       [1 1 0 1 1 1], ...
                     'InitialStates', [1 0 0 0 0],   ...
                     'Shift',         0,   ...
                     'NumBitsOut',    31);
SC_seq2_temp = generate(SC_gen2).';
SC_seq2 = 1-2*SC_seq2_temp;

SecSync = zeros(62,1);

for n=0:30
    switch subframe
        case 1
            SecSync(2*n+1) = PN_seq(mod(n+m0,31)+1).*SC_seq1(mod(n+NID2, 31)+1);
            SecSync(2*n+2) = PN_seq(mod(n+m1,31)+1).*SC_seq1(mod(n+NID2+3,31)+1).*SC_seq2(mod(n+mod(m0,8),31)+1);
        case 6
            SecSync(2*n+1) = PN_seq(mod(n+m1,31)+1).*SC_seq1(mod(n+NID2, 31)+1);
            SecSync(2*n+2) = PN_seq(mod(n+m0,31)+1).*SC_seq1(mod(n+NID2+3,31)+1).*SC_seq2(mod(n+mod(m1,8),31)+1);
        otherwise     
    end
end

% Secondary synchronization signal mapping
SecMapping = false(Nrb*Nsc,Ns);
k = zeros(62,1);
for n=1:62
    k(n)=n-32+Nrb*Nsc/2;
end
k = k+1;
SecMapping(k,Ns/2-1)=1;
ReservedMapping = zeros(size(SecMapping));
ReservedMapping([k(1)-5:k(1)-1,k(end)+1:k(end)+5],Ns/2-1:Ns/2) = 1;  % this space is reserved to keep ICI low
ResUsedElements = zeros(Nrb*2,1);
for i2 = 1:2
    for i1 = 1:Nrb
        ResUsedElements(i1+(i2-1)*Nrb) = sum(sum(ReservedMapping((i1-1)*Nsc+1:i1*Nsc,(i2-1)*Ns/2+1:Ns/2*i2)));
    end
end
ResNElements = sum(sum(ResUsedElements));