Вы находитесь на странице: 1из 6

Proyecto de Señales Discretas

Tratamiento de audio
Camilo Santamaria-Karen Martinez-Dayer Alvarado
2145548-2134751-2121489
einarcamilo@hotmail.com
Universidad Industrial de Santander
Bucaramanga, Santander, Colombia

I. I NTRODUCCI ÓN III. E FECTO T REMOLO

Trémolo (del italiano tremolo, ”trémulo, tembloroso”), es


Una señal en tiempo discreto x(n), es una función de
un término musical que describe la fluctuación o variación
una variable independiente entera. Gráficamente se representa
periódica en la intensidad (volumen o amplitud) de un sonido,
como en la Figura 1. es importante destacar que una señal
mientras que la altura o frecuencia se mantiene constante.
en tiempo discreto no está definida para instantes entre dos
muestras sucesivas; Igualmente es incorrecto pensar que x(n) Con base en lo aterior se debe cambiar la intensidad perio-
es igual a cero si n no es un entero, simplemente la señal dicamente o senosoidalmente,de esta forma da la impresión y
x(n) no está definida para valores no enteros de n. De esta efecto deseado.
forma poder tratarlas y modificarlas para generar diversas
Listing 1. Implementacion del efecto TREMOLO
salidas aplicando tecnicas adqueridas a lo largo del curso como
lo son los filtros analogicos, transformada Z y de fourier y set(0,'defaulttextinterpreter','Latex')
aproximaciones como diezmado e interpolado. fs=11000; %PERIODO DE MUESTRA
p=wavrecord(5*fs,fs); %GRABAR AUIDIO
wavwrite(p,fs,'voza.wav'); %GUARDAR ESE
AUDIO
1

0.8 filename='voza.wav'; %LLAMAR LA SE AL


0.6 GUARDAD
0.4
[x,Fs,bits] = wavread(filename);
0.2 index = 1:length(x);
0

−0.2
Fc = 10; %FRECUENCIA DEL EFECTO
alpha = 0.5; %AMPLITUD DEL EFECTO
−0.4
trem=(1+ alpha*sin(2*pi*index*(Fc/Fs)))';
−0.6 % CAMBIOS SENOSOIDALES DE AMPLITUD
−0.8
y = trem.*x; %APLICACION DE LOS CAMBIOS A
LA SE AL DE ENTRADA
−1
0 2 4 6 8 10 12
wavwrite(y,Fs,bits,'out_tremolo1.wav'); %
GUARDAR SE AL DE SALIDA
Figura 1. sound(y)

II. O BJECTIVOS % GRAFICAS DE SE ALD DE ENTRADA VS SE AL


