%% Teste filtros passa faixa e rejeita faixa

clear all; close all; clc

%% Par�metros da simula��o

% Frequ�ncias de corte
fc1 = 50;
fc2 = 100;

% Frequ�ncia do sinal senoidal de teste
fo = (fc1 + fc2)/2;

% Tipo de sinal de teste
%     'Senoidal'    'Aleatorio'
sinal_teste = 'Senoidal';

% N�mero de amostras do sinal de entrada
N = 1000;
n = 0:N-1;

% Tamanho dos filtros
M = 1000;

% Frequ�ncia de amostrage
fs = 1000;
ts = 1/fs;

%% Filtro passa faixa
%
% Nesta se��o um filtro passa faixa ser� constru�do

% Parametros do filtro (rad/s)
wc1 = 2*pi*fc1;  
wc2 = 2*pi*fc2; 
n = -M/2 : M/2 - 1;


h = (wc2/pi)*sinc(wc2*n*ts/pi) - (wc1/pi)*sinc(wc1*n*ts/pi);
%h = 1/(pi).*[(sin(wc2.*n) -sin(wc1.*n))./n];
% Calculando a resposta em frequ�ncia do filtro
H = fftshift(fft(h,M))/M;

% Eixo das frequ�ncias
f = linspace(-fs/2,fs/2,M);

% Exibindo os resultados
figure;
subplot(2,1,1); plot(h); title('Filtro passa faixas'); xlabel('n'); ylabel('h[n]')
subplot(2,1,2); plot(f,abs(H)); xlabel('f'); ylabel('|H(f)|')

%% Teste do filtro
%
% Um sinal ser� passado no filtro, visando constatar a real resposta

% Escolhendo o tipo de sinal a ser usado
if strcmpi(sinal_teste, 'Senoidal')    
    % Usando o sinal senoidal
    x = sin(2*pi*fo*n*ts);    
elseif strcmpi(sinal_teste, 'Aleatorio')
    % Usando um sinal aleat�rio
    x = randn(1,N);
end

% Passando o sinal no filtro
y = filter(h,1,x);

% Calculando a transformada de Fourier
Y = fftshift(fft(y,N))/N;

% Eixo das frequ�ncias
f = linspace(-fs/2,fs/2,N);

% Exibindo os resultados
figure
subplot(2,1,1); plot(y); title('Sinal filtrado passa faixas'); xlabel('n'); ylabel('y[n]')
subplot(2,1,2); plot(f,abs(Y)); xlabel('f'); ylabel('|Y(f)|')

%% Filtro rejeita faixa
%
% Nesta se��o um filtro rejeita faixa ser� constru�do

% Usando a fun��o criada
wc1 = 2*pi*fc1; % frequencia 1
wc2 = 2*pi*fc2;

M = M / 2;

n = -M:M;

vRej = zeros(1, length(n));

for i = 1:length(n)
   
    if n(i) == 0
        vRej(i) = 1 - ((wc2 - wc1) / pi);
    else
        vRej(i) = (1/(pi * n(i) * ts)) * (sin(wc1 * n(i) * ts) - sin(wc2 * n(i) * ts));
    end
end

h = vRej;

% Calculando a resposta em frequ�ncia do filtro


H = fftshift(fft(h,M))/M;

% Guardando as respostas para comparações futuras
h_f = h;
H_f = H;

% Eixo das frequ�ncias
f = linspace(-fs/2,fs/2,M);

% Exibindo os resultados
figure;
subplot(2,1,1); plot(h); title('Filtro rejeita faixas'); xlabel('n'); ylabel('h[n]')
subplot(2,1,2); plot(f,abs(H)); xlabel('f'); ylabel('|H(f)|')

%% Teste do filtro
%
% Um sinal ser� passado no filtro, visando constatar a real resposta

% Escolhendo o tipo de sinal a ser usado
if strcmpi(sinal_teste, 'Senoidal')    
    % Usando o sinal senoidal
    x = sin(2*pi*fo*n*ts);    
elseif strcmpi(sinal_teste, 'Aleatorio')
    % Usando um sinal aleat�rio
    x = randn(1,N);
end

% Passando o sinal no filtro
y = filter(h,1,x);

% Calculando a transformada de Fourier
Y = fftshift(fft(y,N))/N;

% Eixo das frequ�ncias
f = linspace(-fs/2,fs/2,N);

% Exibindo os resultados
figure
subplot(2,1,1); plot(y); title('Sinal filtrado rejeita faixas'); xlabel('n'); ylabel('y[n]')
subplot(2,1,2); plot(f,abs(Y)); xlabel('f'); ylabel('|Y(f)|')








