martes, 20 de mayo de 2008

CONTROLADOR DEL TECLADO

Na primeira parte do diagrama de bloques podemos atopar a parte correspondente coa interface humana do sistema: o controlador do teclado. Este está deseñado para cumprir coa tarefa de xerar os sinais de entrada ao sistema cando o usuario pulsa algunha das teclas do teclado matricial.


Na páxina web do departamento puidemos atopar uns ficheiros que xa resolvían o noso problema, pero decidimos adaptalos á nosa aplicación para facer un deseño máis óptimo desde o punto de vista da FPGA (terminales, liñas, reloxos, ...)


Os cambios máis importantes atópanse no ficheiro ucf (fixemos un que realiza unha pequena proba do mesmo na placa), no controlador do teclado, na unidade de control (máquina de estados) e na interface, que é o ficheiro principal do proxecto, xa cos reloxos integrados e coas entradas e saídas correctas.


De calquera maneira, seguimos en liñas xerais os pasos da aplicación que se atopa na web. A nosa interface co teclado matricial consta de:

1) Unidade de control do controlador (ficheiro keypad_control_unit.vhd), que sincroniza os sinais de entrada e saída do teclado co sistema e co propio controlador. A súa función principal é mostrar en "fila(1:0)" e "columna(1:0)" o código da tecla pulsada á vez que se xera o sinal "pulsada" todo o tempo que a tecla estea pulsada.

2) Temporizador do teclado (keypad_timer.vhd), que temporiza determinados retardos necesarios na máquina de estados da unidade de control. Estes son de exactamente 5 e 500 milisegundos.

3) Divisor de frecuencia (frequency_divider.vhd), que xera o sinal de 1kHz a partir dun reloxo de 50MHz que usaremos para a aplicación.


4) Interfaz do teclado sen o divisor de frecuencia (keypad_16_kaeys_interface.vhd), onde se instancian as tres unidades anteriores.

4) Ficheiro principal (top_keypad_16_keys_interface.vhd), que realiza as funcións necesarias desta parte do diagrama de bloques, instanciando o divisor de frecuencia e a interfaz.


Para comprobar o bo funcionamento do sistema, seguimos a política de realizar simulacións con test benchs de todos e cada un dos ficheiros que necesitamos para realizar a interface co teclado matricial.


SIMULACIÓN TEMPORAL DO TEMPORIZADOR

Para comprobar o funcionamento de temporizador (keypad_timer.vhd) fixemos un test-bench no que se comproba a posta a un dos sinais de fin de temporización de 5 ms e de 500 ms, tras a excitación dos sinais de reset e de start. Para poder velo mellor, representaremos o resultado en dous anacos (un é un fragmento ampliado do outro):

a) Posta a un dos sinal de fin de temporización de 5ms:


b) Posta a un do sinal de fin de temporización de 500ms:


UNIDADE DE CONTROL DA INTERFACE

Por mor da natureza da aplicación e coa idea de poder optimizar o circuito, decidimos facer unha nova máquina de estados para que faga de unidade de control da interface co teclado matricial. Esto responde ás seguintes cuestións:

1)O sinal "pulsada" ha de permanecer a '1' todo o tempo que unha tecla estea pulsada no teclado, o que se pode implementar de maneira sinxela dende a máquina de estados.

2)Cando "pulsada" esté a '1' ten que haber un valor correcto en "fila(1:0)" e en "columna(1:0)", o que se produce cando o sinal "ce_key" estea a '1', que é unha das saídas da unidade de control.

3) Durante todo o tempo que se estea a pulsar unha das teclas ten que suceder o anteriormente descrito, cosa que a unidade de control anterior non facía, xa que ós 500 ms volvía facer unha nova exploración aínda que a mesma tecla seguira pulsada.

A máquina de estados implementada no ferramenta StateCad é a seguinte:

