%% Tutorial rápido de MATLAB(R)
%
% *Autor*: Professor Diego da Silva de Medeiros
%
% *Instituição*: IFSC
%
% *Data*: 04/03/2012
%
% *Versão*: 1
%
% Este tutorial foi feito para ser a introdução da introdução no uso do
% MATLAB para alunos do Curso Superior de Tecnologia em Sistemas de
% Telecomunicações, do Instituto Federal de Santa Catarina, campus São
% José. Foi construído pensando nos alunos das disciplinas de Comunicações
% Digitais (CDI) e Comunicações Móveis e Sem Fio 2 (CMS2), tendo em vista o
% que será necessário ao longo do semestre.
%
% Para uma melhor utilização, utilize a ferramenta de publicação do MATLAB,
% exportando esta script para o HTML.
%

%% Uma primeira demonstração
%
% Faremos neste primeiro capítulo uma demonstração da utilização do MATLAB.
% Um sinal senoidal será gerado e exibido numa figura. Inicialmente, os
% parâmetros do sinal serão definidos.
%
% Esta seção serve também para demonstrar como utilizar a ferramenta de
% relatório do MATLAB. Vamos ver que é possível inserir texto em *negrito*
% e _itálico_.
%

%%
% Os parâmetros do sinal senoidal incluem a frequência de amostragem,
% período de amostragem, o número de amostras da senoide a serem geradas e
% o vetor do eixo de amostras.

fs = 1000;   % Frequência de amostragem
ts = 1/fs;   % Período de amostragem

f = 100;     % Frequência da senoide

N = 1000;    % Número de amostras
n = 1:N;     % Vetor do eixo de amostras

%%
% Em seguida, a senoide é gerada com os parâmetros definidos. Será criado
% um vetor "s" que possuirá as amostras da função seno na frequência
% determinada e no intervalo de amostras utilizado.
%
s = sin(2*pi*f*n*ts);

%%
% Por último, a senoide gerada será plotada para que o usuário veja o
% resultado. Uma figura nova será criada, e o sinal será plotado versus o
% eixo do tempo criado (n*ts). Depois rótulos para os eixos x e y serão
% definidos, bem como um título será atribuído à figura.
%

figure
plot(n*ts,s)
xlabel('Tempo (s)')
ylabel('Sin(2 \pi f t)')
title('Senoide criada com uma frequencia de 100 Hz')

%% Aprendendo a usar estruturas de repetição
%
% Nesta seção, o comando *for* será apresentado, utilizado na criação de
% laços de repetição. Além do *for*, o comando *while* também pode ser
% usado (ver o <matlab:help('while') help do comando while> e tentar
% utilizar).
%
% Cada elemento "i" do vetor "s" definido na primeira seção desta script
% será multiplicado pelo valor imediatamente anterior "i-1". Com isso
% teremos a equação sen(n)*sen(n-1). O resultado seá plotado numa figura
% para o usuário ver o resultado.
%
% Repare que o laço começa em 2, para que a amostra "s(i-1)" esteja
% disponível. Caso o laço começasse em 1, ao tentar acessar a amostra
% "i-1=0" o MATLAB retornaria um erro (vale a pena mudar para ver o erro).
%

for i = 2:N                % Criando o laço
    
    a(i-1) = s(i)*s(i-1);   % Efetuando o cálculo
    
end

%% Aprendendo a usar estruturas de teste
%
% Nesta seção, o comando *if* será apresentado, utilizado na criação de
% testes. Além do *if*, o comando *switch* também pode ser usado (ver o
% <matlab:help('switch') help do comando switch> e tentar utilizar).
%
% Serão apresentadas as estruturas *if*, *if-else* e
% *if-elseif-else*. Com as estruturas, testes serão realizados e a
% afirmação referente ao resultado do teste será impressa. A função
% *display()* será usada para imprimir o texto.
%
% O valor da frequência da senoide (f) será comparado com o valor da
% frequência de amostragem (fs). Dependendo do resultado, uma mensagem será
% mostrada na tela.
%
% Repare que na última estrutura de teste, somente uma das afirmações serão
% verdadeiras. Por isso, digamos para um caso onde a frequência da senoide
% se encontra entre 1/5 e 2/5 da frequência de amostragem, a segunda
% afirmação será impressa.
%
% Outro ponto, mas ainda na mesma estrutura, está no tipo de teste em sí.
% Considerando o mesmo exemplo citado anteriormente, repare que para
% imprimir a segunda afirmação estamos testando apenas se f < (2/5)*fs.
% Porém, para chegar naquele teste, o teste de que f < (1/5)*fs deve ter
% falhado, por isso podemos dizer que f se encontra entre 1/5 e 2/5 de fs.
%

