Fase (graus) Módulo da resposta em frequência METAHEURO LABORATÓRIO DE PROCESSAMENTO DIGITAL DE SINAIS II Filtros FIR utilizando matlab e arduino duo LAB 1 (LPF) Nota: O processador ARM do arduino duo não é um processador digital de sinais, portanto a resposta do mesmo se limita a operações com filtros de número de taps limitado e em operações de baixas frequências. TAREFA 1: Projetar um filtro passa baixas FIR de 31 taps com frequência de corte de 400 Hz, utilizando o método da transformada de Fourier. Utilize a frequência de amostragem de 15000 Hz e aplique a janela de Hamming. Obtenha os coeficientes do filtro utilizando o matlab e aplique uma escala razoável para trabalhar com aritmética de ponto fixo. No matlab, o módulo da resposta em frequência do filtro e a fase do mesmo são mostrados nos gráficos abaixo: -20-40 -60-80 0 1000 2000 3000 4000 5000 6000 7000 Frequencia (Hz) 0-200 -400-600 0 1000 2000 3000 4000 5000 6000 7000 8000 Frequencia (Hz) Figura 1 Os coeficientes do filtro, obtidos no matlab para a especificação solicitada são: b0 = 9.978552e-004; b1 = 1.462856e-003; b2 = 2.408095e-003; b3 = 4.028668e-003; b4 = 6.471711e-003; b5 = 9.813551e-003;
b6 = 1.404338e-002; b7 = 1.905562e-002; b8 = 2.465229e-002; b9 = 3.055544e-002; b10 = 3.642875e-002; b11 = 4.190622e-002; b12 = 4.662503e-002; b13 = 5.025921e-002; b14 = 5.255053e-002; b15 = 5.333333e-002; b16 = 5.255053e-002; b17 = 5.025921e-002; b18 = 4.662503e-002; b19 = 4.190622e-002; b20 = 3.642875e-002; b21 = 3.055544e-002; b22 = 2.465229e-002; b23 = 1.905562e-002; b24 = 1.404338e-002; b25 = 9.813551e-003; b26 = 6.471711e-003; b27 = 4.028668e-003; b28 = 2.408095e-003; b29 = 1.462856e-003; b30 = 9.978552e-004; Multiplicando os coeficientes por 2 14 e eliminado a parte fracionária, obtemos: b0 = 16; b1 = 24; b2 = 39; b3 = 66; b4 = 106; b5 = 161; b6 = 230; b7 = 312; b8 = 404; b9 = 501; b10 = 597; b11 = 687; b12 = 764; b13 = 823; b14 = 861; b15 = 874; b16 = 861; b17 = 823; b18 = 764; b19 = 687; b20 = 597; b21 = 501; b22 = 404; b23 = 312; b24 = 230; b25 = 161; b26 = 106; b27 = 66; b28 = 39; b29 = 24; b30 = 16; Escreva o software do filtro utilizando esses dados, e teste a operação do mesmo. Implementação do filtro LPF //filtro PASSA BAIXAS FIR de 31 taps com frequencia de corte = 400 Hz e //e frequencia de amostragem de 15000Hz. //declaração dos coeficientes do filro //utilizando o fator 2^14=16384 int b0 = 16; int b1 = 24; int b2 = 39;
int b3 = 66; int b4 = 106; int b5 = 161; int b6 = 230; int b7 = 312; int b8 = 404; int b9 = 501; int b10 = 597; int b11 = 687; int b12 = 764; int b13 = 823; int b14 = 861; int b15 = 874; //declaração das variáveis de entradas int x_0,x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8,x_9,x_10,x_11,x_12,x_13,x_14,x_15,x_16,x_17,x_18; int x_19,x_20,x_21,x_22,x_23,x_24,x_25,x_26,x_27,x_28,x_29,x_30; //declaração da variável de saída e controle de amostragem int y,ssn; //declaração das saídas p. flutuante long sn1,sn2; int sn; //flag de controle int flag_aq; void setup() { Serial.begin(9600); pinmode(13, OUTPUT); // ////////////Configuração do timer 1 - canal0 /////////////////////// pmc_set_writeprotect(false); pmc_enable_periph_clk(id_tc3); // desabilite a habilitação dos registradores pmc // habilite do periferico de clock TC3
pmc_set_writeprotect(false); pmc // desabilite a proteção de escrita dos registradores TC_Configure(TC1, 0, TC_CMR_WAVE TC_CMR_WAVSEL_UP_RC TC_CMR_TCCLKS_TIMER_CLOCK2); //prescaler = 8 TC_SetRC(TC1, 0,700); /* fixe o período de amostragem -> 84000000/8/10000 = 1050*/ TC_Start(TC1, 0); // enable timer interrupts on the timer TC1->TC_CHANNEL[0].TC_IER=TC_IER_CPCS; // IER = habilitação do registro de interrupção TC1->TC_CHANNEL[0].TC_IDR=~TC_IER_CPCS; // IDR = desabilitação do reginterrupt disable register } NVIC_EnableIRQ(TC3_IRQn); analogwriteresolution(12); // Fixe a resolução do DAC p/a 12 bit (4096 niveis) analogreadresolution(12); // Fixe a resolução do ADC p/a 12 bits flag_aq=0; void loop() { } Serial.println(x_0); //TC1 ch 0 void TC3_Handler(){ digitalwrite(13,1); //medindo o tempo de execução da interrupção TC_GetStatus(TC1, 0); //reset o bit de interrupção x_30=x_29; x_29=x_28; x_28=x_27; x_27=x_26; x_26=x_25; x_25=x_24; x_24=x_23; x_23=x_22;
x_22=x_21; x_21=x_20; x_20=x_19; x_19=x_18; x_18=x_17; x_17=x_16; x_16=x_15; x_15=x_14; x_14=x_13; x_13=x_12; x_12=x_11; x_11=x_10; x_10=x_9; x_9=x_8; x_8=x_7; x_7=x_6; x_6=x_5; x_5=x_4; x_4=x_3; x_3=x_2; x_2=x_1; x_1=x_0; x_0=analogread(a0); //obtendo a entrada atual x_0 = x_0-2048;//finando o nível zero do sinal que deve entrar polarizado em 2048==1,65V sn1= b0*x_0 + b1*x_1 + b2*x_2 + b3*x_3 + b4*x_4 + b5*x_5 + b6*x_6 + b7*x_7 + b8*x_8 + b9*x_9 + b10*x_10 + b11*x_11 + b12*x_12 + b13*x_13 + b14*x_14 + b15*x_15; sn2= b14*x_16 + b13*x_17 + b12*x_18 + b11*x_19 + b10*x_20 + b9*x_21 + b8*x_22 + b7*x_23 + b6*x_24 + b5*x_25 + b4*x_26 + b3*x_27 + b2*x_28 + b1*x_29 + b0*x_30;; sn=(sn1+sn2)>>13; sn=sn + 2048; //convertendo a tensão "analógica" despolarizada para digital polarizada
} analogwrite(dac1,sn); digitalwrite(13,0); //medindo o tempo de execução no final do pulso na saída 13 PROCEDIMENTO DE INVESTIGAÇÃO: a) Fixe a saída do gerador de função em 2 Vpp. b) Fixe o off set (deslocamento CC) do gerador de função em 1.65V c) Fixe a escala de frequências do gerador de função em 10 Hz. d) Aplique o sinal do gerador de função no canal 1 do osciloscópio (amarelo) assim como na entrada A0 (ADC =entrada analógica) do ARDUINO. e) Coloque o osciloscópio em modo de medição (meas) do canal 2 em valor pico a pico. f) Varie a frequência do gerador preenchendo a tabela abaixo: Frequência V saída V entrada V saída /V entrada 20log(V saída /V entrada ) 10 20 30 600 Responder as questões abaixo: a) O tempo de execução da rotina do timer diretamente no pino 12 do processador. b) Se o clock do arduino é 84.10 6, quantos ciclos de máquina foram executados? c) Por que as variáveis sn1 e sn2 são declaradas como long? d) Por que os coeficientes do filtro foram multiplicados por 2 14? e) Qual é o significador da expressão em C sn=(sn1+sn2)>>13;? f) Por que todo o programa só trabalha com números inteiros? g) Quantos níveis por ciclo qualquer figura da saída do filtro o osciloscópio apresenta? Qual é a relação desse número com a frequência de amostragem? h) Qual é o valor em db da relação entre a saída e a entrada quando a frequência é 400 Hz? i) Qual é a fase da saída em relação a entrada na situação do item (h)?
j) Compare os valores obtidos nos dois itens acima com os valores do gráfico da figura 1. Qual é a relação entre os valores teóricos e os valores práticos? k) Aplique uma tensão de 3.3V na entrada do ADC (A0) do ARDUINO DUO e verifique a qualidade da resposta do DAC do mesmo.m Comentar a qualidade do DAC do ARDUINO DUO. A figura 2 apresenta a situação de medição dos três últimos itens discutidos acima. Figura 2