%% flanger ex Delay %el objetivo de este programa no es solamente la construccion de un %efecto de audio es aprender ciertas reglas basicas de rescribir %y modificar un programa %primero se debe cambiar el nombre al archivo para conservar %el original, de esa forma si metemos las patas no perdemos trabajo %segundo deben leer el programa y susu comentarios para entenderlo %tercero identificar las secciones que se deben modificar %cuarto identificar hasta que punto las modoficaciones pueden %causar errores %quinto dejar comentarios de las modificaciones %% inicializacion clearvars close all; clc; %% lectura archivo de audio %lectura [x,fs,nbits] = wavread('violin.wav'); %tamaņo de muestras del archivo de audio N = length(x); %tiempo Tmin = 0; Tmax = N/fs; t = (0:N-1)/fs; %minimos y maximos de amplitud Xmin = -1.1; Xmax = 1.1; %sonido %sound(x,fs); %graficamos figure(1) plot(t,x); title('violin'); xlabel(' tiempo t (s)'); ylabel('sonido x(t) (Pa)'); legend('x(t)'); grid on; box on; axis([Tmin Tmax Xmin Xmax]); %% flanger %necesitamos duplicar la longitud de la seņal original y del tiempo %con el objetivo de que el efecto no tenga un recorte innecesario y = zeros(2*N,1); %seņal de salida con el doble de tamaņo xx = zeros(2*N,1); %copia de la seņal de entrada con el doble de tamaņo tt =(0:2*N-1)/fs; %tiempo con el doble de tamaņo %hacemos copias de la seņal de entrada y(1:N) = x; %copia de la muestra 1 a la muestra N el resto queda con ceros xx(1:N) = x; %copia de la muestra 1 a la muestra N el resto queda con ceros %lectura de datos %en este punto se necesita entrar con nuevas variables tau1 = input('tiempo de delay en miliseg tau1 = '); tau2 = input('tiempo de delay de profundidad en miliseg tau2 = '); f = input('frecuencia de oscilacion modrate f = '); g = input('ganancia g = '); tau1 = tau1/1000; %convierte a segundos tau2 = tau2/1000; %convierte a segundos N1 = round(fs*tau1); N2 = round(fs*tau2); for n = (N1 + N2 + 1) : (2*N) y(n) = xx(n) + g*y(n - N1 - round( N2*sin(2*pi*f*tt(n)) ) ); end; %se ha modificado el inicio del ciclo for de N1+1 a N1+N2+1 %esto garantiza que comenzamos desde el incio del arreglo %se ha cambiado la indexacion variable del arreglo y %desde y(n- N1) a y( n - N1 - round( N2*sin(2*pi*f*tt(n) ) ) %round nos garantiza indices enteros para el arreglo %este pedazo antiguo lo hemos comentado con el objetivo de %tener informacion % %numero de muestras de delay % Ndelay = round(fs*tau); %round() redondea a un numero entero de muestras % %para indexar adecuadamente el o los elementos % %del arreglo % % for n = Ndelay+1:2*N % y(n) = xx(n) + g*y(n - Ndelay); % end; %normalizamos la seņal de salida y = 0.95*y/max(y); %max(y) determina el maximo elemento del arreglo %sonido sound(y,fs); %graficamos figure(2) plot(tt,y); title('violin flanger'); xlabel('tiempo t (s)'); ylabel('sonido y(t) (Pa)'); legend('x(t)'); grid on; box on; axis([Tmin 2*Tmax Xmin Xmax]);