270 likes | 410 Views
Laboratório 4. Sistemas embarcados Período 2010.2. Roteiro. Representação numérica em ponto-flutuante Projeto de um filtro digital usando aritmética de ponto-flutuante Aritmética de ponto-fixo Projeto de um filtro digital usando aritmética de ponto-fixo. Objetivo.
E N D
Laboratório 4 Sistemas embarcados Período 2010.2
Roteiro • Representação numérica em ponto-flutuante • Projeto de um filtro digital usando aritmética de ponto-flutuante • Aritmética de ponto-fixo • Projeto de um filtro digital usando aritmética de ponto-fixo
Objetivo • Projetar e implementar um filtro digital para áudio em C para Linux Embarcado no core ARM da plataforma OMAP 161x.
Metodologia de Desenvolvimento Formulação Matemática da Aplicação Projeto e verificação do Algoritmo numa linguagem de alto nível, e.g. MatLab, em ponto-flutuante e ponto-fixo Implementação em C em ponto-flutuante para PC, e.g. gcc Implementação em C em ponto-fixo para PC, e.g., gcc Cross-compilação para ARM, e.g. Scratchbox
Ponto-flutuante • Padrão IEEE 754 para Floats: • Sinal: 0 = + e 1 = - • Combinações Sinal + Expoente + Significando
Filtro Butterworth em ponto-flutuante • Especificação: • Frequência de corte: 300 Hz = 2*π*300 rad/s = 1885 rad/s • Passa-altas • 2ª ordem
Filtro Butterworth em ponto-flutuante • Encontrando a função de transferência: • Na linha de comando: • [num,den] = butter(ordem,2*pi*fc,'high','s'); • Informações sobre o algoritmo: • Help do Matlab: Signal Processing Toolbox: butter • No Simulink: • DSP blockset / Filtering / Filter Designs
Filtro Butterworth em ponto-flutuante • Encontrando a função de transferência: • Na linha de comando: • filtro_continuo = tf(num,den) s^2 ------------------------------- s^2 + 2666 s + 3.553e06
Aproximando funções de transferência (FT) contínuas • Aproximação de Tustin: Uma FT discreta H(z) pode ser obtida repondo o argumento s na FT contínua G(s) por s' onde h é o período de amostragem. • Assim H(z) = G(s')
Filtro Butterworth em ponto-flutuante • filtro_discreto = c2d(filtro_continuo,Ta,'tustin') 0.8471 z^2 - 1.694 z + 0.8471 --------------------------------------- z^2 - 1.671 z + 0.7177 Sampling time: 0.000125 • [numd,dend]=tfdata(filtro_discreto,'v') numd = [ 0.8471 -1.6942 0.8471 ] dend = [1.0000 -1.6707 0.7177 ]
Filtro Butterworth em ponto-flutuante • Simulação: • Na linha de comando: • [yc,t] = lsim(filtro_continuo,u,t); • [yd,t] = lsim(filtro_discreto,u,t); • No simulink:
Aritmética de ponto-fixo • Mudando de Expoente
Aritmética de ponto-fixo • Adição e Subtração Obs: Se os expoentes são diferentes a conversão para mesmo expoente deve ser feita antes da adição ou subtração.
Aritmética de ponto-fixo • Multiplicação Para converter a resposta para o expoente r devemos efetuar um deslocamento como descrito abaixo: Exemplo: se p + q >= r :
Aritmética de ponto-fixo • Divisão Para não perder precisão devemos efetuar a multiplicação porantes da divisão por m. • Exemplo: se
Aritmética de ponto-fixo • Raiz Quadrada
Aritmética de ponto-fixo • Conversão de ponto-flutuante para ponto-fixo
Aritmética de ponto-fixo • Exemplo: • Para x1 = 0.001d • q1=log2(32767)-log2(.001) • q1 = 24.9657 => q1 = 24 • floor(x1*2^24) • x1 = 16777d => 4189h
Aritmética de ponto-fixo • para x2 =7.12d • q2 =log2(32767)-log2(7.12) • q2 = 12.1681 => q2 = 12 • floor(x2*2^12) • x2d =29163 => 71EBh
Aritmética de ponto-fixo • logo • x3 = x1*x2 => q3 = q1+q2 = 36 • x3 = 489267651d = 1D29A1C3h • se sabemos que esse número é representado corretamente em Q22 fazemos: • x3(Q22) = floor(x3/2^(36-22)) • x3(Q22) = 29862d = 74A6h e podemos armazená-lo na memória. • Para provar que o procedimento está correto fazemos: • Resultado esperado = x3(Q22)/2^22 = 0.00711965560913
Filtro Butterworth em ponto-fixo • %qu = floor(log2(2^15 - 1)-log2(1)) = 14 • ud=floor(u*2^14); • %Do filtro projetado anteriormente: • numd = [0.8471 -1.6942 0.8471]; • dend = [1.0000 -1.6707 0.7177]; • %(q para num e den) = floor(log2(2^15 - 1)-log2(2)) = 13 • numd = round(numd*2^13); • dend = round(dend*2^13);
Filtro Butterworth em ponto-fixo • Equação de recorrência
Filtro Butterworth em ponto-fixo • %yd(k)/ud(k) = nund(q)/dend(q) => yd(k)dend(q) = ud(k)dend(q) • for k=10:length(t) • %Q13 * Q14 = Q27 • yd(k) = -1*( dend(2)*yd(k-1) + dend(3)*yd(k-2)) + numd(1)*ud(k) + numd(2)*ud(k-1) + numd(3)*ud(k-2); • %Q27 >> 13 = Q14 • yd(k) = round(yd(k)/2^13); • end
Filtro Butterworth em ponto-fixo • No Simulink:
Sugestão de experimento • Repita o projeto do filtro do exemplo, dessa vez usando ´zoh´ como método de discretização. Como a função de transferência em tempo discreto é alterada? • Projete um filtro passa-baixas de nona ordem usando a metodologia proposta.