De cara á comprobación da mesma, onde se incluíu o sinal interno "sreg", que define o estado no que se encontra a FSM, estes son os resultados da simulación:

INTERFAZ CO TECLADO MATRICIAL DE 16 TECLAS

O esquemático final da interface co teclado é o seguinte (xa co divisor de frecuencia incluído):

A primeira instancia que se ve é o divisor de frecuencia usado para xerar o sinal de 1 kHz a partires do reloxo do sistema de 50 MHz e a outra instancia é a interfaz do teclado propiamente dita, con tódolos rexistros, máquina de estados, temporizador, ... necesarios para o funcionamento.

Da simulación temporal destacaremos dúas gráficas que amosan o bo funcionamento da interface, desde o punto de vista da exploración e das restriccións adicionais que lle engadimos ó sistema:

1) EXPLORACIÓN:
2) FUNCIONAMENTO:

lunes, 12 de mayo de 2008

Implementación dos osciladores

Aquí detallaremos as decisións fundamentales que tomamos no deseño dun oscilador. A implementación realizarase mediante un filtro IIR con 2 polos de módulo 1 á frecuencia a crear.

Partimos da transformada Z dun coseno que empeza na mostra 0 e de frecuencia discreta w:


x[n]=cos(w*n) <-----> X(z)=(1-cos(w)*z^(-1))/(1 -2*cos(w)*z^(-1) +z^(-2))


Se somos capaces de implementar un filtro con esta resposta ao impulso, entón, obteremos este sinal á saida se introducimos unha delta, que é o que queremos. Os coeficientes serán parámetros do filtro, dependentes da frecuencia a xenerar, e no caso de implementación hardware almacenarémolos nun rexistro antes de empezar a calcular as mostras.

A forma máis habitual de implementar un filtro de orde 2 emprega unha sección na forma trasposta da forma directa II, onde b0,b1 son os coeficientes do numerador e a0, a1 e a2 os do denominador:







No noso caso, debido a que b0=1, a0=1 e a2=1 simplifícase moito:

O funcionamento consistirá en introducir un impulso no filtro, que será equivalente a cargar os rexistros cuns determinados valores iniciais. Se nos olvidamos desto, o esquema resultante é moito máis compacto:


Ademáis, podemos aforrar un cambio de signo se sustituimos o sumador por un restador:


A estructura resultante é moi sinxela, seguramente moito máis que calquera ipcore da ferramenta de Xilinx. Agora somentes nos falta dimensionar a lonxitude dos rexistros, do multiplicador e do sumador.
En primeiro lugar sabemos que a saida do sistema deben ser 12 bits, xa que son os que emprega o convertidor DAC. Por outra banda sabemos que o número mínimo de bits do coeficiente 2cos(w) é de 11 para a parte fraccionaria (segundo o estudio que fixemos anteriormente) e de 2 para a parte enteira (xa que pode ser maior que 1 e empregamos complemento a 2). Para evitar pérdida de precisión operaremos internamente cun número de bits maior que 12, e á saida incluiremos un cuantificador que redondeará ao número de 12 bits máis próximo. O número de bits que empregaremos internamente denominarémolo, a partir de agora, lonxitude do bus, porque será a lonxitude dos rexistros e do bus da parte dereita da figura anterior.
Sabendo que as operacións de multiplicación incrementan o número de bits do resultado será necesario incluir un cuantificador á entrada do rexistro Z0 ( o de arriba).


