%% PROJETO DE AMPLIFICADOR RF USANDO PARAMETROS S
clc; clear all; close all;

%% insere dados
%S=  [ |S11|     <S11              |S21|      <S21             |S12|    <S12              |S22|     <S22]
%S = [-0.355    0.348              1.731      2.019            0.09     0.141             0.009   -0.093];%Exemplo de modelo com re + im*j
%S = [0.4        162                5.2        63              0.04      60                0.35      -39];%Exemplo de modelo com |M|<º. Fase tem q ser em graus
S=[   0.28615  -173.32              5.684     81.77          0.078167   72.58             0.37584   -33.13];

resposta = input('Qual seu formato paramentros S?\n •1 = |Modulo|  <faseº\n •2 = real + imaginario*j\nRESP= ');
        switch resposta
            case 1 %modulo e fase
                s11=cos(S(2)*pi/180)*S(1) + 1i*sin(S(2)*pi/180)*S(1);
                s12=cos(S(6)*pi/180)*S(5) + 1i*sin(S(6)*pi/180)*S(5);
                s21=cos(S(4)*pi/180)*S(3) + 1i*sin(S(4)*pi/180)*S(3);
                s22=cos(S(8)*pi/180)*S(7) + 1i*sin(S(8)*pi/180)*S(7);
                
             case 2 %complexo
                s11=S(1) + 1i*S(2);
                s12=S(5) + 1i*S(6);
                s21=S(3) + 1i*S(4);
                s22=S(7) + 1i*S(8);
            otherwise
                fprintf('\nResposta não válida\n');                
        end
clc;
%% Metodo 1
% Passo 1: calcula estabilidade
[k,B1,B2,delta] = stabilityk([s11 s12; s21 s22]);
DS = s11*s22 - s12*s21;
%k = (1+abs(DS)^2-abs(s11)^2-abs(s22)^2)/(2*abs(s21)*abs(s12));
if(k >= 1)
    fprintf('O sistema é estavel porque K=%2.5f\n',k);
else
    fprintf('O sistema pode ser INSTALVEL porque K=%2.5f\n',k);
end

% Passo 2: Determina o maximo ganho que se pode extrair idealmente do transistor
%B1=1+abs(s11)^2-abs(s22)^2-abs(DS)^2
if(B1 < 0)%se é negativo
    MAG = 10*log10(abs(s21)/abs(s12)) + 10*log10(abs(k+sqrt(k^2-1)));
else
    MAG = 10*log10(abs(s21)/abs(s12)) + 10*log10(abs(k-sqrt(k^2-1)));
end
fprintf('O maximo ganho do transistor eh %3.1fdB (ou %4.1fx)\n',MAG, 10^(MAG/10));

% Passo 3: calcula indice reflexao carga L
C2=s22-(DS*conj(s11));
%B2=1+abs(s22)^2-abs(s11)^2-abs(DS)^2
if(B2 < 0)%se é negativo
    modulo_refle_carga= abs((B2+sqrt(B2^2 - 4*abs(C2)^2))/(2*abs(C2)));
else
    modulo_refle_carga= abs((B2-sqrt(B2^2 - 4*abs(C2)^2))/(2*abs(C2)));
end

angulo_refle_carga = -1*angle(C2);%negativo de C2
refle_carga = modulo_refle_carga*cos(angulo_refle_carga) + 1i*modulo_refle_carga*sin(angulo_refle_carga);
fprintf('------Resultado metodo 1:------\n');
fprintf('O indice reflexao carga (L) deve ser |%.3f| e <%.1fº\n',abs(refle_carga), angle(refle_carga)*180/pi);

%Passo 4: calcula indice reflexao fonte S
refle_fonte=conj(s11 + (s12*s21*refle_carga)/(1-(refle_carga*s22)));
fprintf('O indice reflexao fonte (S) deve ser |%.3f| e <%.1fº\n',abs(refle_fonte), angle(refle_fonte)*180/pi);

%% Metodo 2 (bem similar). Aqui angulo eh dado em radianos
d=s11*s22-s12*s21;
B1=1+(abs(s11))^2-(abs(s22))^2-(abs(d))^2;
B2=1+(abs(s22))^2-(abs(s11))^2-(abs(d))^2;
C1=s11-d*s22';
C2=s22-d*s11';
gamma_S=(B1-sqrt(B1^2-4*(abs(C1))^2))/(2*C1);
gamma_L=(B2-sqrt(B2^2-4*(abs(C2))^2))/(2*C2);
fprintf('------Resultado metodo 2:------\n');
fprintf('O indice reflexao carga (L) deve ser |%.3f| e <%.1fº\n',abs(gamma_L), angle(gamma_L)*180/pi);
fprintf('O indice reflexao fonte (S) deve ser |%.3f| e <%.1fº\n',abs(gamma_S), angle(gamma_S)*180/pi);
Zs=(1+gamma_S)/(1-gamma_S);
Zl=(1+gamma_L)/(1-gamma_L);

fprintf('Zs final deve ser  %.5f  %.5f*j  (normailizada) ou considerando Zo=50 temos  %.1f  %.1f*j\n',real(Zs), imag(Zs),50*real(Zs), 50*imag(Zs));
fprintf('ZL final deve ser  %.5f  %.5f*j  (normailizada) ou considerando Zo=50 temos  %.1f  %.1f*j\n',real(Zl), imag(Zl),50*real(Zl), 50*imag(Zl));