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 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;
/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""""
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()=