Posto que a lonxitude do bus influirá no ruido de cuantificación de maneira inversa, e na área ocupada de maneira directa existe aquí un compromiso relación sinal a ruido-area. Debido a esto, e a que non temos restriccións ao respecto, a codificación en VHDL realizarase en función dunha constante para o número de bits do bus, o que permitirá elexir o valor máis conveniente con solo modificar esta constante e recompilar o código.
O filtro en cuestión deberá dotarse duns elementos auxiliares:
  1. Un rexistro no que se almacena o coeficiente -a1 (é dicir, 2cos(w)), para fixar este valor á entrada do multiplicador. Estrictamente non sería necesario, pero, de non existir, implicaría engadir restriccións á interface deste módulo co controlador do teclado.
  2. Unha memoria de 4 posicións na que almacenaremos os coeficientes correspondentes a cada unha das frecuencias a xenerar. Codificaranse como parámetros generic para poder instanciar un oscilador pra filas e outro pra columnas empregando o mesmo código.
  3. Un sumador que combina a saida de ambos osciladores, posto que temos que sacar a suma de dous tonos.
  4. A máquina de estados que se describiu anteriormente.

Debido ao reducido tamaño das memorias non nos plantexamos a súa implementación mediante BRAMs.

En canto á inicialización, diremos que a delta introducida terá amplitude 0.5 para evitar desbordamentos no sumador do punto 3, xa que extraeremos o resultado con 1 bit para a parte enteira. Ademais, realizando contas vemos que deberemos introducir cos(w) no rexistro Z0 e 0.5 no rexistro Z1, e non será necesario introducir (e almacenar na memoria) b0 no filtro, chegará con introducir (almacenar) cos(w) (recordemos que é constante para cada tecla pulsada) e desprazalo á esquerda para obter a1.





jueves, 8 de mayo de 2008

Creación do sinal

Plantéxase agora a implementación do bloque central da nosa arquitectura, un sistema que a partires dun valor para a columna e outro para a fila obterá unha mostra en cada
período de símbolo do sinal correspondente a xerar mentres a tecla estea pulsada.
Deberemos realizar tres accións máis elementais para conseguir esto, dada a información da que dispón o bloque:
  1. Detectar a pulsación e empezar a xerar o sinal
  2. Levar a conta do período de mostreo
  3. Obter o valor de cada mostra
Para a primeira tarefa introduciremos unha máquina de estados, que se encargará, ademais, de dar a orde de conversión ao controlador do convertidor. Para a segunda precisaremos un contador, que reducirá a frecuencia do oscilador de 50MHz da placa por un factor de 1000 aproximadamente, xa que a frecuencia de mostreo será de 50KHz. Finalmente, para o terceiro propósito será necesario un par de osciladores discretos e un sumador, que, a partir dunha orde da máquina de estados, produzan a seguinte mostra.

Ata este punto non se mencionou nada novo, o que restan son detalles de implementación.
A máquina de estados non ten segredo ningún: cando se pulsa unha tecla indica aos osciladores discretos de que poden realizar as inicializacións necesarias e a continuación introdúcese nun bucle que se executa unha vez para cada mostra, no que,en cada iteración, se lles da a orde de obter unha mostra e se comproba se a tecla segue pulsada. A continuación figura o diagrama de estados:





Aclaramos que o sinal seg_mostra levántase cando o contador acada certa cantidade precisada, neste caso será aproximadamente 1000. Este é o punto no que podemos xustificar a non existencia dun sinal busy que proceda do controlador do DAC, xa que o periodo de mostreo é o suficientemente longo como para que a transmisión serie ao DAC e a conversión finalicen antes da seguinte mostra. Esto simplifica a presente máquina de estados.

Sobre a conta do periodo de mostreo non son necesarias aclaracións: será un contador de 10 bits seguido dun combinacional que obteña o sinal seg_mostra.

Finalmente falaremos dos osciladores discretos, que constitúen o corazón de todo o sistema. Plantexámonos diversas opcións:
  1. Implementación mediante ipcore.
  2. Tabulacións e interpolacións.
  3. Creación dun módulo que realizara a función coseno mediante unha aproximación polinómica (Taylor) e outro que fose introducindo a fase instantánea.
  4. Emprego dun filtro IIR
