Convertidor Analógico Digital de 16 bits y 448000 muestras por segundo basado en el Bt878A
¡Novedades! 08-2005
Soporte
ALSA para el Bt878a y Fedora Core 4
¡Novedades! 05-2004
Artículo con modificación para llegar a 896000 Sps
Antecedentes: La potencia de los actuales ordenadores personales, ofrecen infinitas posibilidades de análisis y manipulación de señales analógicas, pero primero, es necesario digitalizarlas mediante un Convertidor Analógico Digital (ADC). El PC mas sencillo incorpora una tarjeta de sonido con la que podemos digitalizar fácilmente señales, pero con la limitación de 44000 muestras por segundo (Sps) en la mayoría de casos y de 96000 Sps en algunas tarjetas de gama alta. Según Nyquist esto nos permitirá llegar a señales con amplitud de 48Khz en el mejor de los casos. Para realizar experimentación con sonidos, esta frecuencia puede ser mas que suficiente pero para subir mas por el espectro o analizar con mas detalle señales de baja frecuencia son necesarias mas muestras por segundo.
Objetivo: Obtener un ADC que nos permita digitalizar a la frecuencia mas alta posible, utilizando hardware de uso corriente.
Método: Utilizaremos el ADC de baja frecuencia que incorpora el chip Bt878A en un tarjeta capturadora de video de uso corriente.
|
Preparación:
1 - Material utilizado:
- Tarjeta capturadora de video con sintonizador (tuner) de la marca: BestBuy
modelo: EasyTV (Fabricada por
Prolink modelo PV-BT878P+ Rev 9D) basada en el chip Conexant 878A Fusion y
tuner Philips PAL_BG FI1216
- PC de uso corriente con tarjeta de sonido Creative.
- Linux Mandrake 9.1
- Condensador 1µF (no polarizado).
- Conectores RCA hembra y cables de audio coaxiales.
- Herramientas diversas: alicates de corte, soldador, etc.
2 - ¿Qué el chip Bt878A?
Es el sucesor del famoso Bt848. En el diseño de este nuevo integrado, Brooktree (ahora Conexant) incluyó diversas mejoras, entre ellas un ADC de baja frecuencia destinado inicialmente a digitalizar las señales de sonido (y las subportadoras de audio) provenientes del sintonizador (tuner) para realizar la posterior demodulación (FM estereo, TV estereo, RDS, MTS, etc.) mediante software, en el driver del sistema operativo. Por desgracia, ningún fabricante ha aprovechado estas características (que yo sepa) y simplemente se utiliza el ADC de un Bt878A para obtener el sonido mono del tuner (en el mejor de los casos).
3 - Yo tengo una capturadora con un "878" pero no esta fabricado por Brooktree.
Lo podemos encontrar fabricado por Rockwell (datasheet download page) |
Y por Conexant, con el encapsulado Bt878KHF (datasheet download page) |
o el Fusion 878A (datasheet download page), que es el mas habitual. |
4 - ¿Qué características tiene este ADC?
Conexant dice en su datasheet:
"1.2.6 Audio DMA Channels
The audio channel delivers 8-bit or 16-bit digital samples of a digital
frequency-multiplexed analog signal to system memory in packets of DWORDs.
A RISC program controls the audio DMA Program Initiator. The flow of audio data
and audio RISC instructions is completely independent and asynchronous to the
flow of video data and video RISC instructions.
Since the audio data path operates in continuous transfer mode (no sync gaps),
both the analog and the digital audio inputs can be used for other data capture
applications. The analog input offers 360 kHz usable BW at 8 effective bits or
100kHz usable BW at 12 effective bits. The digital input offers up to 20 Mbps
for the parallel mode and 40 Mbps for the serial mode."
Gerd Knorr, dice en el README de su modulo btaudio:
"The analog mode supports mono only. Both 8 + 16 bit. Both are _signed_int, which is uncommon for the 8 bit case. Sample rate range is 119 kHz to 448 kHz. Yes, the number of digits is correct. The driver supports downsampling by powers of two, so you can ask for more usual sample rates like 44 kHz too."
Por lo que al presente documento se refiere, concluimos que: El ADC del Bt878A puede operar a 8 y 16 bits, a 119000 y 448000 Sps y un canal (monaural) de forma nativa sin ningún tipo de hardware o conversión adicional.
5 - Mi capturadora está basada en un Bt878A pero no es una "PV-BT878P+ Rev 9D" ¿Me sirve igualmente?
Es necesario realizar una inspección ocular de la tarjeta y averiguar si el fabricante ha aprovechado las entradas del ADC.
Datasheet Conexant Fusion 878A
Los pins del ADC son:
Pin # |
Signal |
Description |
100 |
STV I |
TV sound input from TV tuner. |
98 |
SFM I |
FM sound input from FM tuner. |
94 |
SML I |
MIC/line input. |
96 |
SMXC A |
Audio MUX anti-alias filter RC node. Connect through 68 pF capacitor to BGND. |
106 |
RBIAS A |
Connection point for external bias 9.53 kΩ 1% resistor. |
105 |
VCOMO A |
Common mode voltage for the audio analog circuitry. This pin should be connected to an external filtering 0.1 µF capacitor. |
104 |
VCOMI A |
Common mode voltage for the audio analog circuitry. This pin should be connected to an external filtering 0.1 µF capacitor. |
107 |
VCCAP A |
Audio analog voltage compensation capacitor. This pin should be connected to an external filtering 0.1 µF capacitor. |
103 |
VRXP A |
Audio input circuitry reference voltage. This pin should be connected to an external filtering 0.1 µF capacitor. |
102 |
VRXN A |
Audio input circuitry reference voltage. This pin should be connected to an external filtering 0.1 µF capacitor. |
Los pins que nos interesan son 100, 98 y 94 que son las entradas de la señal. En mi caso el 94 no esta utilizado, el 100 y 98 están unidos por una pista y luego conectados directamente a la salida de sonido del tuner. Se recomienda verificar que el fabricante haya instalado los condensadores externos para los voltajes de referencia.
El Bt878A incorpora un multiplexador interno (mux) para seleccionar la entrada de sonido activa (TV, FM o MIC) al igual que incorpora un mux interno para seleccionar la señal de video activa (Tuner, S-Video o Composite).
Es importante no confundir este mux con el mux externo que incorpora la PV-BT878P+ utilizando un Philips HEF4052B (datasheet download page) gobernado a través de GPIO.
Las instrucciones de este documento se aplican directamente solo a la tarjeta Prolink PV-BT878P+ 9D, pero aprovechándolas y estudiando con detalle otro tipo de tarjeta se puede conseguir el mismo objetivo.
En el caso de que el fabricante no aproveche las entradas del ADC (no estén soldadas a ninguna pista) se recomienda no utilizar esta tarjeta, ya que para realizar soldaduras en un integrado SMD se requieren herramientas que no están al alcance de la mayoría de nosotros.
Instalación:
1 - Como paso previo necesitamos tener funcionando un Linux con Kernel 2.4.x y con soporte de sonido.
Yo he utilizado un Mandrake 9.1
# uname –a Linux lab 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i586 unknown unknown GNU/Linux
La principal razón de utilizar Linux en la fase de captura de las señales es que no he encontrado drivers para Windows que permitan utilizar el ADC del Bt878A como periférico de sonido en el sistema operativo. Si alguien aporta información al respecto, se agradecerá enormemente. (Esto no significa que no me guste trabajar con Linux... Al contrario :)
2 - Verificaremos que se ha cargado el modulo de sonido correctamente:
# lsmod
Module Size Used by Not tainted
af_packet 14952 0 (autoclean)
ide-floppy 15580 0 (autoclean)
ide-tape 48304 0 (autoclean)
ide-cd 33856 0 (autoclean)
cdrom 31648 0 (autoclean) [ide-cd]
floppy 55132 0
ne2k-pci 6752 1 (autoclean)
8390 7916 0 (autoclean) [ne2k-pci]
supermount 15296 2 (autoclean)
videodev 7872 0
sb 9044 0 (unused)
sb_lib 41454 0 [sb]
uart401 8196 0 [sb_lib]
sound 70644 0 [sb_lib uart401]
soundcore 6276 0 [sb_lib sound]
rtc 8060 0 (autoclean)
ext3 59916 2
jbd 38972 2 [ext3]
3 - Verificamos que se ha creado el primer dispositivo de sonido:
# ll /dev/dsp*
lr-xr-xr-x 1 root root 9 Jan 6 12:26 /dev/dsp -> sound/dsp
lr-xr-xr-x 1 root root 10 Jan 6 12:26 /dev/dspW -> sound/dspW
4 - Desde Xwindows verificaremos que el mezclador, nos muestra los parámetros de nuestra tarjeta de sonido:
5 - Reproduciremos un sonido de muestra que debemos escuchar por nuestros altavoces.
Por ejemplo:
# sox –t .wav /usr/share/licq/sounds/fun/Online.wav –t ossdsp /dev/dsp
6 - Instalamos físicamente la tarjeta sintonizadora en el PC
Conectar únicamente el cable de antena de televisión. No conectar ningún
cable de sonido.
7 - Instalamos bttv (0.7.107)
Debido a diversos problemas con la instalación de modulo bttv y sus componentes asociados, se ha simplificado este paso, omitiendo esta fase y saltando directamente a la instalación única del modulo btaudio.
8 - Carga de btaudio
btaudio es el módulo que nos permite utilizar el ADC del Bt878A, montándolo como un dispositivo de sonido (¡Gracias Gerd!). Mi release de Linux (Mandrake 9.1) lleva incluido este modulo en /lib/modules/2.4.21-0.13mdk/kernel/drivers/sound/btaudio.o.gz y sin mas complicaciones podemos proceder a cargarlo.
# insmod btaudio debug=1
Si todo ha ido bien, podemos observar la salida del kernel:
#tail -100f /var/log/syslog | grep btaudio
Apr 17 19:08:57 lab kernel:
btaudio: driver version 0.7 loaded [digital+analog]
Apr 17 19:08:57 lab kernel: btaudio: Bt878 (rev 17) at 00:09.1, irq: 10,
latency: 32, mmio: 0xde001000
Apr 17 19:08:57 lab kernel: btaudio: using card config "default"
Apr 17 19:08:57 lab kernel: btaudio: registered device dsp1 [digital]
Apr 17 19:08:57 lab kernel: btaudio: registered device dsp2 [analog]
Apr 17 19:08:57 lab kernel: btaudio: registered device mixer1
9 - Compilación del modulo
En el caso de que nuestro linux no incluya el modulo compilado podemos intentar hacerlo nosotros mimos. Puedes descargarlo de aqui btaudio-0.7.tar.
Descomprimimos, nos situamos en el directorio y compilamos:
# gcc -O2 -DMODULE -D__KERNEL__ -c btaudio.c -isystem /lib/modules/2.4.21-0.13mdk/build/include/
Se comprime el modulo y lo movemos a su sito:
# gzip btaudio.o
# mv btaudio.o.gz /lib/modules/2.4.21-0.13mdk/kernel/drivers/sound/
# depmod -a
En mi caso aparece el mensaje "depmod: *** Unresolved symbols in btaudio.o.gz" pero hago caso omiso de él.
# insmod btaudio debug=1
Si nos aparece el mensaje:
./btaudio.o: kernel-module version mismatch
./btaudio.o was compiled for kernel version 2.4.21-0.13mdkcustom while this
kernel is version 2.4.21-0.13mdk.
Deberemos editar el fichero /usr/src/linux/include/linux/version.h y sustituir '#define UTS_RELEASE "2.4.21-0.13mdkcustom"' por '#define UTS_RELEASE "2.4.21-0.13mdk"' y repetimos la compilación.
10 - Verificamos que se han creado dos nuevos dispositivos de sonido:
# ll /dev/dsp* lr-xr-xr-x 1 root root 9 Jan 6 13:54 /dev/dsp -> sound/dsp lr-xr-xr-x 1 root root 10 Jan 6 14:04 /dev/dsp1 -> sound/dsp1 lr-xr-xr-x 1 root root 10 Jan 6 14:04 /dev/dsp2 -> sound/dsp2 lr-xr-xr-x 1 root root 10 Jan 6 13:54 /dev/dspW -> sound/dspW
El /dev/dsp1 es para la interfase digital I2S y /dev/dsp2 para el ADC del Bt878A, la cual utilizaremos.
11 - El mezclador ha detectado el nuevo dispositivo: "Brooktree_Bt878_audio"
Activamos el Rec y subimos la ganancia en Line1, dejando en Mute Line2 y Line3 tal como indica la imagen.
12 - Prueba de entrada de sonido:
# sox -w -r 32000 -t ossdsp /dev/dsp2 -t ossdsp /dev/dsp
Deberíamos oír una fuerte señal de ruido en nuestros altavoces conectados a la tarjeta de sonido. Se trata de la señal de sonido que proviene del tuner (que se activa tan pronto como arranca el PC) la cual estamos digitalizando y enviando a la tarjeta de sonido. ¡Lo estamos haciendo con nuestro Bt878! :)
Podemos utilizar un programa de televisión para sintonizar un canal (xawTV). No es necesario que veamos correctamente la imagen de televisión. Si dejamos el comando sox funcionando en una shell, escucharemos el sonido del canal.
13 - Prueba de captura de sonido:
# sox -w -r 448000 -t ossdsp /dev/dsp2 -t .wav sound.wav
-w 16 bits -r 448000 Sps /dev/dsp2 entrada analógica del ADC -t .wav formato archivo de sonido
Realizando un análisis del fichero de sonido utilizando Audacity (freeware), podemos observar que hasta 20Khz tenemos el sonido audible que proviene de la televisión pero también aparecen señales a frecuencias mas altas (sobretodo ruido) que son la mejor prueba de que estamos digitalizando frecuencias superiores (hasta 224Khz aproximadamente).
Modificaciones
1 - Entrada de señal externa
La PV-BT878P+ 9D dispone de las siguientes conexiones:
Todo parece indicar que el conector AudioIN nos permite introducir una señal en la tarjeta y en consecuencia, en la entrada del ADC del Bt878A, pero por desgracia no es así. Inexplicablemente, la misión de la entra AudioIN es únicamente obtener esa misma señal en AudioOUT al pasar por el mux Philips tal como muestra el siguiente gráfico. Desearía estar equivocado, pero... :(
Resumiendo: Mediante el mux externo escogemos si en la salida AudioOut obtenemos la señal externa del AudioIN o la señal de sonido del tuner, pero en ningún caso esta señal externa llegara al ADC
2 - Acceso a la salida del tuner.
La idea del "mod" es: Inyectar una señal externa utilizando la conexión de la salida del tuner en el pin 25, inhabilitando primero dicha salida y conduciéndola luego hasta fuera del PC.
También sacamos fuera del PC la salida de sonido del tuner para no perder este recurso.
Datasheet Tuner Philips FI1216
SYMBOL |
PIN |
DESCRIPTION |
VT |
11 |
tuning voltage (monitor) |
VS |
12 |
supply voltage tuner section +5 V |
SCL |
13 |
I2C-bus serial clock |
SDA |
14 |
I2C-bus serial data |
AS |
15 |
I2C-bus address select |
n.c. |
21 |
not connected |
2nd IF sound output |
22 |
second IF sound output |
CVBS |
23 |
Composite Video Baseband Signal output |
VIF |
24 |
supply voltage IF section +5 V |
AF sound output |
25 |
AF sound output |
3 - Pasos:
- Extraer la tarjeta del PC
- Cortar (¡con cuidado!) la salida de sonido del tuner, en el pin 25
- Soldar en la antigua conexión del pin 25 (en la superficie de la tarjeta) un
condensador de 1µF para bloquear la CC, con las patas mas cortas que nos
sea posible.
- Soldar entre el condensador y la toma de masa de la tarjeta un cable coaxial
de sonido (la malla del cable conectada a masa).
- Se recomienda utilizar como conexión de masa la pata del chasis del tuner que
atraviesa el circuito impreso.
- Soldar un conector de audio RCA hembra (o lo que mas nos interese) al
extremo del cable. Llamaremos a esta entrada: ADC_IN
- Soldar entre el pin 25 del tuner (que ha quedado al aire) y masa otro cable
coaxial de audio.
- Soldar un conector de audio RCA hembra (o lo que mas nos interese) al
extremo del cable. Llamaremos a esta salida: Tuner_OUT
- Instalar la tarjeta dejando los cables fuera del PC.
En estas imágenes podéis comprobar lo malo que soy con el soldador :)
4 - Prueba.
Una vez instalada la tarjeta, realizaremos una prueba para asegurarnos que hemos realizado correctamente las soldaduras.
Utilizando un cable normal de audio con conectores RCA macho, puenteamos ADC_IN con Tuner_OUT y repetiremos el punto: Instalación-12. Deberíamos oír nuevamente la señal de ruido (o sonido si tenemos sintonizado un canal) que proviene del tuner pero ésta vez saliendo y entrando en nuestro PC.
Si la prueba es satisfactoria ya tenemos listo nuestro ADC casero de 16 bits y 448000 Sps.
5 - Interferencias.
Llegados a este punto es interesante realizar una pequeña prueba para conocer a las "vecinas" que tendremos siempre en nuestros experimentos: Las interferencias del interior de nuestro ordenador.
Por muy bien que realicemos las soldaduras y por muy cortos que dejemos los trozos de cobre sin apantallar, sufriremos diversas interferencias provocadas por toda la electrónica que rodea al Bt878A.
Esta imagen es un espectrograma realizado con el programa SpectraPLUS (demo 30 días) para Microsoft Windows, de una señal obtenida del Bt878A sin nada conectado al ADC_IN y amplificada por software con el parámetro Plot_Top = 0.010
En mi caso se observan fuertes señales en la zona de 0 a los 2000Hz y diversos "pitos" a 60, 98, 102, 120.4 y 180.4 Khz.
Teóricamente, cada modelo de PC provocará otro tipo de interferencias y es importante conocerlas para evitar obtener falsos resultados en nuestros experimentos. Pero sin preocuparnos demasiado, ya que si tenemos una carga conectada y en el nivel de entrada es lo suficientemente fuerte, las interferencias casi desaparecen.
6 - ¿Y ahora que?
Vosotros mismos, ya no tenemos el limite de nuestra pobre tarjeta de sonido. Yo estoy explorando nuevas zonas y encontrando cosas realmente interesantes y espero publicar nuevos artículos pronto.
¿Alguien adivina a qué corresponde el espectro de la siguiente señal? (clic para ampliar)
Happy sampling! :)
¡Novedades! 08-2005
Soporte
ALSA para el Bt878a y Fedora Core 4
¡Novedades! 05-2004
Artículo con modificación para llegar a 896000 Sps
- Agradecimientos:
Gerd Knorr
Luis Padilla
Iban Cardona
- Autor:
Juan Domenech Fernandez
http://www.domenech.org
v1.13 01-mayo-2006
v0 27-diciembre 2003