Mudanças entre as edições de "CSF29008 2015-2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(3 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 17: Linha 17:
 
{{Cl|6 |22/10 | 2 | Propagação em Pequena Escala:  Introdução, Doppler e Canal Multipercurso  | MATLAB: superposição de fasores de campo elétrico}}
 
{{Cl|6 |22/10 | 2 | Propagação em Pequena Escala:  Introdução, Doppler e Canal Multipercurso  | MATLAB: superposição de fasores de campo elétrico}}
 
{{Cl|7 |26/10 | 2 | Propagação em Pequena Escala: Modelo de Banda Estreita, Autocorrelações, Clarke-Jakes e PSD (+30min.) | MATLAB: simulação do canal rayleigh plano através do modelo Clarke-Jakes}}
 
{{Cl|7 |26/10 | 2 | Propagação em Pequena Escala: Modelo de Banda Estreita, Autocorrelações, Clarke-Jakes e PSD (+30min.) | MATLAB: simulação do canal rayleigh plano através do modelo Clarke-Jakes}}
{{Cl|8 |29/10 | 2 | Propagação em Pequena Escala: Simulação Rayleigh (Plano) – Método Rappaport x MATLAB rayleighchan(Ts,fd) + BPSK | }}
+
{{Cl|8 |29/10 | 2 | Propagação em Pequena Escala: Simulação Rayleigh (Plano) – Método Rappaport x MATLAB rayleighchan(Ts,fd) + BPSK (+30min.) | MATLAB: simulação SISO BPSK com canal plano Rayleigh (desvanecimentos de amostra e de bloco)}}
 +
{{Cl|9 |5/11 | 2 | Propagação em Pequena Escala: Banda Larga, Convolução e ISI (interpretação de banda larga e ISI pelo fenômeno da convolução) | MATLAB: animação da convolução de canais e sinais}}
 +
{{Cl|10 |9/11 | 2 | Propagação em Pequena Escala: Caracterização Estatística do Canal Autocorrelações no Tempo e Frequência; Classificação Plano x Seletivo; Espalhamento Temporal RMS, Banda de Coerência e Tempo de Coerência | MATLAB: simulação das autocorrelações de um canal 802.11g}}
 +
{{Cl|11 |12/11 | 2 | Propagação em Pequena Escala: concluir simulações; Fast Fading x Slow Fading; Marcar avaliação | }}
 +
{{Cl|12 |14/11 | 2 | Lista de exercícios para a prova; Alunos não compareceram | }}
 +
{{Cl|13 |16/11 | 2 | Equalizadores (ZF e MMSE plano) | MATLAB: complementação do exercício SISO BPSK}}
 +
{{Cl|14 |19/11 | 2 | Equalização do canal sem fio seletivo em frequência: noções de inversão de filtros FIR e equalizadores adaptativos (algoritmos NLMS e RLS) | MATLAB: equalizadores FIR adaptativos (NLMS e RLS)}}
 +
{{Cl|15 |23/11 | 2 | Revisão e Exercícios da Lista 01 para a prova (+30min.) | }}
 +
{{Cl|16 |26/11 | 2 | Avaliação Teórica 01: Modelos de Propagação em Larga e Pequena Escala (+30min.) | }}
 +
{{Cl|17 |1/12 | 2 | Telefonia Celular: introdução, história e conceitos básicos (componentes da rede celular e duplexação de canais) | }}
 +
{{Cl|18 |3/12 | 2 | Telefonia Celular: geometria hexagonal, reuso de frequências, interferência co-canal e canal adjacente, SIR | }}
 +
{{Cl|19 |7/12 | 2 | Telefonia Celular: noções de tráfego e troncalização (Erlang B e C) + setorização e divisão celular  | }}
 +
{{Cl|20 |10/12 | 2 | Lista de Exercícios e Trabalho p/ Entregar 23/12 | }}
 +
{{Cl|21 |12/12 | 2 | Alunos não compareceram | }}
 +
{{Cl|22 |14/12 | 2 | Telefonia Celular: Resolução de exercícios no quadro (Projeto do reuso N com base na SIR e com base no Tráfego) | }}
 +
{{Cl|23 |17/12 | 2 | Exercício/Trabalho: programar uma rotina de cálculos do planejamento celular proposto nos exercícios entregues em aula | }}
 +
{{Cl|24 |21/12 | 2 | Telefonia Celular: conceitos de handoff, roaming | }}
 
{{cronograma-botton |80}}
 
{{cronograma-botton |80}}
 
{{collapse bottom}}
 
{{collapse bottom}}
Linha 24: Linha 40:
 
[[CSF29008_2015-2|Voltar para CSF-2015-2]]
 
[[CSF29008_2015-2|Voltar para CSF-2015-2]]
 
</center>
 
</center>
 +
 +
= Avaliação 01 =
 +
 +
* [[Media:CSF_29008_av01_2015-2.pdf‎  | Avaliação 01 de CSF29008 - Modelos de Larga e Pequena Escala]]
 +
 +
'''Entregar''' versão corrigida na '''quinta-feira 10/12, até às 09:40'''.
 +
 +
Será considerada a versão corrigida para aumentar a nota (e o conceito) final da avaliação 01.
  
 
= Notas de Aula =
 
= Notas de Aula =
Linha 47: Linha 71:
 
{{collapse bottom}}
 
{{collapse bottom}}
 
-->
 
-->
 +
 +
{{collapse top| Telefonia Celular| expand=true}}
 +