Para cada unha das opcións, ademais, sería necesaria certa cantidade de memoria para almacenar coeficientes e demais parámetros.A continuación discutiremos cada unha das alternativas.
Pra comezar, descartamos os ipcores por diversas razóns, entre elas que non temos acceso á estructura interna/código, e polo tanto non podemos coñecer o seu grado de adecuación para a aplicación en cuestión, nin no que se refire a área, nin a velocidade. Ademais, sería evadir a verdadeira problemática deste proxecto, a parte mais complexa e que mais nos pode aportar.
As opcións 2 e 3 foron descartadas inicialmente pola necesidade de manter a fase instantánea, é dicir, sería preciso levar conta do número de mostra actual, para o que sería necesario un contador. O número de bits deste limitaría o tempo que podería producirse sinal, xa que ao desbordar produciríase unha discontinuidade no sinal de saida. Ademais acarrean un coste computacional elevado e unha necesidade grande de almacenamento en memoria de constantes.
Finalmente, a opción 4 foi a máis adecuada desde o noso punto de vista por diversas razóns:
  1. So se require do almacenamento dun coeficiente por cada tono a xerar.
  2. Emprega somentes un multiplicador e un restador, ademais de 2 rexistros.
  3. Un oscilador feito deste modo é a contraparte discreta dos osciladores senoidales analóxicos que empregan realimentación positiva, e deste xeito aprendemos a realizar osciladores que poidan ser útiles en sistemas máis complexos que funcionan en dixital.
  4. A nosa especialidade é a de comunicacións e escollemos esta asignatura para por en práctica os nosos coñecementos sobre teoría do sinal en FPGAs.

Na seguinte entrada desenvolveremos a implementación destes módulos de maneira detallada, así como a verificación na placa do sistema constituido por esta parte e o controlador do DAC.

lunes, 28 de abril de 2008

Controlador do DAC

Introducción
Aquí plantéxase implementar o módulo descrito no diagrama de bloques encargado de que un dato de 12 bits apareza á saida dun dos convertidores DAC121S101 presentes no módulo PMOD DA2 de Digilent.
Cada un destes conversores consiste nunha entrada serie e unha saida analóxica, ademáis de outros sinais de sincronización. A tarefa do módulo a implementar consistirá, por tanto, en capturar un dato en paralelo nun rexistro de desprazamento, engadir uns bits de control e transmitilo cara ó convertidor vía serie.
O controlador que figura implementado na páxina do departamento, ao que anteriormente se fixo mención, está diseñado para o módulo PMOD DA1, que incorpora 2 convertidores de 2 canles, e adaptalo para a aplicación actual conlevaría un grande desperdicio de área na FPGA debido a que somentes precisamos unha canle. Por outra banda, unha das características do módulo PMOD DA2 de Digilent, é que conecta as entradas de sincronización de ámbolos dous convertidores ao mesmo punto, polo que cando se transmite un dato a un convertidor é necesario transmitilo ao outro, e por tanto non se pode ignorar a presencia deste segundo convertidor. Estas dúas razóns leváronnos a reescribir desde cero o controlador para o convertidor, de maneira que somentes se empregan os recursos imprescindibles.




Implementación
A transmisión dos datos vía serie a un convertidor DAC121S101 realízase mediante un protocolo moi sinxelo. Por un lado transmítese un sinal de reloxo que lle indica os instantes de mostreo da entrada serie, e por outra línea recibe un sinal de inicio de trama. A trama consistirá en dous bits indiferentes, dous de modo de operación e 12 para o valor de voltaxe a xerar. A ecuación que relaciona a entrada dixital coa saida analóxica é moi sinxela:



(valor dixital)*(tensión de referencia)/4096



O convertidor mostrea a trama nos flancos de baixada do sinal de reloxo que se lle comunica, polo que a introducción desta na línea serie sincronizarémola por flancos de subida.


