Projeto do algoritmo de busca direta para a plataforma alvo

Seguimos a implementação sugerida em [#!an1771!#].

$ Delta$ é representado por um valor de 2 bytes referido como $ Dreg$. O byte superior armazena a porção inteira e o byte inferior a porção fracionária.

O valor decimal de $ Delta$ é então:

$\displaystyle Delta = Dreg[15:0] / 256$ (5)

e portanto

$\displaystyle Dreg[15:0] = 256 * Delta$ (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 $ N$ 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: $ N=256$, $ Fs=1Mhz$, e $ Fgen=1.633Hz$ (a DTMF freqüência mais alta)

da equação 1, isolamos $ Delta$,

$\displaystyle Delta = (N*Fgen)/Fs = = (256*1633)/1E6 = 0.4180$ (7)

As partes inteira e fracional (byte alto/byte baixo) são representados como:

$ Inteira = 0$ $ Fracionária = 0.4180 * 256 = 107.008$ (arredondado para o inteiro mais próximo) = $6B $ Dreg = \$006B$

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