Você está na página 1de 12

Projeto Final Efeitos de udio Digitais para Guitarra

Pedro Ivo da Cruz

Professor Dr. Celso Kurashima Santo Andr 2014

1. Introduo O processamento digital de sinais de udio se tornou muito importante com o crescimento dos sistemas multimdia nas ltimas dcadas. Aplicaes como equalizao, efeitos sonoros, compresso, filtragem, eliminao de rudos, so todos exemplos nos quais o processamento digital de sinais ajuda na resoluo dos problemas. Na msica, existem diversos efeitos sonoros que so aplicados aos sinais dos instrumentos musicais com o objetivo de atingir um som especfico. Efeitos como compresso, distoro, reverb e delay e equalizadores so muito usados com o intuito de proporcionar um timbre diferente aos instrumentos. Alguns artistas utilizam processamento digital de udio tambm com o intuito de emular timbres de outros instrumentos e equipamentos de at mesmo outras pocas. Modelagem Inicialmente, a inteno foi de montar efeitos de acordo com o diagrama mostrado na figura 1.

Figura 1 Diagrama de blocos geral do projeto. Porm, devido a restries de Hardware e a no implementao de todos os efeitos desejados inicialmente, como o equalizador e efeitos de modulao como chorus, o diagrama de blocos final o exibido na figura 2.

Figura 2 Diagrama de blocos geral final do projeto.

Distoro e Over Drive Efeitos como Over Drive e a distoro se encaixam em uma categoria de processamento de sinais no-linear. Eles criam intencionalmente harmnicas que no estavam presentes originalmente no sinal. A figura 3 mostra como essa no linearidade se d no caso de uma onda senoidal aplicada a entrada do sistema, comparado a um sistema linear.

Figura 3 Efeitos de um sistema no-linear comparado a um sistema linear. A diferena entre o Over-Drive e a Distoro se d pelo nvel de no linearidade do sinal. Como pode-se observar na figura 3, ocorre uma limitao na amplitude do sinal. Essa limitao conhecida como clipping. Qu ando essa limitao no ocorre de maneira brusca, mas com uma transio suave (Soft-Clipping), temos o efeito conhecido como Over Drive. Quando essa limitao ocorre com uma transio muito abrupta (Hard-Clipping), temos o efeito conhecido como Distoro. Uma abordagem para simular o Soft-Cliping, a qual foi implementada no DSP, a seguinte:

Uma abordagem para o Hard-Clipping, a qual foi implementada no DSP, a seguinte:

Reverb O efeito de Reverb uma tentativa de simular a propagao do som em um ambiente especfico, como em um corredor ou em uma catedral. Ele pode ser implementado facilmente realimentando o sinal com ele mesmo, atrasado no tempo. Essa estrutura pode ser vista na figura 4.

Figura 4 Estrutura bsica de um Reverb. Como pode ser visto, a estrutura semelhante de um Delay, porm com o coeficiente D, muito menor, de forma que se torne imperceptvel para o ouvido humano identificar o atraso, notando apenas uma continuidade do som, com uma certa atenuao.

Tremolo Efeitos de modulao altera alguma caraterstica do sinal do instrumento, como amplitude, frequncia ou fase, a partir da variao de um outro sinal, como por exemplo uma onda senoidal. O efeito de tremolo altera a amplitude do sinal do instrumento em funo de uma onda senoidal, como pode ser visto na figura 5. Em resumo, esse efeito como uma modulao em amplitude (AM), no qual a portadora o sinal de instrumento e o sinal modulante a onda sneoidal de controle.

Figura 5 Fucionamento do efeito de Vibrato. 2. Objetivos Implementar efeitos de udio em um DSP de forma a obter a aplicao dos mesmo em tempo real 3. Implementao Para gerenciar a coleta de amostras no DSP, o processamento, a leitura das chaves e, por fim, a disponibilizao das amostras processadas na sada do DSP, foi utilizado o cdigo abaixo, presente no arquivo Loop_intr.c:

#include "dsk6713_aic23.h" //codec-DSK support file #include <math.h> Uint32 fs = DSK6713_AIC23_FREQ_24KHZ; //set sampling rate // Prepare filtering buffers as global variables: #define bufferLength 256 short inputBuffer[bufferLength]; short outputBuffer[bufferLength]; short n = 0; // current buffer index unsigned int tempo_delay; int onDrive, onDelay; int onTremolo; interrupt void c_int11() { short leftSample; short rightSample; short inputSample; short outputSample; short inProcess; input_both_channels(&leftSample, &rightSample); // Rece entrada dos dois canais inputSample = (leftSample + rightSample) / 2; // Tira a mdia dos dois canais, por simplicidade inputBuffer[n] = inputSample; // Armazena em buffer para uso futuro // Processamento inProcess = inputSample; // Varivel para processamento dos efeitos // Aplicao de efeitos if(onDrive){ inProcess = getDrive(inProcess, 1); } if(onDelay){ tempo_delay = 2000; inProcess = inProcess + getReverb(inProcess, tempo_delay); } if(onTremolo){ inProcess = plain(inProcess, 24); } outputSample = inProcess; // Fim da aplicao dos efeitos output_both_channels(outputSample, outputSample); // Escreve a mesma sada nos dois canais outputBuffer[n] = outputSample; // Armazena em um buffer de sada para uso futuro // If we're past the buffer end, return to the beginning n = n + 1; if (n >= bufferLength) { n = 0; } return; }