O diseño modular interno parece por tanto evidente: un rexistro paralelo/serie, un contador e unha máquina de estados. Sen embargo esto complícase debido a que a máxima frecuencia que admite o convertidor no sinal de reloxo son 30 MHz e o oscilador da placa é de 50 MHz. Ao noso xuicio existen varias solucións a este problema:

a) o controlador pode actuar na súa totalidade a unha frecuencia inferior á do resto do sistema. Poderíase, por exemplo, dividir o sinal do oscilador entre 10, e transmitir un bit da trama en cada periodo de reloxo. Sen embargo esto faría necesario un circuito a maiores para comunicar este controlador co resto do sistema, que opera a unha frecuencia maior.

b) dividir a frecuencia de reloxo de todo o sistema. Non optaremos esta solución debido a que este sistema podería pasar a formar parte de outro máis complexo e por tanto é interesante optimizar a velocidade.

c) poderíase incorporar un divisor de frecuencia de maneira que a máquina de estados espera ao seguinte período de bit. Sen embargo esto complicaría o diseño da máquina de estados xa que tería que controlar dous contadores.


d)unha solución intermedia pasa por incorporar retardos na máquina de estados, con estados que simplemente esperan. Esta será a solución que adoptaremos, dividindo a frecuencia do oscilador de 50 MHz entre 2, para obter 25MHz, que xa entran dentro da marxe especificada de 30 MHz.





Ficheiro fonte e diagrama



dac_top.vhd




DIAGRAMA.JPG
(se non funciona o segundo enlace presionar ENTER sobre a barra de direccións)

Simulación temporal






Extracto do informe de síntese

Device utilization summary:

---------------------------
Selected Device : 3s200ft256-5
Number of Slices: 17 out of 1920 0%

Number of Slice Flip Flops: 30 out of 3840 0%

Number of 4 input LUTs: 26 out of 3840 0%

Number of IOs: 19

Number of bonded IOBs: 19 out of 173 10%

Number of GCLKs: 1 out of 8 12%

Timing Summary:

---------------

Minimum period: 3.764ns (Maximum Frequency: 265.661MHz)

Minimum input arrival time before clock: 2.444ns

Maximum output required time after clock: 6.216ns

Maximum combinational path delay: No path found

Verificación

Para probar o módulo compreto na placa creamos un sistema moi sinxelo que captura dos interruptores os 8 bits máis significativos do dato a convertir. Os demais supóñense nulos. Instánciase un detector de flancos que xera un sinal cada vez que se acciona un dos pulsadores da placa. Neste momento visualízase este mesmo dato nos led para comprobar que non existen erros nos interruptores e dáse orde ao módulo en proba de iniciar a conversión.

A placa conéctase ao convertidor a través da placa MIB de Digilent. Para elaborar o ficheiro .ucf foi necesario seguir a pista de cada un dos sinais.

O ficheiro resultante consta das seguintes liñas:

# DIGILENT S3 BOARD COMPONENTS
NET "clk" LOC = "T9" ;

#Main clock 50 MHz
# S3 BOARD SWITCHES

# FROM SWITCH 7 (MOST SIGNIFICANT) TO SWITCH 0 (LEAST SIGNIFICANT)

NET "dato<7>" LOC = "K13" ;

NET "dato<6>" LOC = "K14" ;

NET "dato<5>" LOC = "J13" ;

NET "dato<4>" LOC = "J14" ;

NET "dato<3>" LOC = "H13" ;

NET "dato<2>" LOC = "H14" ;

NET "dato<1>" LOC = "G12" ;

NET "dato<0>" LOC = "F12" ;
# S3 BOARD PUSHBUTTONS

# FROM BTN3 TO BTN 0

NET "convertir" LOC = "M14" ;

NET "reset" LOC = "M13" ;
# S3 BOARD LEDs

# FROM LED 7 (MOST SIGNIFICANT) TO LED 0 (LEAST SIGNIFICANT)

NET "dato_led<7>" LOC = "P11" ;

NET "dato_led<6>" LOC = "P12" ;

