You are on page 1of 6

Cdigos MATLAB

La implementacin de los filtros se realiz en primer lugar en MATLAB, donde no


habra que tener tantas precauciones respecto del manejo de memoria como lo ser la
implementacin en el !"# !e implement un dela$, re%erberacin $ modulacin en
anillo# Los cdigos se presentan a continuacin&
function f2 = delay(segundos);

[x,fs,nbits]=wavread('1.wav');read in wav file
xlen=lengt!(x);

a=".#;
$=segundos%fs;
y=&eros(si&e(x));

filter t!e signal

for i=1'1'$(1
y(i) = x(i);
end

for i=$(1'1'xlen
y(i)= x(i)( a%x(i)$);
end;

wavwrite(y,fs,*,'+elay.wav')
'uadro ( 'digo de dela$#m
function f2 = reverberacion(segundos);

[x,fs,nbits]=wavread('1.wav');read in wav file
xlen=lengt!(x);

,=".#;
$=fs%segundos;-alculate t!e nu.ber of sa./les in t!e delay
y=&eros(si&e(x));

filter t!e signal

for i=1'1'$(1
y(i) = x(i);
end

for i=$(1'1'xlen
y(i)= x(i)( ,%y(i)$);
end;

wavwrite(y,fs,*,'$everberaci0n.wav')
'uadro ) 'digo de re%erberacin#m
function f2 = anillo(frec);

[x,fs,nbits]=wavread('1.wav');read in wav file
xlen=lengt!(x);
t=lins/ace(",xlen1fs,xlen);
.oduladora = sin(frec%/i11*"%t);

y=&eros(si&e(x));

for i=1'1'xlen

y(i)= .oduladora(i)%x(i);
end;

wavwrite(y,fs,nbits,'2nillo.wav')

'uadro ( 'digo de anillo#m
Cdigos DSP / PIC
La implementacin de los cdigos en los microcontroladores de la placa se realizar en
'# A grandes rasgos, ambos cdigos efect*an inicializaciones de sus registros $ puertos,
para luego entrar en un loop donde se realiza la accin# A continuacin, se muestran los
cdigos implementados, correspondientes a los archi%os dsp.c, efectos.c, efectos.h $
pic.c&
3include 4stdio.!5
3include 4stdlib.!5
3include 4signal.!5
3include 6efectos.!6
3include 6defines.!6


void s/i7init(); 1%iniciali&a /uertos
89:%1
void global7init(); 1% :niciali&aciones
generales%1
void .cas/7init(float %buffer); 1% :niciali&a el /uerto ;c289
utili&ado%1
void !andler(s!ort int signal); 1%.ane<ador de
interru/ciones%1
void errores(s!ort int codigo); 1%.ane<ador de errores%1

1%buffer /ara guardar las entradas%1
float %buffer;
enu. efecto efecto7actual;

void .ain()=

1%$eserva.os .e.oria /ara el buffer a i./le.entar (circular)%1
buffer = (float %) calloc(>2$,?7@ABBC$%si&eof(float));

1%:niciali&a.os los /uertos de entrada y salida%1
s/i7init();
global7init();
.cas/7init(buffer);

1%9or defecto, el efecto a a/licar serD el +elay%1
efecto7actual = +elay;

1%se inicia la a/licaci0n de los filtros%1
w!ile(1)=
switc!(efecto7actual)=
case $everberacion' reverb(buffer, Eefecto7actual);
breaF;
case 2nillo' anillo(buffer, Eefecto7actual); breaF;
case +elay' delay(buffer, Eefecto7actual); breaF;
case Ccuali&ador' ecuali&ador(buffer, Eefecto7actual);
breaF;
default' breaF;
G
G
free(buffer)
G

void s/i7init()=
1%8etear 89:" )5 ;aster +89, 8lave ;e.oria %1
1%8etear 89:1 )5;aster +89,8lave 9:-%1
if(error)
errores(C$$?$789:);
G

void global7init()=
1%8etear cualHuier cosa Hue no se !aya seteado, co.o los ,9:?%1
if(error)
errores(C$$?$7,>?@2>);
G

void .cas/"7init(s!ort int %buffer)=
1%8etear /uerto ;c289%1
if(error)
errores(C$$?$7;-289);
G

void !andler(s!ort int signal)=
1%8i la interru/ci0n fue desde el 9:-, /or 89:, se ca.bia el
efecto actual%1
if(signal == 8:,79:-)
efecto7actual = 89:17read();
G

void errores(s!ort int codigo)=
1%8e .uestra un c0digo del error%1
encender7leds(codigo);
1%9ara dar tie./o de .ostrar el error con los led's%1
slee/(2);
1%o $esetI%1
exit(CJ:K7B2:>A$C);
G
'uadro ( 'digo de +dsp#c,
3include efectos.!

1%se considera Hue las funciones .cas/7read y .cas/7write leen y escriben
el valor de la .uestra en el%1
1%codec, escribiendo en el registro corres/ondiente%1

void reverb(s!ort int %buffer, enu. efecto %efecto7actual)=
float aux, desfase, factor;
float %buffer7out; 1%en este caso, se !ace necesario tb guardar las
salidas del filtro%1
unsigned s!ort int /untero, contador;

factor=".#;
buffer7out = (float %) calloc(>2$,?7@ABBC$%si&eof(float));
desfase = ".#; 1%.edio segundo%1

/untero=";
1%;ientras siga.os con este efecto%1
w!ile(%efecto7actual == $everberacion)=
1%escribo el dato en la /osici0n sgte%1
.cas/7read(buffer[/untero]);
aux = "; contador = ";

if(/untero)desfase%fs 5= ") 1%si no !a dado la vuelta%1
aux = buffer[/untero] ( factor%buffer7out[/untero)
desfase%fs];
else 1%si dio la vuelta al buffer%1
aux = buffer[/untero] ( factor%buffer7out[>2$,?7@ABBC$(
(/untero)desfase%fs)]; 1%y se escribe la salida%1

.cas/7write(aux);
buffer7out[/untero] = aux;
1%si se /as0 del buffer, lo /one.os al inicio%1
if(/untero((5=>2$,?7@ABBC$) /untero =";
G
1%8i se de<a de usar este efecto, se libera la .e.oria del buffer
extra%1
free(buffer7out);
G
void anillo(s!ort int %buffer, enu. efecto %efecto7actual)=
float aux, valor7anterior;
unsigned s!ort int /untero, contador;
aux=";
/untero=";

1%;ientras siga.os con este efecto%1
w!ile(%efecto7actual == 2nillo)=
.cas/7read(buffer[/untero]);
aux = buffer[/untero(
(]%sin(frec7.od%9i11*"%(valor7anterior(11fs));
valor7anterior (= 11fs;
.cas/7write(aux);
if(/untero((5=>2$,?7@ABBC$) /untero =";
G
G

void anillo(s!ort int %buffer, enu. efecto %efecto7actual)=
float aux, valor7anterior;
unsigned s!ort int /untero, contador;
aux=";
/untero=";

1%;ientras siga.os con este efecto%1
w!ile(%efecto7actual == 2nillo)=
.cas/7read(buffer[/untero]);
aux = buffer[/untero(
(]%sin(frec7.od%9i11*"%(valor7anterior(11fs));
valor7anterior (= 11fs;
.cas/7write(aux);
if(/untero((5=>2$,?7@ABBC$) /untero =";
G
G

void delay(s!ort int %buffer, enu. efecto %efecto7actual)=
float aux, desfase, factor;
unsigned s!ort int /untero, contador;
desfase = ".#; 1%.edio segundo%1
factor=".#;
/untero=";
1%;ientras siga.os con este efecto%1
w!ile(%efecto7actual == +elay)=
1%escribo el dato en la /osici0n sgte%1
.cas/7read(buffer[/untero]);
aux = "; contador = ";

if(/untero)desfase%fs 5= ") 1%si no !a dado la vuelta%1
aux = buffer[/untero] ( factor%buffer[/untero)
desfase%fs];
else 1%si dio la vuelta al buffer%1
aux = buffer[/untero] ( factor%buffer[>2$,?7@ABBC$(
(/untero)desfase%fs)];

1%y se escribe la salida%1
.cas/7write(aux);
1%se 6.ueve6 el /untero; si se /as0 del buffer, lo /one.os al
inicio%1
if(/untero((5=>2$,?7@ABBC$) /untero =";
G
G

void ecuali&ador(s!ort int %buffer, enu. efecto %efecto7actual)=
1%Balta i./le.entar convoluci0n /ara a/licar los filtros en
/aralelo y re.e&clar%1
G
'uadro ( 'digo de +efectos#c,
3include 4.at!.!5
3define >2$,?7@ABBC$ 2""""

enu. efecto =$everberacion, 2nillo, +elay, Ccuali&adorG;

void reverb(float %buffer);
void anillo(float %buffer);
void delay(float %buffer);
void ecuali&ador(float %buffer);
'uadro ( 'digo de +efectos#h,
3include 61*B2##".!6
3include 6usb.!6
3include 6rs2L2.!6

3define 89:7;28KC$ "
3define 89:78>2MC 1
3define >2$,?792>2@$2 2

void ;8897init(s!ort int /uerto); 1%iniciali&a /uerto
serial%1
void iniciali&acion7/ic();
void !andler(s!ort int signal); 1%.ane<ador de
interru/ciones%1
void errores(s!ort int codigo);

s!ort int atender;
s!ort int %buffer;
void .ain()=

unsigned s!ort usb;
iniciali&acion7/ic();
usb = $-"; 1% '1' /ara A8@ %1
;8897init(89:78>2MC);

buffer = (s!ort int %) calloc(>2$,?792>2@$2%si&eof(s!ort int));
atender = ";

w!ile(1)=
if(atender)=
if(usb) read7usb(buffer);
else read7rs2L2(buffer);
s/i7write(buffer);
atender = ";
G
G
free(buffer)

G
void !andler(s!ort int signal)=
if(signal==A8@ E signal==$82L2)
atender = 1;
G
'uadro ( 'digo de +pic#c,

You might also like