void main() { short k = 0; for (k = 0; k < bufferLength; k++){ inputBuffer[k] = 0; outputBuffer[k] = 0; } //Inicializa DSK, codec, McBSP comm_intr(); DSK6713_init(); DSK6713_LED_init(); DSK6713_DIP_init(); initTremolo(); // Inicializa Parmetros do tremolo // Liga e dsliga os efeitos while(1) { if (DSK6713_DIP_get(3) == 0) { // se o DIP (3) estiver pressionado o LED(3) ascende. DSK6713_LED_on(3); } else { // seno o LED(3) apaga. (isso repete para outras posies). DSK6713_LED_off(3); } if (DSK6713_DIP_get(2) == 0) { onTremolo = 1; DSK6713_LED_on(2); // Define o atraso //tempo_delay = 800; } else { onTremolo = 0; DSK6713_LED_off(2); } if (DSK6713_DIP_get(1) == 0) { onDelay = 1; DSK6713_LED_on(1); } else { onDelay = 0; DSK6713_LED_off(1); } if (DSK6713_DIP_get(0) == 0) { // Liga o Drive onDrive = 1; DSK6713_LED_on(0); } else { onDrive = 0; DSK6713_LED_off(0); } } }

O loop while dentro do mtodo main verifica a posio das chaves, e acende os LEDs indicando se a chave est pressionada ou no. As chaves so responsveis por ligar ou desligar os efeitos: chave pressionada = efeito ligado. O primeiro efeito a ser construdo foi o Over Drive. Ele foi construdo em uma classe separada overdrive.c. O efeito obtido atravs de um mtodo chavado getDrive, responsvel por normalizar a entrada e desnormalizar a sada, de modo que o processamento do efeito possa ocorrer de maneira correta. Esse mtodo tambm responsvel por selecionar entre Hard Clip ou Soft Clip. O Hard Clip obtido atravs do mtodo simClip e o Soft Clip obtido atravs do mtodo soft.
#define a 1 #define b (1-a) short output; // codec input and output samples int c = 2048; //thereshold for soft int th = 256; // thereshold for simClip int soft(int x){ float y, xc = x/c; // this y is local to f() y = x * (1 - b * xc * xc); if (x>c){ y = a*c; // force the threshold values } if (x<-c){ y = -a*c; } return ((int) y); } int simClip(int x){ float y; if(x < th){ y = 2*x; } //pow(base, elevado); if(x >= th){ if(x > 2*th){ y = 1; } else{ y = (3 - pow(2-3*x, 2))/3; } } if(x <= -th){ if(x < -2*th){ y = -1; } else{ y = -(3- pow(2-3*(-x),2))/3; } } }

signed short getDrive(short input, int type){ if(type == 1){ output = (short) soft((int) input); } if(type == 2){ output = (short) simClip((int) input); } output = output << 1; return output; }

O Reverb foi construdo em um arquivo chamado reverb.c, e o cdigo mostrado abaixo:


#define N 8000 // mximo de delay signed int reverb_array[N]; /* buffer de delay - mximo n amostras */ signed int getReverb(signed int ultimo_input, unsigned int tempo){ signed int retorno; // Esta variavel precisa ser static para reter os valores entre as chamadas static unsigned int index = 0; retorno = reverb_array[index]; // captura a ultima amostra reverb_array[index] = ultimo_input; //sobrepe com o ultimo input */ if ( index < (tempo - 1) ){ index++; // Aponta para o prximo elemento }else{ index = 0; // Retorna para o inicio do buffer } return retorno; }

Esse cdigo armazena as amostras por um determinado nmero de tempo, dado em amostras, e joga na sada aps esse tempo. A varivel static ndex a responsvel por contar esse tempo dado em amostras. O cdigo basicamente uma realimentao com um DelayLine. O tempo de Delay para que o efeito seja reconhecido como um Reverb deve ser bem baixo, de modo que o ouvido humano no perceba o atraso entre as repeties, mas sim algo contnuo. Em seguida, foi feito o cdigo para o efeito de Vibrato, um efeito de modulao no qual a amplitude do sinal do instrumento varia de acordo com uma portadora. O cdigo mostrado abaixo e foi definido no arquivo tremolo.c:

short yL; // Sada // Parmetros do tremolo #define D 24000 float w[D]; int q; void initTremolo(){ // Inicializa parmetros do tremolo int i; float PI = 4*atan(1); for (i=0; i<D; i++) w[i] = sin(2*PI*i/D); } signed short getTremolo(short xL, short fsample){ float alpha, beta, f; float x, y; q = 0; f = 0.005; alpha = 1; beta = 1; x = (float) xL; y = alpha*x+beta * wavgen(D, w, x, f/fsample, &q); yL = (short) y; return yL; }

Esse cdigo se aproveita da funo wavgen, que foi definida no arquivo wavegen.c, mostrado abaixo:
int qwrap(int, int); float wavgen(int D, float *w, float A, float F, int *q) { float y, c=D*F; y=A*w[*q]; *q = qwrap(D-1, (int) (*q+c)); return y; }

Por fim, o efeito do tremolo no trabalhou corretamente. Uma diferente abordagem deveria ser adotada de forma a obter a modulao corretamente.

4. Concluso Foi possvel implementar os efeitos de Over Drive, Distoro e Reverb no DSP da Texas Instruments. O efeito de vibrato foi implementado, porm no se comportou da forma esperada. Inicialmente o projeto seria realizado com o DSP Black Fin BF 537, porm esse apresentou problemas na parametrizao dos cdigos, como, por exemplo, o no reconhecimento de determinadas variveis globais. Por esse motivo, o DSP utilizado foi o TMS320C6713 da Texas Instruments, pela maior versatilidade e facilidade de programao.

5. Referncias Bibliogrficas [1] Zoler, U. DAFX: Digital Audio Effects, 2002. [2] Orfanidis, S. J. DSP Manual Lab, 2012. [3] Woon-Seng, G. Sem, M. K. Embedded Signal Processing with the Micro Signal Architecture, 2007.

Você também pode gostar