NET "dato_led<5>" LOC = "N12" ;

NET "dato_led<4>" LOC = "P13" ;

NET "dato_led<3>" LOC = "N14" ;

NET "dato_led<2>" LOC = "L12" ;

NET "dato_led<1>" LOC = "P14" ;

NET "dato_led<0>" LOC = "K12" ;
# S3 BOARD 4-DIGIT 7-SEGMENT DYNAMIC DISPLAY ANODES

# FROM ANODE 3 (MOST SIGNIFICANT DIGIT) TO ANODE 0 (LEAST SIGNIFICANT DIGIT)

# ACTIVE LOW ANODES

NET "sclk" LOC = "C11" ;

NET "sdin2" LOC = "T3" ;

NET "sdin1" LOC = "E10" ;

NET "sync" LOC = "C10" ;

Con esto damos por concluido o diseño do controlador do convertidor DA, anque é posible realizar unha pequena optimización introducindo un rexistro de desprazamento para conmutar o segundo conversor a modo de baixo consumo. De facerse farase ao final do proxecto.


martes, 15 de abril de 2008

Gráfica 1





Diseño dos osciladores


Elección da frecuencia de mostreo do sistema


A frecuencia máxima de muestreo virá determinada polo tempo que lle leva ao convertidor dixital-analóxico xerar unha saida estable. Segundo as follas de características o período mínimo para o peor caso é de 12us. Esto permítenos unha frecuencia máxima de 83kHz.


Por outra banda, a frecuencia mínima de mostreo ven dada polo dobre da máxima frecuencia analóxica coa que se vai traballar, que neste caso será de 2*1633Hz=3266Hz para cumprir o criterio de Nyquist.


Outra restricción a maiores é que a frecuencia debe poder xerarse a partir do oscilador incluido na placa que é de 50MHz.


Esta marxe é moi amplia, pero co fin de non incorporar un filtro analóxico á saida do sistema empregaremos sobremostreo. A contraparte desto será unha menor precisión na frecuencia debido á cuantificación dos coeficientes.


En canto a esta, empregaremos o menor número de bits necesarios. Partimos de I1Q11 debido ao número de bits cos que traballa o convertidor, pero un coeficiente é maior que 1 nalgún caso (en módulo) , polo que como mínimo será I2Q10 se mantemos o número total de bits.


O estándar esixe que as frecuencias xeradas estean nun marxe de 1.5% da especificada, polo que debemos realizar a elección do número de bits dos coeficientes do filtro acorde con esto. Para este propósito escribimos dous scripts en Matlab, un que xera o filtro a partir dunha frecuencia discreta, e o outro que calcula a tolerancia despois da cuantificación:




script 1
function [num,den]=filtro(omega_discreta)
num=[1 -cos(omega_discreta)];
den=[1 -2*cos(omega_discreta) 1];
end




script 2
Q=10;
Ts=1/50000;
frec_analoxicas=[697 770 852 941 1209 1336 1477 1633];
w=2*pi*frec_analoxicas*Ts;
for k=1:length(frec_analoxicas)
%%filtro sen cuantificar
[N,D]=filtro(w(k));
%%filtro cuantificado
Dc=round(D*2^Q)/2^Q;
dif=phase(roots(D))-phase(roots(Dc));
tol=max(abs(dif))/Ts/2/pi;
fprintf('frec=%iHz => tolerancia=%iHz => %i%%\n',frec_analoxicas(k),tol,tol/frec_analoxicas(k)*100)
end






A saida xerada é:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=1.671428e+001Hz => 2.170685e+000%


frec=852Hz => tolerancia=9.872585e+000Hz => 1.158754e+000%


frec=941Hz => tolerancia=9.995271e+000Hz => 1.062197e+000%


frec=1209Hz => tolerancia=1.046912e+001Hz => 8.659324e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




onde detectamos que para 770Hz supérase o 1.5%, polo que empregaremos un bit a maiores.


