Filtro digital em ponto-fixo

Download Report

Transcript Filtro digital em ponto-fixo

Laboratório 4
Sistemas embarcados
Período 2010.2
1
Saulo O. D. Luiz
Roteiro
• Representação numérica em pontoflutuante
• 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
2
Saulo O. D. Luiz
Objetivo
• Projetar e implementar um filtro digital
para áudio em C para Linux Embarcado
no core ARM da plataforma OMAP 161x.
3
Saulo O. D. Luiz
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
4
Saulo O. D. Luiz
Ponto-flutuante
• Padrão IEEE 754 para Floats:
Sinal: 0 = + e 1 =  Combinações Sinal + Expoente + Significando

5
Saulo O. D. Luiz
Filtro Butterworth em ponto-flutuante
• Especificação:
– Frequência de corte: 300 Hz = 2*π*300 rad/s = 1885 rad/s
– Passa-altas
– 2ª ordem
6
Saulo O. D. Luiz
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
7
Saulo O. D. Luiz
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
8
Saulo O. D. Luiz
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')
9
Saulo O. D. Luiz
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 ]
10
Saulo O. D. Luiz
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:
11
Saulo O. D. Luiz
Aritmética de ponto-fixo
12
Saulo O. D. Luiz
Aritmética de ponto-fixo
• Mudando de Expoente
13
Saulo O. D. Luiz
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.
14
Saulo O. D. Luiz
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 :
15
Saulo O. D. Luiz
Aritmética de ponto-fixo
• Divisão
Para não perder precisão devemos efetuar a multiplicação
por
antes da divisão por m.
• Exemplo: se
16
Saulo O. D. Luiz
Aritmética de ponto-fixo
• Raiz Quadrada
17
Saulo O. D. Luiz
⋅
Aritmética de ponto-fixo
• Conversão de ponto-flutuante para ponto-
fixo
q
N max = 2 x
log 2 N max =q+log 2 x
q=log 2 N max − log 2 x
18
Saulo O. D. Luiz
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
19
Saulo O. D. Luiz
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
20
Saulo O. D. Luiz
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
21
Saulo O. D. Luiz
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);
22
Saulo O. D. Luiz
Filtro Butterworth em ponto-fixo
• Equação de recorrência
23
Saulo O. D. Luiz
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
24
Saulo O. D. Luiz
Filtro Butterworth em ponto-fixo
• No Simulink:
25
Saulo O. D. Luiz
Exemplo
26
Saulo O. D. Luiz
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.
27
Saulo O. D. Luiz