* [http://wiki.sj.ifsc.edu.br/index.php/CMS60808_-_Di%C3%A1rio_2015/1#Material_de_Aula Notas de Aula de CMS60808]
 +
 +
Complementar as notas de aula com leitura dos livros das referências bibliográficas da disciplina (Rappaport, Capítulo 2 e Andrea Goldsmith, Capítulo 15).
  
 
<!--
 
<!--
{{collapse top| Telefonia Celular| expand=true}}
 
 
[[Media:CMS60808_Aula_04_-_Conceitos_Básicos_de_Telefonia_Celular.pdf‎ | Telefonia Celular: Conceitos Básicos]]
 
[[Media:CMS60808_Aula_04_-_Conceitos_Básicos_de_Telefonia_Celular.pdf‎ | Telefonia Celular: Conceitos Básicos]]
  
Linha 65: Linha 93:
  
 
[[Media:CMS60808_Aula_09_-_Setorização_e_divisão_intra-celular.pdf‎ | Telefonia Celular: Setorização e Divisão Celular]]
 
[[Media:CMS60808_Aula_09_-_Setorização_e_divisão_intra-celular.pdf‎ | Telefonia Celular: Setorização e Divisão Celular]]
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
  
 
<!--
 
<!--

Edição atual tal como às 16h19min de 30 de dezembro de 2015

Plano de Ensino e Cronograma

Desenvolvimento Pedagógico - Andamento do Cronograma 2015/2

Suspensão do calendário acadêmico pela direção do Campus de 30 de Julho a 1 de Outubro;
Semestre 2015-2 - Prof. Bruno Fontana da Silva / ???
Aula Data Horas Conteúdo Recursos
1 5/10 2 Introdução às comunicações móveis: apresentação e motivação da componente curricular
2 8/10 2 Propagação em Larga Escala (Modelos Analíticos): Introdução, Espaço Livre, Dois Raios
3 15/10 2 Propagação em Larga Escala (Modelos Analíticos): 10 Raios, Múltiplos Raios Generalizado, Difração e Dispersão, Okumura
4 17/10 2 Dúvidas sobre exercícios com MATLAB (apenas um aluno compareceu)
5 19/10 2 Propagação em Larga Escala (Modelos Empíricos): Okumura, Hata, Cost231, Dual Slope, Atenuação Indoor, Modelo Simplificado (+30min.) MATLAB para simulação das curvas do modelo Hata e Cost231
6 22/10 2 Propagação em Pequena Escala: Introdução, Doppler e Canal Multipercurso MATLAB: superposição de fasores de campo elétrico
7 26/10 2 Propagação em Pequena Escala: Modelo de Banda Estreita, Autocorrelações, Clarke-Jakes e PSD (+30min.) MATLAB: simulação do canal rayleigh plano através do modelo Clarke-Jakes
8 29/10 2 Propagação em Pequena Escala: Simulação Rayleigh (Plano) – Método Rappaport x MATLAB rayleighchan(Ts,fd) + BPSK (+30min.) MATLAB: simulação SISO BPSK com canal plano Rayleigh (desvanecimentos de amostra e de bloco)
9 5/11 2 Propagação em Pequena Escala: Banda Larga, Convolução e ISI (interpretação de banda larga e ISI pelo fenômeno da convolução) MATLAB: animação da convolução de canais e sinais
10 9/11 2 Propagação em Pequena Escala: Caracterização Estatística do Canal Autocorrelações no Tempo e Frequência; Classificação Plano x Seletivo; Espalhamento Temporal RMS, Banda de Coerência e Tempo de Coerência MATLAB: simulação das autocorrelações de um canal 802.11g
11 12/11 2 Propagação em Pequena Escala: concluir simulações; Fast Fading x Slow Fading; Marcar avaliação
12 14/11 2 Lista de exercícios para a prova; Alunos não compareceram
13 16/11 2 Equalizadores (ZF e MMSE plano) MATLAB: complementação do exercício SISO BPSK
14 19/11 2 Equalização do canal sem fio seletivo em frequência: noções de inversão de filtros FIR e equalizadores adaptativos (algoritmos NLMS e RLS) MATLAB: equalizadores FIR adaptativos (NLMS e RLS)
15 23/11 2 Revisão e Exercícios da Lista 01 para a prova (+30min.)
16 26/11 2 Avaliação Teórica 01: Modelos de Propagação em Larga e Pequena Escala (+30min.)
17 1/12 2 Telefonia Celular: introdução, história e conceitos básicos (componentes da rede celular e duplexação de canais)
18 3/12 2 Telefonia Celular: geometria hexagonal, reuso de frequências, interferência co-canal e canal adjacente, SIR
19 7/12 2 Telefonia Celular: noções de tráfego e troncalização (Erlang B e C) + setorização e divisão celular
20 10/12 2 Lista de Exercícios e Trabalho p/ Entregar 23/12
21 12/12 2 Alunos não compareceram
22 14/12 2 Telefonia Celular: Resolução de exercícios no quadro (Projeto do reuso N com base na SIR e com base no Tráfego)
23 17/12 2 Exercício/Trabalho: programar uma rotina de cálculos do planejamento celular proposto nos exercícios entregues em aula
24 21/12 2 Telefonia Celular: conceitos de handoff, roaming
TOTAL 80

Voltar para CSF-2015-2

Avaliação 01

Entregar versão corrigida na quinta-feira 10/12, até às 09:40.

Será considerada a versão corrigida para aumentar a nota (e o conceito) final da avaliação 01.

Notas de Aula

Telefonia Celular

Complementar as notas de aula com leitura dos livros das referências bibliográficas da disciplina (Rappaport, Capítulo 2 e Andrea Goldsmith, Capítulo 15).


Simulações

  • Dois raios
  • Hata e Cost231

Campo Eletromagnético

Campo eletromagnético
% 5.4.1 A Computer Experiment (Andreas Molisch, Wireless Communications)

clear all; close all; clc;

% Consider the following simple computer experiment. The signals from several IOs are incident
% onto an RX that moves over a small area. The IOs are distributed approximately uniformly around
% the receiving area. They are also assumed to be sufficiently far away so that all received waves
% are homogeneous plane waves, and that movements of the RX within the considered area do not
% change the amplitudes of these waves. The different distances and strength of the interactions are
% taken into account by assigning a random phase and a random amplitude to each wave. We are
% then creating eight constituting waves Ei with absolute amplitudes |a_i|, angle of incidence (with
% respect to the x-axis) φ_i and phase ϕ_i.

fc = 900e6; Tc = 1/fc;                      % frequência da portadora;
c = 3e8;                                    % speed of light
wl = c*Tc;                                  % comprimento de onda
k = 2*pi/wl;                                % número de onda

% Fasores
% a = [169 213 87 256 17 126 343 297 0];        % φ, azimuti
% e = [311 32 161 356 191 56  268 131 0];       % ϕ_i, elevação
% Ep = [1 .8 1.1 1.3 .9 .5 .7 .9 1000];            % |a_i|, amplitudes

a=0;
e=180;
Ep = 1;

L = 100;
x = linspace(0,5*wl,L);                     % Eixo 0 < x < 5*wl  (L pontos)
y = linspace(0,5*wl,L);                     % Eixo 0 < y < 5*wl  (L pontos)
    

En = zeros(L,L);                            % buffer
for xx=1:length(x)                          % índices de x
    for yy = 1:length(y)                    % índices de y
        for n = 1:length(a)                 % índices de componentes
            % E(x,y) = sum Ep*exp{-jk[x*cos(a) + y*sin(a)]}*exp{je}
            % fasores do campo elétrico(x,y) em t=0;
            % Ep*exp(-j [k d + d0/k])
            En(xx,yy) = En(xx,yy) + Ep(n)*exp(-1i*k*(x(xx)*cosd(a(n))+y(yy)*sind(a(n))))*exp(1i*e(n)*pi/180);
        end
    end
end



figure;
subplot(2,2,1);
 surf(x,y,real(En)); zlabel('Real');
 
 subplot(2,2,2);
 surf(x,y,imag(En)); zlabel('Imaginário');
 
  subplot(2,1,2);
 surf(x,y,abs(En)); zlabel('|E|');
 
 figure;
 hist(abs(En(:)),100)

Modelo de Jakes

Modelo de Clarke-Jakes (Canal Plano com Desvanecimento Rayleigh)
% Clarke-Jakes Narrowband Model
clear all; close all; clc; 

N = 4096;                           % frequency points
Nz = 1*2^16;                        % frequency zero-padding
fd = 300;                            % Doppler shift
fc = 900e6;                         % carrier frequency
delta = 0;                          % ignore infinity PSD values
Vz = zeros(1,Nz/2);                 % zero-padding vector
f = linspace(fc-fd+delta,fc+fd-delta,N); % frequency vector;
df = 2*fd/N;
B = 2*fd+Nz*df;                     % bandwidth
Ts = 1/B;                           % sample-time
T = (N+Nz)*Ts;                      % total time

%% Doppler PSD
Pr = 1/4;
A = Pr;           
D = 1-(abs((f-fc))/fd).^2;
Sf = A./pi/fd./sqrt(D);         % PSD
% Sf(1) = Sf(2); Sf(end) = Sf(end-1); % ignore infinity PSD values
% Sf(1) = 0; Sf(end) = 0; % ignore infinity PSD values
% Sf(1) = 0.5*(max(Sf)); Sf(end) = Sf(1); % ignore infinity PSD values
m1 = (Sf(2)-Sf(3))/(f(2)-f(3)); 
m2 = (Sf(end-1)-Sf(end-2))/(f(end-1)-f(end-2));
Sf(1) = m1*(f(1)-f(2))+Sf(2);
Sf(end) = m2*(f(end)-f(end-1))+Sf(end-1);



Sfz = [Vz Sf Vz];       % zero-padded PSD

%% Frequency Domain
Hp = sqrt(1/2)*(randn(1,N/2) +1i*randn(1,N/2));     % positive components
Hn = conj(Hp(end:-1:1));                % negative components
H = [Vz Hp Hn Vz];                      % zero-padded comp.
Hf = sqrt(Sfz).*H;                      % zero-padded equivalent spectrum

%% Time domain
ri = ((N+Nz)/2)*ifft(real(Hf),N+Nz);               % real components
rq = ((N+Nz)/2)*ifft(imag(Hf),N+Nz);               % imaginary components
hr = sqrt(abs(ri).^2+abs(rq).^2);             % rayleigh envelope
hrms = sqrt(var(hr)+mean(hr)^2);                % rms value
hnorm = hr/hrms;                                % normalizing fading
t = linspace(0,T-Ts,N+Nz);                 % time vector

%% MATLAB Rayleigh Channel
h2 = rayleighchan(Ts,fd);
h2.ResetBeforeFiltering = 0;    % do not reset
h2.StoreHistory = 1;            % save path gains after filter
h2.StorePathGains=1;
h2.NormalizePathGains = 0;      % do not normalize E[norm(h)]
y = filter(h2,[1 ones(1,N+Nz-1)]);


%% Plot Images
figure;
% plot(t, sqrt(hr),'k','linewidth',2);
plot(t, 20*log10(hnorm),'k','linewidth',2); hold;
plot(t, 20*log10(abs(h2.PathGains)),'--r','linewidth',1.2);
set(gca,'linewidth',3,'fontsize',30);
grid;
% axis([0 5 get(gca,'Ylim')])

%_________________________________________________________________________%
%% Histogram 1
figure;
Mh = 50;                                % bin numbers
[fn,bin] = hist(hnorm,Mh);           % get bins and cumulative frequencies
yhist = fn/trapz(bin,fn);               % calculate relative frequencies
xx = linspace(min(bin),max(bin),100);   % x vector in bins
yy = spline(bin,yhist,xx);              % interpolation of histogram envelope
set(gca,'linewidth',3,'fontsize',30); grid;

% sigr = 1/sqrt(2);
sigr = mean(hnorm)*sqrt(2/pi);
PDF_theor = bin.*exp(-bin.^2/(2*sigr^2))/(sigr^2);

bcor = [0.5 0.5 1];                                                         
bar(bin,yhist,'FaceColor',bcor,'edgecolor',bcor); hold on;                  % histogram bar plot
plot(xx,yy,':','color',[0 0 1],'linewidth',3);                              % envelope plot    
plot(bin,PDF_theor,'-ok','linewidth',3); grid on;                           % theoretical PDF
title('RMS-Normalized Rayleigh Amplitude Fading Histogram','fontsize',30);
ylabel('Estimated PDF','fontsize',30); xlabel('Amplitude Levels','fontsize',30);
legend('Normalized Histogram','Histogram Envelop','Theoretical Rayleigh PDF');
set(gca,'fontsize',30,'linestyleorder','-','linewidth',3);

%% Histogram 2 (MATLAB channel)
figure;
Mh = 50;                                % bin numbers
[fn,bin] = hist(abs(h2.PathGains),Mh);           % get bins and cumulative frequencies
yhist = fn/trapz(bin,fn);               % calculate relative frequencies
xx = linspace(min(bin),max(bin),100);   % x vector in bins
yy = spline(bin,yhist,xx);              % interpolation of histogram envelope
set(gca,'linewidth',3,'fontsize',30); grid;

% sigr = 1/sqrt(2);
sigr = mean(abs(h2.PathGains))*sqrt(2/pi);
PDF_theor = bin.*exp(-bin.^2/(2*sigr^2))/(sigr^2);

bcor = [0.5 0.5 1];                                                         
bar(bin,yhist,'FaceColor',bcor,'edgecolor',bcor); hold on;                  % histogram bar plot
plot(xx,yy,':','color',[0 0 1],'linewidth',3);                              % envelope plot    
plot(bin,PDF_theor,'-ok','linewidth',3); grid on;                           % theoretical PDF
title('MATLAB RMS-Normalized Rayleigh Amplitude Fading Histogram','fontsize',30);
ylabel('Estimated PDF','fontsize',30); xlabel('Amplitude Levels','fontsize',30);
legend('Normalized Histogram','Histogram Envelop','Theoretical Rayleigh PDF');
set(gca,'fontsize',30,'linestyleorder','-','linewidth',3);

Canal Plano Rayleigh

Rayleigh Plano (BPSK e AWGN)
% Simulaçao BPSK (2PSK) em Canal Rayleigh Plano
    
clear all; close all; clc;

Nb = 1e2;                                                                   % numero de bits
Bw = 100e3;                                                                 % largura de banda
Ts = 1/Bw;                                                                  % periodo de símbolo
fd = 0;                                                                     % doppler shift

SNRdBmin = 0;                                                               % mínimo valor de SNR (dB)
SNRdBmax = 30;                                                              % máximo valor de SNR (dB)
L = 10;                                                                     % número de pontos para simular

SNRdB = linspace(SNRdBmin,SNRdBmax,L);     
% razão sinal ruído em dB

BER.slow = zeros(1,L);                                                      % inicializa a memória da BER
PER.slow = BER.slow;

BER.fast = zeros(1,L);                                                      % inicializa a memória da BER
PER.fast = BER.fast;

errMin = 40;                                                               % critério mínimo de erros

tic;
tempo.inicial = clock;
%% Loop de Monte Carlo
for k = 1:L
    err.slow =0; err.fast=0; iter = 0; errP.slow = 0; errP.fast = 0;
    while errP.slow < errMin

%%  Imprimir Status da Simulação
     if(~mod(iter,50))       % múltiplos de 20
        clc;                 % apaga a tela
        tempo.run = toc;
        fprintf('### Início da simulação: %d/%d/%d às %d:%d ### \n',tempo.inicial(3),tempo.inicial(2),tempo.inicial(1),tempo.inicial(4),tempo.inicial(5));
        fprintf('# Ponto de Simulação ----------------------: %d / %d \n\n',k,L);    % iteração atual
        fprintf('# Erros de Bit (slow/block fading) ------- : %d / %d \n',err.slow,errMin); % erros atuais
        fprintf('# Erros de Pacote (slow/block fading) ---- : %d / %d \n',errP.slow,errMin); % erros atuais
        fprintf('# Erros de Bit (fast/sample fading) ------ : %d / %d \n',err.fast,errMin); % erros atuais
        fprintf('# Erros de Pacote (fast/sample fading) --- : %d / %d \n\n',errP.fast,errMin); % erros atuais
        fprintf('# Tempo de simulação: %.2f (s) / %.2f (h) \n',tempo.run,tempo.run/60/60);        
     end

%% Entradas da iteração     
iter = iter+1;
% SNRdB = 10*log10(SNR)
SNR = 10^(SNRdB(k)/10);        % SNR linear
P = 1;                      % potencia de sinal unitaria
% SNR = P / No
No = P/SNR;                 % variancia do ruido complexo

%% Mensagem Binária
msg = randi([0,1],1,Nb);
% msg2 = randsrc(1,Nb,[0 1]);

%% Modulação 
% 0 graus: bit 0
% 180 graus : bit 1
% 0 ------ +  x
% 1 ------ -  x

s = exp(1i*pi*msg);         % simbolos (sinal modulado)
Scst = [-1 1];              % constelação

%% Transmissão pelo canal
% y = s;        % transmissão ideal sem atenuação nem ruído
% y = s + z;    % transmissão por um canal com ruido aditivo
% y = h*s;      % transmissã sem ruído, com desvanecimento
% y = h*s + z;  % transmissão com desvanecimento e ruído aditivo

% obs: * representa a convolução; 
% obs2: se o canal for plano, representará multiplicação por constante
% obs3: para simular o Doppler, deve ser feita a convolução

z = sqrt(No/2)*(randn(1,Nb)+1i*randn(1,Nb));            % ruído AWGN

h_slow = rayleighchan(Ts,fd);                           % canal plano (slow fading)
h_slow.ResetBeforeFiltering = 0;                        % não altera o valor antes da filtragem
y_slow = filter(h_slow,s) + z;                          % convolução do sinal com o canal
% y = filter(h,s);                                        % sem ruído aditivo

h_fast = sqrt(1/2)*(randn(1,Nb)+1i*randn(1,Nb));        % canal plano (fast fading)
y_fast = h_fast.*s+z;                                   % transmissão pelo canal plano (fast fading)

%% Detecção 
% fonte com distribuição uniforme de símbolos:
% critério MAP (máximo a posteriori) é igual ao MLD
% (equivalente à menor distância para constelação)

%% Slow (Block) Fading Detection
% Levar em conta o canal plano para calcular a distancia
hg_slow = h_slow.PathGains;
% hg =h; 
d1 = abs(y_slow-hg_slow*Scst(1));     % d(y,s1) = d(y,-1)
d2 = abs(y_slow-hg_slow*Scst(2));     % d(y,s2) = d(y,+1)

[~,idmin] = min([d2;d1]);    
% encontra as distâncias mínimas e índices de linha da matriz

msg_dtct_slow = idmin-1;
% 

%% Fast (Sample) Fading Detection
% Levar em conta o canal plano para calcular a distancia
% hg =h; 
d1 = abs(y_fast-h_fast*Scst(1));     % d(y,s1) = d(y,-1)
d2 = abs(y_fast-h_fast*Scst(2));     % d(y,s2) = d(y,+1)

[~,idmin] = min([d2;d1]);    
% encontra as distâncias mínimas e índices de linha da matriz

msg_dtct_fast = idmin-1;
% 

%% Medidas de Desempenho (taxas de erro)
% erros de bit 
errAtual.slow = sum(xor(msg_dtct_slow,msg));
err.slow = err.slow + errAtual.slow;
% erros de pacote
errP.slow = errP.slow + and(errAtual.slow,1);

% erros de bit 
errAtual.fast = sum(xor(msg_dtct_fast,msg));
err.fast = err.fast + errAtual.fast;
% erros de pacote
errP.fast = errP.fast + and(errAtual.fast,1);

    end  % while err < x

%% Taxa de erro de bit
BER.slow(k) = err.slow/(iter*Nb);
PER.slow(k) = errP.slow/(iter);

%% Taxa de erro de pacote
BER.fast(k) = err.fast/(iter*Nb);
PER.fast(k) = errP.fast/(iter);

end         % for SNR

%% Plot

figure;
semilogy(SNRdB,PER.slow,'-ok','linewidth',3); hold on;
semilogy(SNRdB,PER.fast,'--xk','linewidth',3);
semilogy(SNRdB,BER.slow,'-sr','linewidth',3);
semilogy(SNRdB,BER.fast,'--dr','linewidth',3);

xlab = xlabel('SNR (dB)','fontsize',30);
ylab = ylabel('Taxa de Erro','fontsize',30);

set(gca,'fontsize',35,'linewidth',2);
axis([SNRdBmin SNRdBmax 1e-6 1e0]); grid;
hleg = legend('PER (slow fading)','PER (fast fading)', ...
              'BER (slow fading)', 'BER (fast fading)');
set(hleg,'fontsize',30,'location','southwest');


%% Trabalho sobre Desvanecimento de Pequena Escala Plano (Banda Estreita)

% (1). Complementar essa simulação com as curvas AWGN (sem desvanecimento)

% (2). Repetir (1) para uma modulação 4-PSK e acrescentar curvas de SER (Taxa de Erro de Símbolo)

% (3). Repetir (1) para uma modulação 16-QAM e acrescentar curvas de SER (Taxa de Erro de Símbolo)

Convolução e ISI

Convolução e Interferência Intersimbólica
% Convolution and ISI Effects: Wideband and Narrowband Signals 
% CSF29008 - 2015/2
% Prof. Bruno Fontana da Silva
clear all; close all; clc;

%% Inputs
%_________________________________________________________________________%
speed = 1e-9;
% speed = 0.1;

Nx = 50;               % período de símbolo: Nx amostras
Nh = 5;                % duração de uma componente multipercurso: Nh amostras
Nz = 2;                % nulls length (espaço entre componentes multipercurso)

null = zeros(1,Nz);    % sequência de amostras nulas


%% Sinal x[n]
%_________________________________________________________________________%
% x = sin(2*pi*(1:Nx)/Nx);                                                    % modelo do pulso senoidal
% x = sin(2*pi*(1:Nx)/Nx/2);                                                  % modelo do pulso meia-onda
x = [ones(1,Nx/2) -ones(1,Nx/2)];                                           % sequência +1 / -1

X = [x x x];                     % enviando vários símbolos

%% Canal Multipercurso (Sistema LTI) h[n]
%_________________________________________________________________________%

h =  sin(2*pi*(1:Nh)/Nh/2);         % modelo do pulso

%% Canais Multipercurso
%_________________________________________________________________________%
% H = [null h null h null h ]; Lchan=3*Nh+2*Nz;                               % 3 multipercursos esparsas
% H = [null h null h]; Lchan=2*Nh+1*Nz;                                       % 2 multipercursos esparsas
H = [null h null];  Lchan=1*Nh+0*Nz;                                        % 1 multipercurso


%% Critério Wideband/Narrowband
%_________________________________________________________________________%
if(Nx>=10*Lchan)                                % Ts >> Tm
    convleg = 'Narrowband Signal';
elseif (Nx<=0.1*Lchan)                          % Ts << Tm
    convleg = 'Wideband Signal (ISI effect)';
else
    convleg = 'Not so narrowband...';
end

%% Auxiliares
%_________________________________________________________________________%
Ndiff = abs( length(X)-length(H));
null_diff = zeros(1,Ndiff);
if(length(X)>length(H))
 Xplot = X;
 Hplot = [H null_diff];
else
 Xplot = [X null_diff];
 Hplot = H;
end
Xp2 = [X(end:-1:1) zeros(1,length(H))];
Nconv = length(X)+length(H);
XH = zeros(1,Nconv);

xleg = ['1 Symbol: ' num2str(Nx) ' samples'];
chanleg = ['Channel spread: ' num2str(Lchan) ' samples'];

%% Convolução x[n]*h[n]
%_________________________________________________________________________%
figure(1);
for n =1:Nconv
   for k = 1:length(H)
       ix = n-k;
       if ix >= 0
           if ix+1 <= length(X)               
               XH(n) = XH(n) +  H(k)*X(ix+1);
           else
               XH(n) = XH(n) +  0;
           end
       else
           XH(n) = XH(n) +  0; 
       end
   end
   

%% Animated Convolution Plot
%_________________________________________________________________________%
    if n==1||n==Nconv
    %     clf;   
        subplot(3,1,1);
        stem([-length(X)+1:0 1:length(H)],circshift(Xp2,n,2),'b','linewidth',2.5); 
%         plot([-length(X)+1:0 1:length(H)],circshift(Xp2,n,2),'b','linewidth',2.5); 
        
        grid on; set(gca,'linewidth',3,'fontsize',20); 
        ylabel('x[n-k]','fontsize',30);
        hleg1 = legend(xleg); set(hleg1,'fontsize',10);
        axis([-length(X)+1 Nconv -2 2]);
      
        
        subplot(3,1,2);
        stem(Hplot,'r','linewidth',2.5); 
%         plot(Hplot,'r','linewidth',2.5); 
        
        set(gca,'linewidth',3,'fontsize',20); grid on; 
        ylabel('h[n]','fontsize',30);  hleg2 = legend(chanleg); set(hleg2,'fontsize',10);
        axis([-length(X)+1 Nconv get(gca,'Ylim')])

        
        subplot(3,1,3); 
        stem(XH,'k','linewidth',2.5); grid on;
%         plot(XH,'k','linewidth',2.5); grid on;

        xlabel('n (sample index)','fontsize',30)
        ylabel('x[n]*h[n]','fontsize',30); 
        set(gca,'linewidth',3,'fontsize',20);  hleg3 = legend(convleg); set(hleg3,'fontsize',10);
        axis([-length(X)+1 Nconv -10 10])

    else % not so many plot settings, faster animation
        subplot(3,1,1);
        stem([-length(X)+1:0 1:length(H)],circshift(Xp2,n,2),'b','linewidth',2.5); 
        axis([-length(X)+1 Nconv -2 2]);
    %     grid on; set(gca,'linewidth',3); 
    %     ylabel('x[n-k]','fontsize',30);
    %     hleg1 = legend(xleg); set(hleg1,'fontsize',10);
    %     
        subplot(3,1,3); 
        stem(XH,'k','linewidth',2.5); grid on;
        axis([-length(X)+1 Nconv -10 10])
    %     xlabel('n (sample index)','fontsize',30)
    %     ylabel('x[n]*h[n]','fontsize',30); 
    %     set(gca,'linewidth',3); 
        drawnow;
        pause(speed)
    end


end
% 
% figure;
% subplot(3,1,1);
% stem(Xplot,'b','linewidth',2.5);  grid on;  hleg1 = legend(xleg); set(hleg1,'fontsize',10);
% ylabel('x[n]','fontsize',30); 
% subplot(3,1,2);
% stem(Hplot,'r','linewidth',2.5);  grid on; hleg2 = legend(chanleg); set(hleg1,'fontsize',10);
% ylabel('h[n]','fontsize',30); 
% subplot(3,1,3);
% % stem(XH,'k'); hold on; 
% stem(conv(X,H),'k','linewidth',2.5); hold on;  grid on;
% xlabel('n (sample index)','fontsize',30)
% ylabel('x[n]*h[n]','fontsize',30);  hleg3 = legend(convleg); set(hleg3,'fontsize',10);

Caracterização de Canais de Banda Larga

Caracterização de Canais de Banda Larga
% Caracterização de Canais de Bandar Larga
% IFSC-SJ: Engenharia de Telecomunicações
% CSF29098: Comunicações sem Fio
% Desvanecimento de pequena escala:
% Funções de autocorrelação no domínio do tempo e da frequência
% Prof. Bruno Fontana da Silva - 2015/2

clear all; 
close all; pause(1); 
clc;

%% Entradas

Bw = 20e6;                                                                  % signal bandwidth
Ts = 1/Bw;                                                                  % sample time
fd = 100;                                                                 % doppler shift (exagerar o valor para para simular fast fading)
L = 128;                                                                     % comprimento considerado para analisar a resposta ao impulso

Byte_size = 1024*1;
bitsize = Byte_size*8;

%% Modelo do Canal
h = stdchan(Ts,fd,'802.11g',2*Ts);
% h = rayleighchan(Ts,fd);

% Manter a continuidade do processamento ao longo do tempo:
h.StoreHistory = 1;                                                         % salvar os dados
h.ResetBeforeFiltering = 0;                                                 % continuar o processamento com as características da última filtragem


%% Pré-loop inputs
Nloop = ceil(bitsize/L);                                                    % quantos blocos de L amostras até atingir tf?

y = zeros(Nloop,L);                                                         % dados medidos de resposta ao impulso
% Linhas de y : tempo de realização / transmissão fixo
% Colunas de y: atrasos em amostras fixo

Yf =y;                                                                      % domínio da frequência
Ac_tau = zeros(Nloop,2*L-1);                                                % Ac(dt=0,tau)
Ac_df = Ac_tau;                                                             % Ac(dt=0,df)

tvec = linspace(-L*Ts+Ts,L*Ts,2*L-1);
fvec = linspace(-Bw/2+Bw/2/L,Bw/2,2*L-1);

for k = 1:Nloop                                                             % obtendo Nloop respostas ao impulso
    %% Resposta ao Impulso em diferentes instantes de tempo: h(t,tau)
    y(k,:) = filter(h,[1 zeros(1,L-1)]);                                    % resposta ao impulso em t = (k-1)*(L*Ts)
    
    %% Resposta em Frequência: Transformada de Fourier com relação às L colunas (atrasos, variável tau): H(t,f)
    Yf(k,:) = fftshift(fft(y(k,:),L));
    % corresponde à análise em frequência assumindo o canal como um sistema LTI no instante k (t)
    % Linhas de Yf : tempo de realização / transmissão fixo
    % Colunas de Yf: amostras no domínio da frequência fixa
    
    %% Perfil de potência de atraso (Autocorrelação em "t1-t2 = 0" ): Ac(dt=0,tau)
    x1 = y(k,:)-mean(y(k,:));
    x2 = conj(y(k,end:-1:1)-mean(y(k,end:-1:1)));
    Ac_norm = var(y(k,:))*L;                                                % normalização da auto-correlação
    Ac_tau(k,:) = (conv(x1,x2))/Ac_norm;                                    % Auto-correlação de canais WSS-US Ac(dt=0,tau)
    
    %% Banda de Coerência: Transformada de Fourier da Autocorrelação: Ac(dt=0,df)
    x1f = Yf(k,:)-mean(Yf(k,:));
    x2f = conj(Yf(k,end:-1:1)-mean(Yf(k,end:-1:1)));
    Ac_norm = var(Yf(k,:))*L;                                               % normalização da auto-correlação
    Ac_df(k,:) = (conv(x1f,x2f))/Ac_norm;                                   % Auto-correlação de canais WSS-US no domínio da frequência Ac(dt=0,df)
end

Ac_dt = zeros(L,2*Nloop-1);                                                 % Sc(dt,dtau=0)
Sc_rho = Ac_dt;                                                              % Sr(dt,df=0)
for l =1:L
    %% Autocorrelação sobre o tempo (Tempo de Coerência): Ac_dt(dt,df=0)
    x1 = Yf(:,l) - mean(Yf(:,l));
    x2 = conj(Yf(end:-1:1,l) - mean(Yf(end:-1:1,l)));
    Ac_norm = x1'*x1;                                                       % normalização da auto-correlação
    Ac_dt(l,:) = (conv(x1,x2));
    Ac_dt(l,:) = Ac_dt(l,:)/Ac_norm;                                        % Auto-correlação de canais WSS-US no domínio da frequência Ac(dt,df=0)
    
    %% Espectro Doppler: Transformada de Fourier da Autocorrelação: Sc(dt,dtau=0)
    Sc_rho(l,:) = fftshift(fft(Ac_dt(l,:),2*Nloop-1));
    Sc_rho(l,:) = Sc_rho(l,:)/max(abs(Sc_rho(l,:)));

end

%% Plotting
%-------------------------------------------------------------------------%
% Respostas ao impulso (vários t's)
%-------------------------------------------------------------------------%
figure;
subplot(2,1,1);
stem(abs(y.'));
ylabel('Resposta ao impulso c(t,n)');
xlabel('Atrasos tau em amostras n');
set(gca,'Xlim',[0 50]);
grid on;
subplot(2,1,2);
plot(linspace(-Bw/2,Bw/2,L),20*log10(abs(Yf.')));
ylabel('Ganho da resposta ao impulso C(t,f) (dB)');
xlabel('Frequência (Hz)');
grid on;
%-------------------------------------------------------------------------%
% Autocorrelações (vários t's)
%-------------------------------------------------------------------------%
figure; stem(tvec(L-30:L+30),abs(Ac_tau(:,L-30:L+30).'));
grid on;
ylabel('Autocorrelação  Ac(dt=0,tau)');
xlabel('Atrasos tau em s');


%-------------------------------------------------------------------------%
% Banda de Coerência
%-------------------------------------------------------------------------%
figure;
stem(fvec,mean(abs((Ac_df))));
ylabel('Autocorrelação  Ac(dt=0,df)');
hx = xlabel('Banda de coerência \Delta{f} (Hz)');
grid on;

%-------------------------------------------------------------------------%
% Espectro Doppler
%-------------------------------------------------------------------------%
figure;
stem((-Nloop+1:Nloop-1)*(1/(2*Ts*L*(2*Nloop-1))),mean(abs(Sc_rho)));
ylabel('Espalhamento Doppler Sc(rho,df=0)');
xlabel('Doppler frequency \rho (Hz)');
grid on;

%-------------------------------------------------------------------------%
% Função de Espalhamento (variação temporal)
%-------------------------------------------------------------------------%
figure;
stem((-Nloop+1:Nloop-1)*Ts*L,mean(abs(Ac_dt)));
ylabel('Autocorrelação  Ac(dt,df=0)');
xlabel('Tempo de coerência (s)');
grid on;


%% MATLAB
y2 = filter(h,[1 zeros(1,bitsize-1)]);
% plot(y2);

Equalização Adaptativa de Canais sem Fio de Banda Larga

Equalização com Adaptação NLMS
% Equalizadores Adaptativos para Canais de Banda Larga: NLMS
%-------------------------------------------------------------------------%
%-------------------------------------------------------------------------%
% Instituto Federal de Santa Catariana
% Campus São José
% Departamento de Telecomunicações
% Curso de Graduação em Engenharia de Telecomunicações
% CSF 29098 - Comunicações sem Fio
%-------------------------------------------------------------------------%
% Professor: Bruno Fontana da Silva (201302270)
% Periodo Letivo: 2015/2
%-------------------------------------------------------------------------%

clear all; clc; close all;
tic;

%% Entradas
M = 3000;                                                                   % número total de símbolos depois do treinamento
Mtr = 3000;                                                                 % número de símbolos de treinamento
L = 80;                                                                    % número de coeficientes do filtro equalizador
D = floor(L/2);                                                             % delay do sinal (em amostras)
Mqam = 4;                                                                   % numero de simbolos da constelação M-QAM
No=1;                                                                       % noise power (not applied here)
SNRmin = 40;                                                                % SNR mínima (1 iter/SNR) ou SNR única (loop para média)
SNRmax = SNRmin;                                                            % SNRmax = SNRmin: ponto único, iterar para calcular a média
% SNRmax = 60;                                                                % SNR máxima, 1 iter/SNR
Np=1;                                                                       % número de pontos calculados no loop (N para a média de ponto único ou Npts de SNR entre SNRmin e SNRmax)
SNRdB = linspace(SNRmin,SNRmax,Np);  Q=length(SNRdB);                       % SNR vector                  [dB]
P = No*10.^(SNRdB/10);                                                      % potência recebida (se ruído de variância unitária for utilizado)        [W]

lambda = 1-(1/Mtr)*5;                                                       % RLS constant (0 < lambda <= 1)
mu = 1;                                                                     % NLMS constant (0 < mu < 2)

%% Modelo do canal sem fio
ts = 100e-9;                                                                % período de símbolo    [s]
fs = 1/ts;                                                                  % largura de banda      [Hz]
fd = 00.1;                                                                    % max. doppler shift    [Hz]

delays = 1e-9*[0 300 700 1100 1700 2500];                                   % atrasos de multipercurso      [s]
powers = [0 -1 -9 -10 -15 -20];                                             % potência dos atrasos          [dB]
ISI_profile = delays./ts;                                                   % espalhamento do canal (ISI) em # de amostras (sample ref = 1)
taps = round(max(ISI_profile));                                             % max. # de amostras de propagação de um símbolo transmitido na ISI
h = rayleighchan(ts,fd,delays,powers);                                      % objeto do canal sem fio (taps rayleigh); PSD Doppler Clarke-Jakes                                                     
% Manter a continuidade do processamento ao longo do tempo:
h.StoreHistory = 1;                                                         % salvar os dados
h.ResetBeforeFiltering = 0;                                                 % continuar o processamento com as características da última filtragem


%% Inicialização de variáveis
fftzeros = zeros(1,100*taps);
erros =zeros(1,Q); niter=zeros(1,Q);
erros2 =zeros(1,Q);
SER = zeros(1,Q);
SER2 = zeros(1,Q);
error_ALG_mean = zeros(1,M+Mtr+D);
w_ALG_mean_abs = zeros(L,Mtr+D+M+1);
w_ALG_mean = zeros(L,Mtr+D+M+1);
Rxx_mean = zeros(L,L);
pvec_mean = zeros(1,L);
Jms_min = zeros(1,Q);
Jms_inf = zeros(1,Q);

%% Modulação MQAM
k = log2(Mqam);                                                             % bits por simbolo
ReSym = -(sqrt(Mqam)-1):2:(sqrt(Mqam)-1);                                   % parte real da constelação
ImSym = -(sqrt(Mqam)-1):2:(sqrt(Mqam)-1);                                   % parte imaginária da constelação
nsym = 0; Cst = zeros(1,Mqam);                                              % inicialização
for pr = 1:length(ReSym)
    for pim = 1:length(ImSym)
        nsym = nsym +1;
        Cst(nsym) = ReSym(pr) + 1i*ImSym(pim);                              % simbolos    
    end
end
Es_norm = (1/Mqam)*sum(abs(Cst).^2);                                        % energia media de simbolo
Cst = (1/sqrt(Es_norm))*Cst;                                                % constelação com energia média unitária

%% Loop Start e sequência de treinamento

% início do Loop "for u=..."
u=Q;                                                                        % ponto de SNR
niter(u)=niter(u)+1;                                                        % número de iterações
s = randsrc(1,Mtr+M,Cst);                                                   % sequência de treinamento: símbolos selecionados da constelação da fonte

%% Transmissão pelo canal sem fio

sest_alg = zeros(1,Mtr+D+M);                                                % sinal equalizado
Rin = zeros(M+Mtr+D,L);                                                     % saídas da memória do equalizador (L amostras)

r = filter(h,[s zeros(1,D)]);                                               % transmissão através de um canal sem fio banda larga

z = sqrt(No/2)*sqrt(1/P(u))*(randn(1,length(r))+1i*randn(1,length(r)));     % ruído awgn    
% z = zeros(1,length(r));                                                   % sem ruído

r = r + z;
d = [zeros(1,D) s];

%% Processamento no Receptor  

%% Equalizador com Adaptação NLMS 

% Inicialização
munorm = zeros(1,Mtr+D+M);                                                  % constante LMS 
wo_alg = zeros(L,1); wo_alg(round(L/2)) = 0;                                % coeficientes iniciais do filtro
wn_alg = zeros(L,Mtr+D+M+1); wn_alg(:,1) = wo_alg;                          % coeficientes do filtro
error_alg = zeros(1,Mtr+D+M);                                               % erro
shat_alg = zeros(1,Mtr+D+M);                                                % estimação / saída do equalizador                                                                            

% Modo de Treinamento (adaptação)
        for k = 1:Mtr+D+M                                                   % da primeira amostra recebida até a última amostra da sequência de treinamento
            for q = 1:L                                                     % deslocamento de amostras no filtro FIR
                if (k-q+1)>=1
                    Rin(k,q) = r(k-q+1);                                    % L últimas amostras
                end               
            end            
            shat_alg(k) = Rin(k,:)*(wn_alg(:,k));                           % s^(k) = [r(k) r(k-1) ... r(k-L)] x [w(L) w(L-1) ... w(1)]'                    
            
            % Detecção:
                if (abs(shat_alg(k)))                                       % verificar se não é amostra nula
                    dist = abs(shat_alg(k)-(Cst)).^2;                       % distância para símbolos da constelação
                    sest_alg(k) = Cst(dist==min(dist));                     % seleciona o símbolo de menor distância
                else
                    sest_alg(k) = 0;
                end 
            if(k<=Mtr+D)                                                    % se k < Mtr, então: Modo de treinamento
                error_alg(k) = d(k) - shat_alg(k);                              % e(k) = s(k-D) - s^_equalizador(k) = d(k) - d^(k)
            else                                                            % se k > Mtr, então: Modo de decisão direta
                error_alg(k) = sest_alg(k) - shat_alg(k);                       % e(k) = s_est_const(k) - s^_equalizador(k)
            end
            
            % Atualização NLMS dos coeficientes do equalizador
            munorm(k) = mu/((Rin(k,:))*((Rin(k,:)')));                                  % normalizar pela potência de  R = [r(k); r(k-1); ... ; r(k-L)]
            wn_alg(:,k+1) = wn_alg(:,k) + munorm(k)*(Rin(k,:)')*(error_alg(k));         % atualização dos pesos:       w(k+1) = w(k) + munorm x R* x e(k)                          

            
        end
        
erros(u) = erros(u)+sum(ne(s(1:Mtr),sest_alg(D+1:Mtr+D)));                  % current number of errors (cumulative)
SER(u) = erros(u)/(niter(u)*Mtr);                                           % current bit error rate

erros2(u) = erros2(u)+sum(ne(s(1+Mtr:end),sest_alg(Mtr+D+1:end)));          % current number of errors (cumulative)
SER2(u) = erros2(u)/(niter(u)*M);                                           % current bit error rate


% Modo de Decisão Direta (sem adaptação)
shat = zeros(1,M); sest = zeros(1,M);
for k = 1:M                                                                 % M símbolos de Payload: equalizador funcionado em modo de decisão direta
    for q = 1:L
        Rin(Mtr+D+k,q) = r(Mtr+D+k-q+1);                                    % L past samples                             
    end

    shat(k) = Rin(k+Mtr+D,:)*(wn_alg(:,Mtr+D+1));                           % s^(k) = [r(k) r(k-1) ... r(k-L)] x [w(L) w(L-1) ... w(1)]'        
    error_alg(k+Mtr+D) = d(k+Mtr+D) - shat(k);                              % e(k) = s(k-D) - s^(k) = d(k) - d^(k)

    % Deteccao:
    dist = abs(shat(k)-(Cst)).^2;
    sest(k) = Cst(dist==min(dist));
            
%   scatt_ddmode;
                       
end
salg2 = sest;
erros2(u) = erros2(u)+sum(ne(s(1+Mtr:end),salg2));                          % current number of errors (cumulative)
SER2(u) = erros2(u)/(niter(u)*M);                                           % current bit error rate

error_ALG_mean = error_ALG_mean + (1/Q)*(abs(error_alg).^2);
w_ALG_mean_abs = w_ALG_mean_abs  + (1/Q)*abs(wn_alg);
w_ALG_mean = w_ALG_mean + (1/Q)*wn_alg;

% fim do Loop "for u=..."
toc;
time=toc;
fprintf('SER: \n')
fprintf('Training / DD Mode: \n')
[SER' SER2']
fprintf('Total elapsed time (min): %d \n',time/60)

%% Plot Area
% Parâmetros de tamanho de fonte, zoom do gráfico e espessuras de linha:
lnwdt = 3.1;                        % Espessura das linhas das curvas
gcalnwdt = 1.2;                     % Espessura do quadro do gca (eixos, bordas)
szmark = 15;                        % Tamanho dos marcadores de pontos
zoom = [-1 20 1e-7 6e-1];           % Visualização dos intervalos XY no gráfico
font.title = 32;                    % Tamanho da fonte no título
font.axes = 28;                     % Tamanho da fonte dos eixos
font.gca = 20;                      % Tamanho da fonte na grade
font.legsize = 20;                  % Tamanho da fonte nas legendas

%% Erro Médio Quadrático (MSE)
% close all;
f1=figure;
plot(10*log10(error_ALG_mean),'k'); grid on; hold on;
title('Convergência do MSE para o Algoritmo NLMS','fontsize',font.title);
xlabel('Samples','fontsize',font.axes); ylabel('MSE (dB)','fontsize',font.axes); 
legend('NLMS: Erro Médio'); set(gca,'fontsize',14,'linestyleorder','-','linewidth',1.4);
% axis([0 M+Mtr+D -25 5])

text_handle = text(Mtr+D,-20,['Fim do Treinamento (' num2str(Mtr+D) ')'],...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','center',...
    'Fontsize',8);
set(text_handle,'BackgroundColor',[1 1 .6],...
    'Edgecolor',[.7 .7 .7]);

%% Convergencia dos coeficientes durante o treinamento
% close all;
f1=figure;
plot(10*log10(w_ALG_mean_abs)'); grid on; hold on;
title('Convergência dos Taps do Filtro Equalizador','fontsize',font.title);
xlabel('Samples','fontsize',font.axes); ylabel('Filter Taps (dB)','fontsize',font.axes); 

text_handle = text(Mtr+D,-20,['Fim do Treinamento (' num2str(Mtr+D) ')'],...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','center',...
    'Fontsize',8);
set(text_handle,'BackgroundColor',[1 1 .6],...
    'Edgecolor',[.7 .7 .7]);

%% Padrão de olho 
% close all;
scatplot = scatterplot(0); grid on;
scatter(real(shat(round(0.8*M):end)),imag(shat(round(0.8*M):end)),'MarkerEdgeColor',[10 10 100]/255,'MarkerFaceColor',[10 10 200]/255,'linewidth',1.5);
hold on;  grid on; axis([-1.5 1.5 -1.5 1.5]);
scatter(real(Cst),imag(Cst),'MarkerEdgeColor', [150 10 10]/255,'MarkerFaceColor',[200 10 10]/255,'linewidth',5);
title('Diagrama de Dispersão de Pontos da Constelação','fontsize',font.title);
xlabel('In-Phase','fontsize',font.axes); ylabel('Quadrature','fontsize',font.axes); 
line([0;0],[-2 2],'color',[10 10 10]/255,'linewidth',3)
line([-2 2],[0;0],'color',[10 10 10]/255,'linewidth',3)
set(gca,'fontsize',15,'linestyleorder','-','linewidth',1.8);
Equalização com Adaptação RLS
% Equalizadores Adaptativos para Canais de Banda Larga: RLS
%-------------------------------------------------------------------------%
%-------------------------------------------------------------------------%
% Instituto Federal de Santa Catariana
% Campus São José
% Departamento de Telecomunicações
% Curso de Graduação em Engenharia de Telecomunicações
% CSF 29098 - Comunicações sem Fio
%-------------------------------------------------------------------------%
% Professor: Bruno Fontana da Silva (201302270)
% Periodo Letivo: 2015/2
%-------------------------------------------------------------------------%

clear all; clc; close all;
tic;

%% Entradas
M = 3000;                                                                   % número total de símbolos depois do treinamento
Mtr = 3000;                                                                 % número de símbolos de treinamento
L = 80;                                                                    % número de coeficientes do filtro equalizador
D = floor(L/2);                                                             % delay do sinal (em amostras)
Mqam = 4;                                                                   % numero de simbolos da constelação M-QAM
No=1;                                                                       % noise power (not applied here)
SNRmin = 40;                                                                % SNR mínima (1 iter/SNR) ou SNR única (loop para média)
SNRmax = SNRmin;                                                            % SNRmax = SNRmin: ponto único, iterar para calcular a média
% SNRmax = 60;                                                                % SNR máxima, 1 iter/SNR
Np=1;                                                                       % número de pontos calculados no loop (N para a média de ponto único ou Npts de SNR entre SNRmin e SNRmax)
SNRdB = linspace(SNRmin,SNRmax,Np);  Q=length(SNRdB);                       % SNR vector                  [dB]
P = No*10.^(SNRdB/10);                                                      % potência recebida (se ruído de variância unitária for utilizado)        [W]

lambda = 1-(1/Mtr)*5;                                                       % RLS constant (0 < lambda <= 1)
mu = 1;                                                                     % NLMS constant (0 < mu < 2)

%% Modelo do canal sem fio
ts = 100e-9;                                                                % período de símbolo    [s]
fs = 1/ts;                                                                  % largura de banda      [Hz]
fd = 00.1;                                                                    % max. doppler shift    [Hz]

delays = 1e-9*[0 300 700 1100 1700 2500];                                   % atrasos de multipercurso      [s]
powers = [0 -1 -9 -10 -15 -20];                                             % potência dos atrasos          [dB]
ISI_profile = delays./ts;                                                   % espalhamento do canal (ISI) em # de amostras (sample ref = 1)
taps = round(max(ISI_profile));                                             % max. # de amostras de propagação de um símbolo transmitido na ISI
h = rayleighchan(ts,fd,delays,powers);                                      % objeto do canal sem fio (taps rayleigh); PSD Doppler Clarke-Jakes                                                     
% Manter a continuidade do processamento ao longo do tempo:
h.StoreHistory = 1;                                                         % salvar os dados
h.ResetBeforeFiltering = 0;                                                 % continuar o processamento com as características da última filtragem


%% Inicialização de variáveis
fftzeros = zeros(1,100*taps);
erros =zeros(1,Q); niter=zeros(1,Q);
erros2 =zeros(1,Q);
SER = zeros(1,Q);
SER2 = zeros(1,Q);
error_ALG_mean = zeros(1,M+Mtr+D);
w_ALG_mean_abs = zeros(L,Mtr+D+M+1);
w_ALG_mean = zeros(L,Mtr+D+M+1);
Rxx_mean = zeros(L,L);
pvec_mean = zeros(1,L);
Jms_min = zeros(1,Q);
Jms_inf = zeros(1,Q);

%% Modulação MQAM
k = log2(Mqam);                                                             % bits por simbolo
ReSym = -(sqrt(Mqam)-1):2:(sqrt(Mqam)-1);                                   % parte real da constelação
ImSym = -(sqrt(Mqam)-1):2:(sqrt(Mqam)-1);                                   % parte imaginária da constelação
nsym = 0; Cst = zeros(1,Mqam);                                              % inicialização
for pr = 1:length(ReSym)
    for pim = 1:length(ImSym)
        nsym = nsym +1;
        Cst(nsym) = ReSym(pr) + 1i*ImSym(pim);                              % simbolos    
    end
end
Es_norm = (1/Mqam)*sum(abs(Cst).^2);                                        % energia media de simbolo
Cst = (1/sqrt(Es_norm))*Cst;                                                % constelação com energia média unitária

%% Loop Start e sequência de treinamento

% início do Loop "for u=..."
u=Q;                                                                        % ponto de SNR
niter(u)=niter(u)+1;                                                        % número de iterações
s = randsrc(1,Mtr+M,Cst);                                                   % sequência de treinamento: símbolos selecionados da constelação da fonte

%% Transmissão pelo canal sem fio

sest_alg = zeros(1,Mtr+D+M);                                                % sinal equalizado
Rin = zeros(M+Mtr+D,L);                                                     % saídas da memória do equalizador (L amostras)

r = filter(h,[s zeros(1,D)]);                                               % transmissão através de um canal sem fio banda larga

z = sqrt(No/2)*sqrt(1/P(u))*(randn(1,length(r))+1i*randn(1,length(r)));     % ruído awgn    
% z = zeros(1,length(r));                                                   % sem ruído

r = r + z;
d = [zeros(1,D) s];

%% Processamento no Receptor  

%% Equalizador com Adaptação RLS 

% Inicialização
% see lambda before loop
wo_alg = zeros(L,1); wo_alg(round(L/2)) = 0;                                % initial filter coefficients
wn_alg = zeros(L,Mtr+D+M+1); wn_alg(:,1) = wo_alg;                          % filter coefficients
if (lambda==1)  % precisão numérica para garantir convergência
    delta = (1-0.999999999999)*var(s(1:L))/L;
else            % ponderação da memória
    delta = (1-lambda)*var(s(1:L))/L; 
end
Po = (1/delta)*eye(L); Pn = Po;                                             % matriz estimada de correlação:  R(k) = (lamb)*R(k-1)+x(k)x(k)', P(k) = inv(R(k))
kn = zeros(L,Mtr+D+M);                                                      % ganho de kalman
error_alg = zeros(1,Mtr+D+M);                                               % erro
shat_alg = zeros(1,Mtr+D+M);                                                % estimação / saída do equalizador

% Modo de Treinamento (adaptação)
        for k = 1:Mtr+D+M                                                   % da primeira amostra recebida até a última amostra da sequência de treinamento
            for q = 1:L                                                     % deslocamento de amostras no filtro FIR
                if (k-q+1)>=1
                    Rin(k,q) = r(k-q+1);                                    % L últimas amostras
                end               
            end            
            shat_alg(k) = Rin(k,:)*(wn_alg(:,k));                           % s^(k) = [r(k) r(k-1) ... r(k-L)] x [w(L) w(L-1) ... w(1)]'                    
            
            % Detecção:
                if (abs(shat_alg(k)))                                       % verificar se não é amostra nula
                    dist = abs(shat_alg(k)-(Cst)).^2;                       % distância para símbolos da constelação
                    sest_alg(k) = Cst(dist==min(dist));                     % seleciona o símbolo de menor distância
                else
                    sest_alg(k) = 0;
                end 
            if(k<=Mtr+D)                                                    % se k < Mtr, então: Modo de treinamento
                error_alg(k) = d(k) - shat_alg(k);                              % e(k) = s(k-D) - s^_equalizador(k) = d(k) - d^(k)
            else                                                            % se k > Mtr, então: Modo de decisão direta
                error_alg(k) = sest_alg(k) - shat_alg(k);                       % e(k) = s_est_const(k) - s^_equalizador(k)
            end
            
            % Atualização RLS dos coeficientes do equalizador
            kn(:,k) = (1/lambda)*((Pn*Rin(k,:)')./(1+(1/lambda)*Rin(k,:)*Pn*Rin(k,:)'));   % atualização do ganho de kalman
            Pn = (1/lambda)*(Pn-kn(:,k)*Rin(k,:)*Pn);                                      % ganho da matriz inversa de autocorrelação
            wn_alg(:,k+1) = wn_alg(:,k)+kn(:,k)*error_alg(k);                              % atualização dos pesos RLS: w(k+1) = w(k) + kn(k) x e(k)          

            
        end
        
erros(u) = erros(u)+sum(ne(s(1:Mtr),sest_alg(D+1:Mtr+D)));                  % current number of errors (cumulative)
SER(u) = erros(u)/(niter(u)*Mtr);                                           % current bit error rate

erros2(u) = erros2(u)+sum(ne(s(1+Mtr:end),sest_alg(Mtr+D+1:end)));          % current number of errors (cumulative)
SER2(u) = erros2(u)/(niter(u)*M);                                           % current bit error rate


% Modo de Decisão Direta (sem adaptação)
shat = zeros(1,M); sest = zeros(1,M);
for k = 1:M                                                                 % M símbolos de Payload: equalizador funcionado em modo de decisão direta
    for q = 1:L
        Rin(Mtr+D+k,q) = r(Mtr+D+k-q+1);                                    % L past samples                             
    end

    shat(k) = Rin(k+Mtr+D,:)*(wn_alg(:,Mtr+D+1));                           % s^(k) = [r(k) r(k-1) ... r(k-L)] x [w(L) w(L-1) ... w(1)]'        
    error_alg(k+Mtr+D) = d(k+Mtr+D) - shat(k);                              % e(k) = s(k-D) - s^(k) = d(k) - d^(k)

    % Deteccao:
    dist = abs(shat(k)-(Cst)).^2;
    sest(k) = Cst(dist==min(dist));
            
%   scatt_ddmode;
                       
end
salg2 = sest;
erros2(u) = erros2(u)+sum(ne(s(1+Mtr:end),salg2));                          % current number of errors (cumulative)
SER2(u) = erros2(u)/(niter(u)*M);                                           % current bit error rate

error_ALG_mean = error_ALG_mean + (1/Q)*(abs(error_alg).^2);
w_ALG_mean_abs = w_ALG_mean_abs  + (1/Q)*abs(wn_alg);
w_ALG_mean = w_ALG_mean + (1/Q)*wn_alg;

% fim do Loop "for u=..."
toc;
time=toc;
fprintf('SER: \n')
fprintf('Training / DD Mode: \n')
[SER' SER2']
fprintf('Total elapsed time (min): %d \n',time/60)

%% Plot Area
% Parâmetros de tamanho de fonte, zoom do gráfico e espessuras de linha:
lnwdt = 3.1;                        % Espessura das linhas das curvas
gcalnwdt = 1.2;                     % Espessura do quadro do gca (eixos, bordas)
szmark = 15;                        % Tamanho dos marcadores de pontos
zoom = [-1 20 1e-7 6e-1];           % Visualização dos intervalos XY no gráfico
font.title = 32;                    % Tamanho da fonte no título
font.axes = 28;                     % Tamanho da fonte dos eixos
font.gca = 20;                      % Tamanho da fonte na grade
font.legsize = 20;                  % Tamanho da fonte nas legendas

%% Erro Médio Quadrático (MSE)
% close all;
f1=figure;
plot(10*log10(error_ALG_mean),'k'); grid on; hold on;
title('Convergência do MSE para o Algoritmo RLS','fontsize',font.title);
xlabel('Samples','fontsize',font.axes); ylabel('MSE (dB)','fontsize',font.axes); 
legend('RLS: Erro Médio'); set(gca,'fontsize',14,'linestyleorder','-','linewidth',1.4);
% axis([0 M+Mtr+D -25 5])

text_handle = text(Mtr+D,-20,['Fim do Treinamento (' num2str(Mtr+D) ')'],...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','center',...
    'Fontsize',8);
set(text_handle,'BackgroundColor',[1 1 .6],...
    'Edgecolor',[.7 .7 .7]);

%% Convergencia dos coeficientes durante o treinamento
% close all;
f1=figure;
plot(10*log10(w_ALG_mean_abs)'); grid on; hold on;
title('Convergência dos Taps do Filtro Equalizador','fontsize',font.title);
xlabel('Samples','fontsize',font.axes); ylabel('Filter Taps (dB)','fontsize',font.axes); 

text_handle = text(Mtr+D,-20,['Fim do Treinamento (' num2str(Mtr+D) ')'],...
    'VerticalAlignment','bottom',...
    'HorizontalAlignment','center',...
    'Fontsize',8);
set(text_handle,'BackgroundColor',[1 1 .6],...
    'Edgecolor',[.7 .7 .7]);

%% Padrão de olho 
% close all;
scatplot = scatterplot(0); grid on;
scatter(real(shat(round(0.8*M):end)),imag(shat(round(0.8*M):end)),'MarkerEdgeColor',[10 10 100]/255,'MarkerFaceColor',[10 10 200]/255,'linewidth',1.5);
hold on;  grid on; axis([-1.5 1.5 -1.5 1.5]);
scatter(real(Cst),imag(Cst),'MarkerEdgeColor', [150 10 10]/255,'MarkerFaceColor',[200 10 10]/255,'linewidth',5);
title('Diagrama de Dispersão de Pontos da Constelação','fontsize',font.title);
xlabel('In-Phase','fontsize',font.axes); ylabel('Quadrature','fontsize',font.axes); 
line([0;0],[-2 2],'color',[10 10 10]/255,'linewidth',3)
line([-2 2],[0;0],'color',[10 10 10]/255,'linewidth',3)
set(gca,'fontsize',15,'linestyleorder','-','linewidth',1.8);

Exercícios

Lista 01 - Telefonia Celular

Material Complementar On-line

Palestra da ANATEL "Sistema Móvel Pessoal no Brasil", 02/06/2015

GSMA - Estatísticas e análise de dados da indústria de comunicações móveis

TELECO - Portal sobre Telecomunicações criado por grupo de profissionais brasileiros

Vídeo sobre perspectivas do 5G para Internet tátil

Informações do 2G ao 5G

Princípios de reuso de frequência em sistemas celulares de telefonia

Práticas de planejamento de sistemas celulares de telefonia

Calculadora Erlang B

Calculadora Erlang C

Simulador de Configuração do AP TP-Link TL-WDR4300

Convolução de Sinais: Aplicativo Java para Visualização

Voltar para CSF-EngTel_(página)