Repetindo esto para I2Q11 obtemos:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=3.221402e+000Hz => 4.183639e-001%


frec=852Hz => tolerancia=8.291335e+000Hz => 9.731614e-001%


frec=941Hz => tolerancia=6.503294e+000Hz => 6.911046e-001%


frec=1209Hz => tolerancia=2.325194e+000Hz => 1.923238e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




co que sí cumplimos a restricción.




En cuanto aos efectos da precisión finita dentro dos filtros simulamos a resposta con Matlab valéndonos do Toolbox de procesado de sinal: mediante o fdatool definimos a lonxitude dos acumuladores, coeficientes e rexistros e mediante dfilt/filter() xeramos un tono de 10 segundos para comprobar a resposta final:








jueves, 3 de abril de 2008

Búsqueda de información

Introducción
A sinalización (transmisión de información de control entre nodos) na rede telefónica resolveuse de maneiras distintas ao longo do tempo. En concreto, a información de control que intercambian os dous extremos do bucle de abonado realizouse tradicionalmente de maneiras distintas: primeiramente de modo manual a través de operadores humanos, a posteriori mediante LD (loop disconnect), que era o sistema do disco de marcar xiratorio presente ata os 90, despois con DTMF e finalmente con transmisión dixital de datos, que é o que se emprega actualmente en bucles DSL ou cable.

DTMF

Aquí centrarémonos nun dos pasos intermedios: o sistema de marcado mediante dous tonos multifrecuencia (Dual Tone Multi-Frequency), que foi unha solución máis eficiente que o LD, pero que non implicaba un excesivo coste na sustitución de terminais e unidades de marcado. Consiste na transmisión na banda de voz (a telefónica quédase co que hai entre 30 Hz e 3 KHz) da suma de dous tonos (cosenos), por tanto audibles polo ser humano. O sistema foi estandarizado polo UIT-T na recomendación Q.23, onde se especifican as frecuencias que corresponden a cada sinal. Estas asócianse coa disposición no teclado de cada número, solución que abarata o coste dos terminais, xa que mediante un sistema de interruptores é moi doada de implementar a selección. Sen embargo tamén existen máis sinais a maiores, como a de liña ocupada, liña libre, rechamada (US), A, B, C, D, *, # etc, estas últimas empregadas polos enxeñeiros para comunicarense con ordenadores mediante os terminais. Cómpre destacar que as frecuencias son distintas en Europa e nos Estados Unidos, onde simplemente descolgando o teléfono percibimos perfectamente a diferencia, que é perfectamente audible.
A solución analóxica nas unidades de marcado é filtrar paso banda con 8 filtros e decidir respecto do sinal transmitido.

As frecuencias dos tonos (wikipedia)
The tone frequencies, as defined by the Precise Tone Plan, are selected such that harmonics and intermodulation products will not cause an unreliable signal. No frequency is a multiple of another, the difference between any two frequencies does not equal any of the frequencies, and the sum of any two frequencies does not equal any of the frequencies. The frequencies were initially designed with a ratio of 21/19, which is slightly less than a whole tone. The frequencies may not vary more than ±1.5% from their nominal frequency, or the switching center will ignore the signal. The high frequencies may be the same volume or louder as the low frequencies when sent across the line. The loudness difference between the high and low frequencies can be as large as 3 decibels (dB) and is referred to as "twist". The minimum duration of the tone should be at least 70 msec, although in some countries and applications DTMF receivers must be able to reliably detect DTMF tones as short as 45ms.

DTMF can be decoded using the Goertzel algorithm.



Máis información
A medida que se vaia desenvolvendo o proxecto irase colgando máis información, como o manexo exacto do convertidor e o análisis e simulación en matlab do proceso de xeración dos tonos.

Referencias

Recomendación Q.23
Recomendacións ITU-T para implementar servicios DTMF
Wikipedia