% Imprimindo uma mensagem-título para os testes:
display('RESULTADOS DOS TESTES:')

%%
% Estrutura if
if f == fs
    
    display('- As frequências são iguais.')
end

%%
% Estrutura if-else
if f < fs
    
    display('- A frequência da senoide é menor que a frequência de amostragem.')
else
    display('- A frequência da senoide é maior ou igual à frequência de amostragem.')
end

%%
% Estrutura if-elseif-else
if f < (1/5)*fs
    
    display('- A frequência da senoide é menor que um quinto da frequência de amostragem.')
    
elseif f < (2/5)*fs
    
    display('- A frequência da senoide está entre um quinto e dois quintos da frequência de amostragem.')
    
elseif f < (3/5)*fs
    
    display('- A frequência da senoide está entre dois quintos e três quintos da frequência de amostragem.')
    
elseif f < (4/5)*fs
    
    display('- A frequência da senoide está entre três quintos e quatro quintos da frequência de amostragem.')
else
    
    display('- A frequência da senoide é maior ou igual à quatro quintos da frequência de amostragem.')
end

%% Operações matemáticas
%
% Operações matemáticas são a alma do MATLAB. A lista completa dos
% operadores disponíveis pode ser obtida no
% <http://www.mathworks.com/help/techdoc/ref/f16-42340.html#f16-52459 site
% da mathworks>.
%
% Ao trabalhar com vetores ou matrizes, as restrições de operação da
% matemática devem ser respeitadas
%

%%
% Soma
soma = 3 + 6

%%
% Subtração
subt = 4 - 9

%%
% Multiplicação
mult = 2 * 9

%%
% Divisão
divs = 7 / 20

%%
% Potenciação
pote = 4 ^ 9

%%
% Raiz quadrada
raiz = sqrt(60)

%%
% Intervalo
inte1 = 1:9

%%
% Intervalo saltado
inte2 = 1:3:30

%%
% Intervalo negativo
inte3 = 5:-1:1

%%
% Intervalo negativo saltado
inte4 = 15:-5:-40

%%
% Vetor linha, sem o uso do operador de intervalo *:*. O uso da vírgula na
% definição de um vetor-linha é opcional.
Lin = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

%%
% Vetor coluna. Ponto e vírgula obrigatório.
Col = [10; 11; 12; 13; 14; 15; 16; 17; 18; 19]

%%
% A criação da matriz poderia seguir a mesma forma da criação dos vetores,
% com o uso de vírgula e ponto e vírgula, mas repare na forma com que ela
% foi criada. O alinhamento das suas colunas é opcional, mas contribui para
% a leitura do código.
Mat=[0  1  2  3  4  5  6  7  8  9
    10 11 12 13 14 15 16 17 18 19
    20 21 22 23 24 25 26 27 28 29
    30 31 32 33 34 35 36 37 38 39
    40 41 42 43 44 45 46 47 48 49
    50 51 52 53 54 55 56 57 58 59
    60 61 62 63 64 65 66 67 68 69
    70 71 72 73 74 75 76 77 78 79
    80 81 82 83 84 85 86 87 88 89
    ]

%%
% Multiplicação elemento a elemento de vetores
multE = [1 2 3 4 5] .* [6 7 8 9 10]

%%
% Divisão elemento a elemento de vetores
divsE = [5 4 3 2 1] ./ [10 9 8 7 6]

%%
% Potenciação elemento a elemento de vetores
poteE = [1 2 3 4 5 6] .^ 3

%%
% Números complexos
i = sqrt(-1);
cplx = 12 + i*5

%%
% Conjugado
cplxC = conj(cplx)

%%
% Transposição
LinT = Lin .'
ColT = Col .'
MatT = Mat .'

