%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    Leonardo Mattos - 12/2010    %
%  leonardo (at) mail.analyx.org  %
%          www.analyx.org         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%simulação de tecom
%modulacao SSB de sinais de voz.

matlabpool; %chama o lance pra paralelizar o que for possível

clear all; % Limpar o ambiente, para evitar desastres

format('long'); %Formato mais apresentável

sinal1_file = 'sinal1.wav'; %Arquivo do Sinal1
sinal2_file = 'sinal4.wav'; %Arquivo do Sinal2
s1_filtrado_file = 'sinal1_filtrado.wav'; %Arquivo do Sinal1
s2_filtrado_file = 'sinal4_filtrado.wav'; %Arquivo do Sinal2

%Lendo os arquivos de som
sinal1 = wavread(sinal1_file);
sinal2 = wavread(sinal2_file);

%Variaveis globais
Fs = 8e3;
Fs2 = 16e3;

%forma de onda do sinal1 no tempo
geraOnda('Forma de Onda do Sinal 1 no Tempo',sinal1,1,Fs);

%forma de onda do sinal2 no tempo
geraOnda('Forma de Onda do Sinal 2 no Tempo',sinal2,2,Fs);

Fs2 = 16e3; % dobro da amostragem
%espectro do sinal 1            
geraEspectro('Espectro de apenas uma lado do Sinal 1',sinal1,0,4.5e3,0,8e-3,3,Fs2);

%espectro do sinal 2
geraEspectro('Espectro de apenas uma lado do Sinal 2',sinal2,0,4.5e3,0,8e-3,4,Fs2);

% Modulacao do sinal 2 em AM-SSB-USB
fc = 4e3; % Freq da portadora
m = sinal2; % sinal modulante
mh = hilbert(m); % transformada de hilbert do sinal modulante
sinalusb = zeros(1,1);
texp = (0:length(sinal2)-1)*(1/Fs);
parfor i = 1:length(texp);
    sinalusb(i) = m(i)*cos(2*pi*fc*texp(i))-mh(i)*sin(2*pi*fc*texp(i));
end

% sinal usb no dominio do tempo
figure(5);
geraOnda('Forma de Onda do Sinal 2 Modulado em USB no Dominio do tempo',sinalusb,5,Fs);

%espectro do sinal usb
geraEspectro('Espectro de apenas uma lado do Sinal USB',sinalusb,4.5e3,9e3,0,8e-3,6,Fs2);

%Multiplexacao dos sinais sinal1 e sinalusb
sinalmult = zeros(1,1);
L1 = length(sinal1);
L2 = length(sinalusb);

if L1 > L2 
    limsup = L1;
    liminf = L2;
else 
    limsup = L2;
    liminf = L1;
end

%soma dos dois sinais
for i = 1:limsup
    if i<liminf
        sinalmult(i) = sinal1(i)+sinalusb(i);
    elseif i>liminf && L2>L1
        sinalmult(i) = sinalusb(i);
    elseif i>liminf && L1>L2
        sinalmult(i) = sinal1(i);
    end
end 

%espectro dos sinais multiplexados
geraEspectro('Espectro de apenas uma lado do Sinal Multiplexado',sinalmult,0,9e3,0,8e-3,7,Fs2);

%Demultiplexação dos sinais
%retirar sinal1
hlp = fir1(Fs,0.5);
sinal1_filtrado = conv(hlp,sinalmult);
geraOnda('Forma de Onda do Sinal 1 Demultiplexado',sinal1_filtrado,8,Fs);

%espectro do sinal 1 filtrado
geraEspectro('Espectro de apenas uma lado do Sinal 1 Filtrado',sinal1_filtrado,0,4.5e3,0,8e-3,9,Fs2);

%escrever o sinal1_filtrado em arquivo wav
wavwrite(sinal1_filtrado,Fs,'s1_filtrado_file');

%filtrar sinal 2
hhp = fir1(Fs,0.5,'high');    
sinal2_filtrado = conv(hhp,sinalmult);
geraOnda('Forma de Onda do Sinal 2 Filtrado do Sinal Multiplexado',sinal2_filtrado,10,Fs);

%espectro do sinal 2 filtrado ainda multiplexado
geraEspectro('Espectro de apenas uma lado do Sinal 2 Filtrado ainda Multiplexado',sinal2_filtrado,0,9e3,0,8e-3,11,Fs2);

%demultiplexacao do sinal 2 filtrado
sinal2demux = zeros(1,1);
L = length(sinal2_filtrado);
t2 = (0:(L-1))*(1/Fs);
parfor i = 1:L
   sinal2demux(i) = cos(2*pi*fc*t2(i))*sinal2_filtrado(i); 
end

%forma de onda no tmepo do sinal filtrado e demultiplexado
geraOnda('Forma de Onda do Sinal 2 Filtrado e Demultiplexado',sinal2demux,12,Fs);

%gerar espectro do sinal2 já filtrado e demultiplexado
geraEspectro('Espectro de apenas uma lado do Sinal 2 Filtrado Demultiplexado',sinal2demux,0,4.5e3,0,8e-3,13,Fs2);

%filtrar o sinal2 demodulado
hlp2 = fir1(Fs,0.4);
sinal2demux_filtrado = conv(hlp2,sinal2demux);
geraOnda('Forma de Onda do Sinal 2 Demodulado e Filtrado',sinal2demux_filtrado,14,Fs);

%gerar espectro do sinal2 filtrado demodulado e filtrado
geraEspectro('Espectro de apenas uma lado do Sinal 2 Filtrado Demultiplexado',sinal2demux_filtrado,0,4.5e3,0,8e-3,15,Fs2);

%escrever o sinal2_filtrado em arquivo wav
wavwrite(sinal2demux_filtrado,Fs,'s2_filtrado_file');
