%% Ejemplo de filtros sobre fragmento de música
% (c) Antonio Sala, 2017. Universitat Politècnica de València, España. Todos los derechos reservados.
% Vídeo-presentación en: http://personales.upv.es/asala/YT/V/filtml1.html
% Objetivos: Comprender el funcionamiento de los filtros paso alto/bajo/banda continuos, examinando su efecto sobre un fragmento musical.
% Nota: los filtros continuos eran una opción de implementación usual en 1960-1980. Hoy en dia, excepto en electrónica de potencia (fuentes de alimentación, inversores, ...) para procesado de audio (como en este ejemplo), el procesado suele ser digital, usando filtros discretos [https://en.wikipedia.org/wiki/Digital_filter].
%
%%
%% Lectura del archivo
% Música: Hep Cat Jive, Purple planet music, Geoff Harvey, Manchester, UK.
% Licencia de música: Archivo libre para  uso no comercial de http://www.purple-planet.com/jazz/4583971402

[cancion.muestras,cancion.frecmuestreo]=audioread('HepCatJive_purpleplanetmusic.mp3');
size(cancion.muestras)
cancion.frecmuestreo

%  nos quedamos con los primeros 4 segundos para escuchar.

duracion=4;
cancion.muestras=cancion.muestras(1:(duracion*cancion.frecmuestreo),:);
size(cancion.muestras)

%
%% diseño de filtros


s=tf('s');%control system toolbox
frec_corte=3000*2*pi;
FiltroPasoAlto=s/(s+frec_corte)
bodemag(FiltroPasoAlto), grid on
frec_corte=400*2*pi;
FiltroPasoBajo=1/(s/frec_corte+1)
bodemag(FiltroPasoBajo), grid on

FiltroPasoBanda=FiltroPasoAlto*FiltroPasoBajo*8.4
bodemag(FiltroPasoBanda), grid on


%
%% Vamos a escucharlo
% Nota: para poder apreciar las diferencias acústicas percibidas al utilizar los filtros, deberá ser reproducido en unos altavoces/auriculares con suficiente "ancho de banda". En equipos audio de baja calidad (pareja de altavoces pequeños de escritorio), los bajos saturarán y producirán distorsión armónica, y el ancho de banda limitado (pocos graves y pocos agudos) hará que no sea muy diferente la percepción acústica con/sin filtro paso banda.


Filtro=FiltroPasoBajo;
reproduce(cancion)

Filtra_y_reproduce(FiltroPasoBajo^2,cancion)
Filtra_y_reproduce(FiltroPasoAlto^2,cancion)
Filtra_y_reproduce(FiltroPasoBanda^2,cancion)
reproduce(cancion)
%enfatizamos graves y agudos a voluntad...
Filtra_y_reproduce(1+FiltroPasoBajo^2*1.5+FiltroPasoAlto^2*1.5,cancion)



%
%% Funciones auxiliares
%

function cancionFiltrada=Ecualizador(cancion,Filtro)
    numcanales=size(cancion.muestras,2);
    FiltroStereo=Filtro*eye(numcanales);
    Muestras=cancion.muestras;
    frecmuestreo=cancion.frecmuestreo;  PeriodoMuestreo=1/frecmuestreo;
    TiemposMuestras=(0:(size(Muestras,1)-1))*PeriodoMuestreo;
    MuestrasF=lsim(FiltroStereo,Muestras',TiemposMuestras);
    cancionFiltrada.muestras=MuestrasF;
    cancionFiltrada.frecmuestreo=frecmuestreo;
end

function reproduce(cancion)
    soundsc(cancion.muestras,cancion.frecmuestreo);
    pause(size(cancion.muestras,1)/cancion.frecmuestreo); %esperamos mientras escuchamos música
    pause(0.5); %medio segundo extra de pausa entre canción y canción
end

function Filtra_y_reproduce(Filtro,cancion)
        reproduce(Ecualizador(cancion,Filtro))
end