%%
% Hermitiana (transposta conjugada)
Vcplx = [1 + i*3, 4 + i*6, 8 - i*13, -9 + i*1];
VcplxH = Vcplx'

%% Indexação de vetores e matrizes
%
% Nesta seção, vamos aprender a indexar vetores e matrizes, uma das coisas
% mais difíceis de se fazer no MATLAB.
%
% Inicialmente, três variáveis serão criadas: *Lin*, um vetor-linha; *Col*,
% um vetor-coluna; e *Mat*, uma matriz. Repare no uso de vírgula e ponto e
% vírgula na criação das variáveis. Depois de criadas, várias informações
% das variáveis serão extraídas.
%
% Aqui selecionamos apenas um elemento das variáveis. Repare que os
% elementos da matriz podem ser acessados através da [linha,coluna] ou
% apenas pelo número do elemento. Chamamos a indexação [linha,coluna] por
% indexação com múltiplos subcritos e a indexação [elemento] por indexação
% por índice. Para mais informações, ver a função
% <http://www.mathworks.com/help/techdoc/ref/ind2sub.html IND2SUB>.
%
Lin_1   = Lin(1)    % Elemento 1 do vetor Lin
Col_3   = Col(3)    % Elemento 3 do vetor Col
Mat_2_4 = Mat(2,4)  % Elemento da linha 2 e coluna 4 da matriz [múltiplos subscritos]
Mat_6   = Mat(6)    % Elemento 6 da matriz [indexação por índice]

%%
% A seguir, selecionamos uma faixa de valores das variáveis. Repare no uso
% do operador de intervalo *:*. Repare também no uso do operador *end* para
% endereçar o último elemento das variáveis.
%

%%
% Elementos 2 a 5 do vetor Lin
Lin_2a5 = Lin(2:5)

%%
% Elementos 1 a 7 do vetor Col
Col_1a7 = Col(1:7)

%%
% Elementos 5 a 8 da linha 3 da matriz
Mat_3_5a8 = Mat(3,5:8)

%%
% Elementos 3 a 7 da coluna 8 da matriz
Mat_3a7_8 = Mat(3:7,8)

%%
% Elementos da linha 1 a 4 e da coluna 5 a 7 da matriz (submatriz)
Mat_1a4_5a7 = Mat(1:4,5:7)

%%
% Todos os elementos da linha 3 da matriz, utilizando o operador de
% intervalo *:* sozinho
Mat_3_T = Mat(3,:)

%%
% Todos os elementos da coluna 5 da matriz, utilizando o operador de
% intervalo *:* sozinho
Mat_T_5 = Mat(:,5)

%%
% Endereçando até o último elemento das variáveis
Lin_3aE     = Lin(3:end)
Col_5aE     = Col(5:end)
Mat_5aE_4aE = Mat(5:end,4:end)

%%
% Endereçando elementos específicos de vetores. Repare que eles não
% precisam estar em ordem, bem como podem ser repetidos
Lin_384 = Lin([3 8 4]) % Selecionando os elementos 3, 8 e 4 do vetor Lin
Col_922 = Col([9 2 2]) % Selecionando os elementos 9, 2 e 2 do vetor Col

%%
% Endereçando elementos específicos de matrizes. Repare que para indexar
% elementos específicos das linhas e colunas das matrizes, o número de
% linhas determinadas deve ser igual ao número de colunas
%%
% Selecionando os elementos 7 e 4 da coluna 8
Mat_745_8   = Mat([7 4],8)
%%
% Selecionando os elementos 4 e 2 da linha 3
Mat_3_442   = Mat(3,[4 2])
%%
% Selecionando os elementos [linha 3, coluna 8] e [linha 4, coluna 6]
Mat_334_586 = Mat([3 4],[8 6])

%% Concatenação de vetores
%
% A concatenação no matlab é dada de forma direta, bastando apenas
% respeitar o tamanho das variáveis. Não podemos concatenar um vetor coluna
% com um vetor linha, nem vetores e matrizes de tamanhos diferentes.
%

%%
% Concatenando um vetor com um escalar. Novamente, a vírgula é opcional.
C1 = [Lin, 100]   % Concatenando um vetor linha
C2 = [Col; 999]   % Concatenando um vetor coluna

