%%COMECO GUIAO 6
Ta=0.5;
t= [0:0.5:10]';
r=2* sin(4*pi*t); %sinal do ruido com alterações em phi, de acordo com o numero de amostrass necessarias passada na função
x=cos(2*pi*t)+r;
[x1,f] = DFT(x,0.5); %%RECEBEMOS O SINAL E A FREQUENCIA (RELACIONADOS) %% OBSERVAMOS O RUIDO, que se encontra fora do range de frequencias 5 a -5
filtro_de_frequencias = ones(size(f)); filtro_de_frequencias(f>3) = 0; filtro_de_frequencias(f<-3) = 0; %%Criação do filtro nas frequencias entre -5 e 5, ou seja, o que queremos
y=filtro_de_frequencias.*x1; %%filtro aplicado ponto a ponto sobre o sinal relacionado a frequencia
[y1,t] = IDFT(y,f);

filtro_de_frequencias_ruido = zeros(size(f));filtro_de_frequencias_ruido(f<3) = 1;filtro_de_frequencias_ruido(f>-3) = 1; %% as componentes fora do range que queremos escutar 5hz, serão como 1, ou seja, teremos uma filtro totalmente aliasing
y=filtro_de_frequencias_ruido.*x1;
[y2,t] = IDFT(y,f);
10*log10(potencia(y1)/potencia(y2))

%


%%A potencia de uma sinusoide tambem pode ser calculada como
%%(AMPLITUDE/SQRT(2))^2

%%O NUMERO DE BITS SIGNIFICATIVOS É O NUMERO MINIMO DE BITS QUE PRECISAMOS
%%PARA REPRESENTAR AQUELE SINAL SEM OS RUIDOS

%%O SNR (RELACAO SINAL RUIDO) NOS INDICA UM VALOR DADO PELA (POTENCIA DO
%%SINAL/POTENCIA DO RUIDO)

%O NUMERO DE BITS SIGNIFICATIVO PARA UMA DETERMINADA SNR É DADO POR
%(SNR-1,76/6.02)


%%QUANTO MAIOR O SNR, MENOR O RUIDO
%%QUANTO MENOR O SNR, MAIOR O RUIDO

%1 QUESTAO
[x,t] =  GeraSinal(1000,0.01);
plot(t,x);
legend("Sinal Gerado com ruído")




plot(t,x,t,y2); %plot do sinal em azul e apenas do ruido em laranja


%%VAMOS AGORA CALCULAR A POTENCIA USANDO O SINAL SEM RUIDO E O SINAL APENAS
%%DO RUIDO



 %%USAMOS ESTE LOG PARA DARMOS O RESULTADO EM DB

%

function [resultado]  = potencia(vetor_amostras)
    resultado = sum(vetor_amostras.^2)/length(vetor_amostras);
end


function[x,t] = GeraSinal(N,Ta)

 n1=random('normal',0,pi,N,1);
 n2=random('normal',0,pi,N,1);
 phi1=zeros(N,1);
 phi2=zeros(N,1);
 for n=2 : N
    phi1(n)= phi1(n-1)+n1(n)*Ta;
     phi2(n)= phi2(n-1)+n1(n)*Ta; %vou somando os proximos retangulos para calcular a integral necessaria
 end
 % sinal sem ruido, deterministico
end

function [x,f] = DFT(x,Ta)
fa = 1/Ta;
N = length(x);
f = [0:(N-1)]'/ (N*Ta) - fa/2;  
x = fftshift(fft(x)/N);
end

function [x,t] =  IDFT (X,f)  %oposto da DFT
  N = length(X);
  fa = -f(1)*2;     %%sabemos que o primeiro f(1) é sempre -fa/2, logo basta usar um jogo matemático
  Ta = 1/fa;
  t = [0:(N-1)]'*Ta;
  x = ifft(ifftshift(X)) * N; 
end