function r_base = get_basesequence(delta, alpha ,m);
%get_basesequence generate base sequences following the 3GPP standards.
% Description:
%   This function aims to generate base sequences following 3GPP TS 38.211 
%   v16.4.0 clause 5.2.2.
%
%	Developer: Jia. Institution: PML. Date: 2021/08/17

M_zc = m * 12 / 2^delta;
r_base_p = getbasesequences( M_zc );
if M_zc/12 >= 1/2 && M_zc/12 <= 5
    r_base = r_base_p(:,:,1) .* exp( 1i* alpha * ( 0: M_zc-1).' );
elseif M_zc/12 >= 6
    r_base = r_base_p .* exp(1i* alpha * ( 0: M_zc-1).' );
end

end
%----------------------------------------------------------
% sub functions
% generate base sequences as shown in TS 38.211 clause 5.2.2.1-2
function r_base_p = getbasesequences( M_zc );
% largest prime number < M_zc
N_zc = max( primes(M_zc) );
if M_zc >= 36
    u = 0 : 29;
    v = permute( (0:1), [1 3 2]);
    n = (0: M_zc-1).';
    q = floor( N_zc * (u +1)/31 +1/2 ) + v .* (-1).^floor(2* N_zc .* (u +1)/31 );
    r_base_p = exp(-1i * (pi * q .* mod(n, N_zc) .* ( mod(n, N_zc) +1 ) /N_zc) );
else % M_zc < 36  v=0 only r_base_p = zeros(M_zc,30,1);
    if any(M_zc == [6 12 18 24])
        phin = get_phin( M_zc );
        r_base_p = exp( 1i* phin * pi/4);
    elseif M_zc == 30
        u = 0 : 29;
        n = 0 : M_zc -1;
        r_base_p = exp(-1i * pi * (u +1) .* (n.' +1) .* (n.' +2) /31 );
    end
end
end

% generate phin as shown in TS 38.211 Table 5.2.2.2
function phin = get_phin( M_zc )
switch M_zc
    case 6
        %dimension M_zc * u
        phin = [ -3 -1 3 3 -1 -3;-3 3 -1 -1 3 -3;-3 -3 -3 3 1 -3;1 1 1 3 -1 -3;...
            1 1 1 -3 -1 3;-3 1 -1 -3 -3 -3;-3 1 3 -3 -3 -3;-3 -1 1 -3 1 -1;...
            -3 -1 -3 1 -3 -3;-3 -3 1 -3 3 -3;-3 1 3 1 -3 -3;-3 -1 -3 1 1 -3;...
            1 1 3 -1 -3 3;1 1 3 3 -1 3;1 1 1 -3 3 -1;1 1 1 -1 3 -3;-3 -1 -1 -1 3 -1;...
            -3 -3 -1 1 -1 -3;-3 -3 -3 1 -3 -1;-3 1 1 -3 -1 -3;-3 3 -3 1 1 -3;...
            -3 1 -3 -3 -3 -1;1 1 -3 3 1 3;1 1 -3 -3 1 -3;1 1 3 -1 3 3;...
            1 1 -3 1 3 3;1 1 -1 -1 3 -1;1 1 -1 3 -1 -1;1 1 -1 3 -3 -1;...
            1 1 -3 1 -1 -1].';
    case 12
        %dimension M_zc * u
        phin = [-3 1 -3 -3 -3 3 -3 -1 1 1 1 -3;-3 3 1 -3 1 3 -1 -1 1 3 3 3;...
            -3 3 3 1 -3 3 -1 1 3 -3 3 -3; -3 -3 -1 3 3 3 -3 3 -3 1 -1 -3;...
            -3 -1 -1 1 3 1 1 -1 1 -1 -3 1; -3 -3 3 1 -3 -3 -3 -1 3 -1 1 3;...
            1 -1 3 -1 -1 -1 -3 -1 1 1 1 -3; -1 -3 3 -1 -3 -3 -3 -1 1 -1 1 -3;...
            -3 -1 3 1 -3 -1 -3 3 1 3 3 1; -3 -1 -1 -3 -3 -1 -3 3 1 3 -1 -3;...
            -3 3 -3 3 3 -3 -1 -1 3 3 1 -3; -3 -1 -3 -1 -1 -3 3 3 -1 -1 1 -3;...
            -3 -1 3 -3 -3 -1 -3 1 -1 -3 3 3; -3 1 -1 -1 3 3 -3 -1 -1 -3 -1 -3;...
            1 3 -3 1 3 3 3 1 -1 1 -1 3; -3 1 3 -1 -1 -3 -3 -1 -1 3 1 -3;...
            -1 -1 -1 -1 1 -3 -1 3 3 -1 -3 1; -1 1 1 -1 1 3 3 -1 -1 -3 1 -3;...
            -3 1 3 3 -1 -1 -3 3 3 -3 3 -3; -3 -3 3 -3 -1 3 3 3 -1 -3 1 -3;...
            3 1 3 1 3 -3 -1 1 3 1 -1 -3; -3 3 1 3 -3 1 1 1 1 3 -3 3;...
            -3 3 3 3 -1 -3 -3 -1 -3 1 3 -3; 3 -1 -3 3 -3 -1 3 3 3 -3 -1 -3;...
            -3 -1 1 -3 1 3 3 3 -1 -3 3 3; -3 3 1 -1 3 3 -3 1 -1 1 -1 1;...
            1 1 3 -3 1 -1 1 -1 -1 -3 1 -1; -3 -3 3 3 3 -3 -1 1 -3 3 1 -3;...
            1 -1 3 1 1 -1 -1 -1 1 3 -3 1; -3 3 -3 3 -3 -3 3 -1 -1 1 3 -3].';
    case 18
        %dimension M_zc * u
        phin = [-1 3 -1 -3 3 1 -3 -1 3 -3 -1 -1 1 1 1 -1 -1 -1;...
            3 -3 3 -1 1 3 -3 -1 -3 -3 -1 -3 3 1 -1 3 -3 3;...
            -3 3 1 -1 -1 3 -3 -1 1 1 1 1 1 -1 3 -1 -3 -1;...
            -3 -3 3 3 3 1 -3 1 3 3 1 -3 -3 3 -1 -3 -1 1;...
            1 1 -1 -1 -3 -1 1 -3 -3 -3 1 -3 -1 -1 1 -1 3 1;...
            3 -3 1 1 3 -1 1 -1 -1 -3 1 1 -1 3 3 -3 3 -1;...
            -3 3 -1 1 3 1 -3 -1 1 1 -3 1 3 3 -1 -3 -3 -3;...
            1 1 -3 3 3 1 3 -3 3 -1 1 1 -1 1 -3 -3 -1 3;...
            -3 1 -3 -3 1 -3 -3 3 1 -3 -1 -3 -3 -3 -1 1 1 3;...
            3 -1 3 1 -3 -3 -1 1 -3 -3 3 3 3 1 3 -3 3 -3;...
            -3 -3 -3 1 -3 3 1 1 3 -3 -3 1 3 -1 3 -3 -3 3;...
            -3 -3 3 3 3 -1 -1 -3 -1 -1 -1 3 1 -3 -3 -1 3 -1;...
            -3 -1 -3 -3 1 1 -1 -3 -1 -3 -1 -1 3 3 -1 3 1 3;...
            1 1 -3 -3 -3 -3 1 3 -3 3 3 1 -3 -1 3 -1 -3 1;...
            -3 3 -1 -3 -1 -3 1 1 -3 -3 -1 -1 3 -3 1 3 1 1;...
            3 1 -3 1 -3 3 3 -1 -3 -3 -1 -3 -3 3 -3 -1 1 3;...
            -3 -1 -3 -1 -3 1 3 -3 -1 3 3 3 1 -1 -3 3 -1 -3;...
            -3 -1 3 3 -1 3 -1 -3 -1 1 -1 -3 -1 -1 -1 3 3 1;...
            -3 1 -3 -1 -1 3 1 -3 -3 -3 -1 -3 -3 1 1 1 -1 -1;...
            3 3 3 -3 -1 -3 -1 3 -1 1 -1 -3 1 -3 -3 -1 3 3;...
            -3 1 1 -3 1 1 3 -3 -1 -3 -1 3 -3 3 -1 -1 -1 -3;...
            1 -3 -1 -3 3 3 -1 -3 1 -3 -3 -1 -3 -1 1 3 3 3;...
            -3 -3 1 -1 -1 1 1 -3 -1 3 3 3 3 -1 3 1 3 1;...
            3 -1 -3 1 -3 -3 -3 3 3 -1 1 -3 -1 3 1 1 3 3;...
            3 -1 -1 1 -3 -1 -3 -1 -3 -3 -1 -3 1 1 1 -3 -3 3;...
            -3 -3 1 -3 3 3 3 -1 3 1 1 -3 -3 -3 3 -3 -1 -1;...
            -3 -1 -1 -3 1 -3 3 -1 -1 -3 3 3 -3 -1 3 -1 -1 -1;...
            -3 -3 3 3 -3 1 3 -1 -3 1 -1 -3 3 -3 -1 -1 -1 3;...
            -1 -3 1 -3 -3 -3 1 1 3 3 -3 3 3 -3 -1 3 -3 1;...
            -3 3 1 -1 -1 -1 -1 1 -1 3 3 -3 -1 1 3 -1 3 -1].';
    case 24
        %dimension M_zc * u
        phin =[-1 -3 3 -1 3 1 3 -1 1 -3 -1 -3 -1 1 3 -3 -1 -3 3 3 3 -3 -3 -3;...
            -1 -3 3 1 1 -3 1 -3 -3 1 -3 -1 -1 3 -3 3 3 3 -3 1 3 3 -3 -3;...
            -1 -3 -3 1 -1 -1 -3 1 3 -1 -3 -1 -1 -3 1 1 3 1 -3 -1 -1 3 -3 -3;...
            1 -3 3 -1 -3 -1 3 3 1 -1 1 1 3 -3 -1 -3 -3 -3 -1 3 -3 -1 -3 -3;...
            -1 3 -3 -3 -1 3 -1 -1 1 3 1 3 -1 -1 -3 1 3 1 -1 -3 1 -1 -3 -3;...
            -3 -1 1 -3 -3 1 1 -3 3 -1 -1 -3 1 3 1 -1 -3 -1 -3 1 -3 -3 -3 -3;...
            -3 3 1 3 -1 1 -3 1 -3 1 -1 -3 -1 -3 -3 -3 -3 -1 -1 -1 1 1 -3 -3;...
            -3 1 3 -1 1 -1 3 -3 3 -1 -3 -1 -3 3 -1 -1 -1 -3 -1 -1 -3 3 3 -3;...
            -3 1 -3 3 -1 -1 -1 -3 3 1 -1 -3 -1 1 3 -1 1 -1 1 -3 -3 -3 -3 -3;...
            1 1 -1 -3 -1 1 1 -3 1 -1 1 -3 3 -3 -3 3 -1 -3 1 3 -3 1 -3 -3;...
            -3 -3 -3 -1 3 -3 3 1 3 1 -3 -1 -1 -3 1 1 3 1 -1 -3 3 1 3 -3;...
            -3 3 -1 3 1 -1 -1 -1 3 3 1 1 1 3 3 1 -3 -3 -1 1 -3 1 3 -3;...
            3 -3 3 -1 -3 1 3 1 -1 -1 -3 -1 3 -3 3 -1 -1 3 3 -3 -3 3 -3 -3;...
            -3 3 -1 3 -1 3 3 1 1 -3 1 3 -3 3 -3 -3 -1 1 3 -3 -1 -1 -3 -3;...
            -3 1 -3 -1 -1 3 1 3 -3 1 -1 3 3 -1 -3 3 -3 -1 -1 -3 -3 -3 3 -3;...
            -3 -1 -1 -3 1 -3 -3 -1 -1 3 -1 1 -1 3 1 -3 -1 3 1 1 -1 -1 -3 -3;...
            -3 -3 1 -1 3 3 -3 -1 1 -1 -1 1 1 -1 -1 3 -3 1 -3 1 -1 -1 -1 -3;...
            3 -1 3 -1 1 -3 1 1 -3 -3 3 -3 -1 -1 -1 -1 -1 -3 -3 -1 1 1 -3 -3;...
            -3 1 -3 1 -3 -3 1 -3 1 -3 -3 -3 -3 -3 1 -3 -3 1 1 -3 1 1 -3 -3;...
            -3 -3 3 3 1 -1 -1 -1 1 -3 -1 1 -1 3 -3 -1 -3 -1 -1 1 -3 3 -1 -3;...
            -3 -3 -1 -1 -1 -3 1 -1 -3 -1 3 -3 1 -3 3 -3 3 3 1 -1 -1 1 -3 -3;...
            3 -1 1 -1 3 -3 1 1 3 -1 -3 3 1 -3 3 -1 -1 -1 -1 1 -3 -3 -3 -3;...
            -3 1 -3 3 -3 1 -3 3 1 -1 -3 -1 -3 -3 -3 -3 1 3 -1 1 3 3 3 -3;...
            -3 -1 1 -3 -1 -1 1 1 1 3 3 -1 1 -1 1 -1 -1 -3 -3 -3 3 1 -1 -3;...
            -3 3 -1 -3 -1 -1 -1 3 -1 -1 3 -3 -1 3 -3 3 -3 -1 3 1 1 -1 -3 -3;...
            -3 1 -1 -3 -3 -1 1 -3 -1 -3 1 1 -1 1 1 3 3 3 -1 1 -1 1 -1 -3;...
            -1 3 -1 -1 3 3 -1 -1 -1 3 -1 -3 1 3 1 1 -3 -3 -3 -1 -3 -1 -3 -3;...
            3 -3 -3 -1 3 3 -3 -1 3 1 1 1 3 -1 3 -3 -1 3 -1 3 1 -1 -3 -3;...
            -3 1 -3 1 -3 1 1 3 1 -3 -3 -1 1 3 -1 -3 3 1 -1 -3 -3 -3 -3 -3;...
            3 -3 -1 1 3 -1 -1 -3 -1 3 -1 -3 -1 -3 3 -1 3 1 1 -3 3 -3 -3 -3].';
end
end




