Seguimos a implementação sugerida em [#!an1771!#].
é representado por um valor de 2 bytes referido como
. O byte superior armazena a porção inteira e o byte inferior a porção fracionária.
O valor decimal de é então:
![]() |
(5) |
e portanto
![]() |
(6) |
O valor de 16 bits do Dreg é então adicionado ao acumulador em cada período de amostragem para gerar o índice da tabela.
Uma das decisões de projeto é a definição do tamanho da tabela seno. É preciso definir tanto o número de entradas na tabela como o tamanho dos valores armazenados nela. Por limitações de espaço os valores terão tamanho de 1 byte. A tabela terá 256 entradas; com igual a 256 o índice da tabela necessita ter 8 bits, o que é muito conveniente nessa arquitetura e dispensa a necessidade de mascaramento do acumulador (é somente necessário utilizar o byte da parte inteira do acumulador, o que pode ser feito diretamente). Como o firmware é pequeno o tamanho de 256 bytes da tabela é tranqüilamente viável.
Exemplo:
Dados: ,
, e
(a DTMF freqüência mais alta)
da equação 1, isolamos ,
![]() |
(7) |
As partes inteira e fracional (byte alto/byte baixo) são representados como:
(arredondado para o inteiro mais próximo) = $6B
O byte alto (da parte inteira) do acumulador é então utilizado para indexar a tabela do seno de 256 bytes.
No caso de DTMF o procedimento anterior seria realizado para duas frequências distintas e os dois valores retirados da tabela necessitaria
O problema do overflow na soma dos dois valores D/A das duas frequências pode ser facilmente contornado nesta arquitetura executando um ROR no registrador que contém o resultado da soma. A instrução ROR rotaciona os bits para a direita (dividindo o valor por dois) carregando no bit mais significativo o valor do carry (1 no caso de overflow).
Pedro Ribeiro 2009-07-08