%%
% A mesma forma é usada para concatenar dois vetores. Para demonstrar isso,
% criaremos mais dois vetores, um linha outro coluna.

Lin2 = [95, 96, 97, 98, 99];
Col2 = [83; 84; 85; 86; 87];

C3 = [Lin, Lin2]  % Concatenando dois vetores linha
C4 = [Col; Col2]  % Concatenando dois vetores coluna

%%
% Pode-se também concatenar apenas alguns elementos dos vetores. Isto
% envolve tanto a concatenação quanto a indexação de variáveis
C5 = [Lin(1:4), Lin2(3:end)]
C6 = [Col(3:5); Col2(1:4)]

%% Concatenação de matrizes
%
% Concatenar matrizes é um pouco mais difícil que concatenar vetores, já
% que não podemos concatenar matrizes com escalares. Apenas podemos
% concatenar matrizes com vetores ou outras matrizes, e o tamanho dos
% variáveis devem ser correspondentes. *A concatenação de variáveis com
% tamanhos diferentes resulta em erro* (vale a pena testar!). Criaremos
% matrizes e vetores menores para demonstrar estas operações.

M1=[1  2  3  4
    5  6  7  8
    9  10 11 12];

M2=[13 14 15
    16 17 18
    19 20 21];

M3=[22 23 24 25
    26 27 28 29];

V1 = [30; 31; 32];
V2 = [33, 34, 35, 36];

%%
% Para concatenar um vetor coluna com uma matriz, o número de linhas da
% matriz e o número de elementos do vetor devem ser iguais. O uso da
% vírgula é opcional. Estamos dizendo na linha a seguir que após a matriz
% M1 haverá uma outra coluna que será o vetor V1
C7 = [M1, V1]

%%
% Para concatenar um vetor linha com uma matriz, o número de colunas da
% amtriz e o número de elementos do vetor devem ser iguais. Repare no uso
% do ponto-e-vírgula, indicando que após a matriz M1 haverá uma outra linha
% que será o vetor V2
C8 = [M1; V2]

%%
% Para concatenar duas matrizes lado-a-lado, o número de linhas das duas
% deve ser igual.
C9 = [M1, M2]

%%
% Para concatenar duas matrizes uma em cima da outra, o número de colunas
% das duas deve ser igual
C10 = [M1; M3]

%%
% Da mesma forma que a concatenação de vetores, a concatenação de matrizes
% também pode ser feita com apenas alguns elementos das matrizes, bastando
% seguir as restrições de número de elementos apresentadas anteriormente
C11 = [M1([1 2],:), M2([2 3],:)]
C12 = [M1(:,1:3); M3(:,2:4)]

%% Trabalhando com texto
%
% Trabalhar com texto no matlab é a mesma coisa que trabalhar com vetores,
% já que o texto nada mais é que um vetor de dados do tipo caracter. Para
% determinar que um dado é do tipo caracter, utiliza-se aspas simples.
% Operações de indexação e concatenação são feitas da mesma forma que vimos
% anteriormente. Repare que é preciso deixar um caracter de espaço no final
% ou no início dos vetores envolvidos.

Txt1 = 'Que dia ';
Txt2 = 'infeliz!';

display([Txt1 Txt2])

%%
% A concatenção de texto pode ser usada mesmo que o texto não tenha sido
% atribuído à nenhuma variável.

display([Txt1 Txt2 ' Tive que acordar cedo.'])

%%
% Uma função muito útil na hora de trabalhar com texto é a
% <http://www.mathworks.com/help/techdoc/ref/num2str.html NUM2STR>. Com
% ela, podemos utilizar valores de variáveis presentes no programa na hora
% de mostrar dados numéricos na tela.
%
% Na linha a seguir, iremos imprimir o valor da frequência de amostragem
% utilizada no início do programa, sem usar a função *num2str* e com o uso
% da função.
%

display(['A frequência de amostragem utilizada é ' fs])
display(['A frequência de amostragem utilizada é ' num2str(fs)])

%%
% Repare que somente no segundo caso a mensagem foi impressa corretamente

%% Final
%
% *Agora é a sua vez*: Brinque com o MATLAB para aprender a sua utilização.
% Tenha certeza de que este estudo vai ser de grande utilizade para as
% disciplinas que estão por vir no curso.
%
close all
clc