DE SALIDA
1. Comprender y analizar la implementacion de diferentes subplot(211),plot(p,'b')
efectos comunes en la reproducciones de sonido. xlabel('Hz')
2. Establecer un filtro con el cual se pueda eliminar ruido title('INPUT SIGNAL')
y señales no deseadas, para esta forma establecer una subplot(212),plot(y,'r')
señal de salida clara y estable. xlabel('Hz')
3. Implementar conocimientos adqueridos en plataformas title('OUTPUT SIGNAL')
como Matlab y Arduino.
INPUT SIGNAL if WIDTH>DELAY
0.3
error('delay greater than basic delay
0.2 !!!');
0.1
return;
end
0 MODFREQ=Modfreq/SAMPLERATE; % modulation
−0.1 frequency in # samples
0 1 2 3 4 5 6
Hz 4
x 10
LEN=length(x); % # of samples in
0.2
OUTPUT SIGNAL WAV-file
L=2+DELAY+WIDTH*2; % length of the
0.1
entire delay
0 Delayline=zeros(L,1); % memory allocation
−0.1
for delay
y=zeros(size(x)); % memory allocation
−0.2 for output vector
0 1 2 3 4 5 6
Hz 4
x 10
for n=1:(LEN-1)
Graficas de la señal de entrada y de salida
M=MODFREQ;
Figura 2. MOD=sin(M*2*pi*n);
ZEIGER=1+DELAY+WIDTH*MOD;
Como se observa hubieron cambios de amplitud de salida i=floor(ZEIGER);
respecto a la entrada, ademas de que en ciertas muestras de frac=ZEIGER-i;
amplitud la salida cae a 0 y en otras llega a su punto máximo Delayline=[x(n);Delayline(1:L-1)];
y de esta manera obtener el efecto TREMOLO. %---Linear Interpolation
-----------------------------
IV. E FECTO V IBRATO y(n,1)=Delayline(i+1)*frac+Delayline(i
Vibrato (del italiano vibrato, ”vibración”), es un término )*(1-frac);
musical que describe la variación periódica de la altura o
frecuencia de un sonido. Se trata de un efecto musical que se %---Allpass Interpolation
útiliza para añadir expresión a la música vocal e instrumental. ------------------------------
El vibrato suele catalogarse en función de dos factores: la %y(n,1)=(Delayline(i+1)+(1-frac)*
cantidad de variación en la altura (((extensión de vibrato))) y Delayline(i)-(1-frac)*ya_alt);
la velocidad con la cual varı́a la altura (((velocidad de vibrato))) %ya_alt=ya(n,1);
. end
Es un efecto simple basado en el retardo .Variando el
retardo de tiempo periódicamente, Si variamos la distancia
entre el observador y una fuente de sonido (véase el efecto Listing 3. Implementacion del efecto VIBRATO
Doppler), aquı́ cambiamos el tono. ,Implementación: una lı́nea fs=12000; %FRECUENCIA DE MUESTREO
de retardo y una baja oscilador de frecuencia (LFO) para
variar el retardo.Solo escucha el retardo - sin avance ni p=wavrecord(5*fs,fs); %GRABAR AUDIO ,
retroceso.Tiempo de retardo tı́pico = 5-10 Ms y frecuencia SE AL DE ENTRADA
del LFO de 5-14Hz. wavwrite(p,fs,'voza.wav'); %GUARDAR AUDIO
Primero definimos la funcion de vibrato para aplicar a la infile = 'voza.wav';
señal. [ x, Fs, N ] = wavread(infile); %DEFINIR
VECTOR
Listing 2. Definiendo la funcion VIBRATO
% Vibrato %DEFINIR LOS PARAMETROS QUE VAN A
function y=vibrato(x,SAMPLERATE,Modfreq, MODIFICAR LA SE AL DE ENTRADA
Width)
ya_alt=0; Modfreq = 10; %NUEVA FRECUENCIA EN KHz
Delay=Width; % basic delay of input Width = 0.0008; % TIEMPO DE RETARDO
sample in sec
DELAY=round(Delay*SAMPLERATE); % basic yvib = vibrato(x, Fs, Modfreq, Width); %
delay in # samples UTILIZANDO LA FUNCION YA DEFINIDA
WIDTH=round(Width*SAMPLERATE); % wavwrite(yvib, Fs, 'out_vibrato.wav');
modulation width in # samples
%GRAFICAR SE AL DE ENTRADA VS SALIDA V. F ILTRO IIR
IIR es una sigla en inglés para Infinite Impulse Response
figure(1) o Respuesta infinita al impulso. Se trata de un tipo de
subplot(211),plot(p,'r'); filtros digitales en el que, como su nombre indica, si la
title('INPUT SIGNAL') entrada es una señal impulso, la salida tendrá un número
xlabel('Hz') infinito de términos no nulos, es decir, nunca vuelve al reposo.
subplot(212),plot(yvib,'b');
title('OUTPUT SIGNAL'); Las principales diferencias respecto a los filtros FIR, es
xlabel('Hz'); que los IIR pueden cumplir las mismas exigencias que los
anteriores, pero con menos orden de filtro. Esto es importante
figure(2) a la hora de implementar el filtro, pues presenta una menor
plot(p,'r') carga computacional.
hold on
plot(yvib,'b') Este tipo de filtros pueden ser inestables, aún cuando se
xlabel('Hz') diseñen para ser estables.
sound(yvib,fs) En principio no pueden diseñarse para tener fase lineal
pero se pueden aplicar algunas técnicas como el filtrado
bidireccional para lograrlo
0.8 .
0.6 INPUT SIGNAL
0.4

0.2

−0.2

−0.4

−0.6

−0.8
0 1 2 3 4 5 6
0.8 Hz 4
x 10
0.6 OUTPUT SIGNAL
0.4

0.2

−0.2

−0.4

−0.6

−0.8
0 1 2 3 4 5 6
4

Grafica del resultado


Figura 3.
Estruptura del FILTRO IIR
Figura 5.

0.8

Donde los bk son realimentaciones de entrada y los ak son


0.6

realimentaciones de salida y por estos ultimos el sistema no


0.4

se estabiliza tan fácil


0.2

0
para diseñar este filtro se tendrı́a que solucionar la ecuación
−0.2
diferencial que da la estruptura de la FIGURA 5, pero Matlab
−0.4
tiene un comonado de diseño del filto digital.
−0.6

−0.8
0 1 2 3 4 5 6
Listing 4. Comando del filtro
Hz 4
x 10

lpFilt=designfilt('bandpassiir', '
INPUT vs OUTPUT FilterOrder', 4, 'PassbandFrequency1',
200, 'PassbandFrequency2', 4000, '
Figura 4.
PassbandRipple', 0.3, 'SampleRate',
8000);
Como es un desplazamiento, la señal de salida se ve
claramente adelantada respecto a la entrada y con esto se logra fvtool(lpFilt)
el efecto deseado. fs=4000;
t=1/fs;
[a,b]=tf(lpFilt); % read in wav sample
[ x, Fs, N ] = wavread(infile); %DEFINIR
Se va a utilizar un filtro útil en la industria, esta desde EL VECTOR A PROCESAR
microfonos de celulares, hasta en cabinas de aviones y es un
filtro pasa banda que solo deja pasar frecuencias de voz, la %IMPLEMENTAR LOS EFECTOS MOSTRADOS
frecuencia de la voz humana va desde los 200Hz hasta los ANTERIORMENTE
4000Hz de esta forma se diseña el filtro de la FIGURA 6.
Los coeficientes obtenidos para este filtro son: Modfreq = 10; %10 Khz
AK = [0,9/0/ − 1,18/0/0,90] Width = 0.0008; % 0.8 Milliseconds

BK = [1/0,18/ − 1,8/ − 0,1/0,8] % Do vibrato

yvib = vibrato(x, Fs, Modfreq, Width);


Magnitude Response (dB)

% write output wav files


-10

wavwrite(yvib, Fs, 'out_vibrato.wav');


-20
Magnitude (dB)

-30 % plot the original and equalised


-40
waveforms

-50
subplot(211),plot(yvib,'b');
-60 subplot(212),plot(y,'r');
title('Vibrato');
0 0.5 1 1.5 2 2.5 3 3.5
Frequency (kHz) xlabel('Hz');
FILTRO IIR, VOZ
sound(yvib,fs)
Figura 6. end

VI. AUDIO EN TIEMPO REAL


La reproducción y grabación de sonido, es la inscripción
eléctrica o mecánica y la recreación de onda sonoras, como
la voz, el canto, la música instrumental o efectos sonoros.

Para el actual proyecto se implementó un grabado de audio


dentro de un ciclo, de esta forma guarda y procesa cada x 10
−3

muestra del ciclo. 3

Listing 5. Comando en Tiemp Real 2


fs=11000;
for x=1:100 %TIEMPO DEL CICLO 1
y=wavrecord(.1*fs,fs); %GRABA LA
MUESTRA 0
0 1000 2000 3000 4000 5000 6000
wavwrite(y,fs,'voza.wav'); % GUARDA
ESE DATO VIBRATO
0.05
l=length(y); %TAMA O DEL VECTOR
nfft=2ˆnextpow2(l); %BUSCA LA POTENCIA 0

DE DOS MAS CERCANA −0.05


y1=fft(y,nfft)/l; %TRANSFORMADA DE −0.1
FOURIER −0.15
f=fs/2*linspace(0,1,nfft/2+1); %NUEVA
−0.2
FRECUENCIA DE MUESTREO 0 200 400 600 800 1000 1200
plot(f,2*abs(y1(1:nfft/2+1))) %GRAFICA Hz

DE LA SE AL DE ENTRADA Tiempo Real vs VIBRATO


pause(0.0000000000000000000000001)
infile = 'voza.wav'; Figura 7.
VII. I MPLEMENTACION DEL CIRCUITO

Circuito de montaje
Figura 8.
Montaje de circuito RC
Figura 10.
Se procedió a la implementación de este circuito con la
finaliadad de realizar una etpa de preamplificación de la señal
adquirida por el micrófono electrico; realizando la variación
de la resistencia R4 logramos aumentar la ganacia imprimida
por el amp op a la señal adquirida por el microfono; reali-
zando estas pruebas observamos que logramos que la señal se
amplificara pero no lo suficiente; pues al ingresar la misma al
arduino, el adc del mismo no logra registrar las variaciones de
la señal, debido a las vibraciones mecánicas producidas sobre
el microfono.

Circuito de Amplificacion
Etapa preamplificacion
Figura 11.
Figura 9.

Como el audio sale muy suave se decide poner un


amplificador en la salida de esta forma el audio sale mas
con este filtro la salida sera una analógica que saldrá al claro
parlante.
VIII. I MPLEMENTACI ÓN RUTINA EN ARDUINO
Código adquisición de señales

Codigo Arduino
Figura 12.

Mediante esta rutina en C++ implementada en arduino, la


idea es lograr adquirir la señal muestreada del ADC para
modelarla en una ecuación en diferencia o hacer los efectos
deseados, la función Analog Read es la que permite realizar
todo esto.

Codigo Arduino con coeficiente


Figura 13.

Al montar las ecuaciones diferenciales gracias a los coefi-


cientes obtenidos anteriormente da el codigo obtenido en la
FIGURA 12.
IX. C ONCLUSION
1. Al cambiar la amplitud y la frecuencia de una señal,
se pueden obtener varios efectos des sonido como los
obtenidos anteriormente.
2. En el momento de implementar el programa de grabar
audio real o en vivo se obtiene que el efecto, pero solo
lo hace a la ultima muestra.
3. Gracias al comando desingfilt se obtienen unos coefi-
cientes los culales forman una ecuación diferencial y de
esa forma saber que se obtiene a la salida.
4. Se tiene que utilizar un filtro RC porque con el otro
circuito se pretendia amplificar una señal analógica, la
cual el arduino no la reconocia.
5. Le debe saber configurar y evaluar la frecuencia de
muestreo para obtener una señal en PWM obtima.

Вам также может понравиться