function[G]= ModelaCanalD2D(N, K, modelo, distancia, fatorK, velocidade, num_rbs)

switch num_rbs % determina frequencia amostragem
    case 6
        fs = 1.92e06;
        fc = 700e06;
    case 7
        fs = 1.92e06;
        fc = 700e06;
    case 15
        fs = 3.84e06;
        fc = 700e06;
    case 17
        fs = 3.84e06;
        fc = 700e06;
    case 25
        fs = 7.68e06;
        fc = 700e06;
    case 28
        fs = 7.68e06;
        fc = 700e06;
    case 50
        fs = 15.36e06;
        fc = 700e06;
    case 55
        fs = 15.36e06;
        fc = 700e06;
    case 75
        fs = 23.04e06;
        fc = 700e06;
    case 83
        fs = 23.04e06;
        fc = 700e06;
    case 100
        fs = 30.72e06;
        fc = 26e09;
    case 110
        fs = 30.72e06;
        fc = 26e09;
    case 275
        fs = 4096*120000;
        fc = 26e09; % Release 10 - banda de 100 MHz (fc = 26 GHz)
    otherwise
        disp('Erro! Entrada de N válidas: 6, 7, 15, 17, 25, 28, 50, 55, 100, 110 ou 275');
end

ts = 1/fs; % período de amostragem
c = 3e8; % vel luz em m/s
lambda = c/fc; % lambda
multipath = zeros(N,K); % inicializa matriz CQI
v_m_s = velocidade / 3.6; % velocidade em m/s
fd = v_m_s / lambda; % efeito doppler

distancia = distancia*rand;

switch modelo
    case {'CDL-A','CDL-B','CDL-C','CDL-D','CDL-E'}
        % PERDA MULTIPERCURSO
        canal = nr5gCDLChannel;
        canal.TransmitAntennaArray.Size = [1 1 1 1 1];
        canal.ReceiveAntennaArray.Size = [1 1 1 1 1];
        canal.DelayProfile = modelo;
        canal.MaximumDopplerShift = fd;
        canal.SampleRate = fs;
        %canal.Seed = 19;
        %canal.SampleDensity = Inf;
        [~,ganho,~] = canal(1);
        h = sum(ganho);
        multipath = 10*log10(abs(h.*conj(h)))*ones(N,K);
        % PERDA DE PERCURSO
        sigma = 7.8; % Release 10 Urban Macro
        hbs = 25; % Release 10 Urban Macro
        hut = 1.5; % Release 10 Urban Macro
    case {'TDL-A','TDL-B','TDL-C','TDL-D','TDL-E'}
        % PERDA MULTIPERCURSO
        canal = nr5gTDLChannel;
        canal.NumTransmitAntennas = 1;
        canal.NumReceiveAntennas = 1;
        canal.DelayProfile = modelo;
        canal.MaximumDopplerShift = fd;
        canal.SampleRate = fs;
        canal.PathGainsOutputPort = true;
        [~,ganho] = canal(1);
        h = sum(ganho);
        multipath = 10*log10(abs(h.*conj(h)))*ones(N,K);
        % PERDA DE PERCURSO
        sigma = 7.8; % Release 10 Urban Macro
        hbs = 25; % Release 10 Urban Macro
        hut = 1.5; % Release 10 Urban Macro
    case 'Rayleigh'
        % PERDA MULTIPERCURSO
        perfil = 3;
        %perfil = randi([1 3]);
        switch perfil % Excess taps delay / Relative power of taps (3GPP TS 36.104 anexo B.2)
            case 1  % Pedestre EPA
                delays = [0 30e-9 70e-9 90e-9 120e-9 190e-9 410e-9];
                tapPower = [0.0 -1.0 -2.0 -3.0 -8.0 -17.2 -20.8];
            case 2  % Veicular EVA
                delays = [0 30e-9 150e-9 310e-9 370e-9 710e-9 1090e-9 1730e-9 2510e-9];
                tapPower = [0.0 -1.5 -1.4 -3.6 -0.6 -9.1 -7.0 -12.0 -16.9];
            case 3 % Urbano ETU
                delays = [0 50e-9 120e-9 200e-9 230e-9 500e-9 1600e-9 2300e-9 5000e-9];
                tapPower = [-1.0 -1.0 -1.0 0.0 0.0 0.0 -3.0 -5.0 -7.0];
        end
        canal = rayleighchan(ts, fd, delays, tapPower);
        h = sum(canal.PathGains);
        multipath = 10*log10(abs(h.*conj(h)))*ones(N,K);
        % PERDA PERCURSO
        sigma = 10; % Release 9 TR 36.931
    case 'Rician'
        % PERDA MULTIPERCURSO
        perfil = 3;
        %perfil = randi([1 3]);
        switch perfil % Excess taps delay / Relative power of taps (3GPP TS 36.104 anexo B.2)
            case 1  % Pedestre EPA
                delays = [0 30e-9 70e-9 90e-9 120e-9 190e-9 410e-9];
                tapPower = [0.0 -1.0 -2.0 -3.0 -8.0 -17.2 -20.8];
            case 2  % Veicular EVA
                delays = [0 30e-9 150e-9 310e-9 370e-9 710e-9 1090e-9 1730e-9 2510e-9];
                tapPower = [0.0 -1.5 -1.4 -3.6 -0.6 -9.1 -7.0 -12.0 -16.9];
            case 3 % Urbano ETU
                delays = [0 50e-9 120e-9 200e-9 230e-9 500e-9 1600e-9 2300e-9 5000e-9];
                tapPower = [-1.0 -1.0 -1.0 0.0 0.0 0.0 -3.0 -5.0 -7.0];
        end
        canal = ricianchan(ts, fd, fatorK, delays, tapPower);
        h = sum(canal.PathGains);
        multipath = 10*log10(abs(h.*conj(h)))*ones(N,K);
        % PERDA PERCURSO
        sigma = 10; % Release 9 TR 36.931
    otherwise
        disp('Erro! Entrada de modelo válidas: Rayleigh / Rician / CDL-x / TDL-x');
end

pathLoss = 148+40*log10(distancia); % Artigo GTM+
sombreamento = normrnd(0,sigma,N,K); % sombreamento log-normal com media 0 e desvio padrão sigma
ganhoAntena = 15;
perda = pathLoss + sombreamento;
G = ganhoAntena + multipath - perda;

end
