Analizador de espectros - Facultad Regional San Nicolás

Anuncio
Universidad Tecnológica Nacional
Facultad Regional San Nicolás
Técnicas Digitales III
Proyecto Integrador
Analizador de espectros
Integrantes:
Benitez Pablo A.
Carranza Rodrigo
Curaratti Nazareno J.
Docentes:
Ing. Poblete, Felipe.
Sr. González, Mariano.
Julio de 2006
Índice General
Capítulo 1
Introducción general
╠═>Introducción...........................................................................................................
╠═>Obtención de datos y análisis................................................................................
╠═>Etapas para el análisis............................................................................................
║
╠═> Etapa de entrada.....................................................................................
║
╠═> Adaptador de nivel.................................................................................
║
╠═> Adquisición.............................................................................................
║
╠═> Medición.................................................................................................
║
╠═>Memoria..................................................................................................
║
╚═>Presentación............................................................................................
╠═>Diagrama en bloques.............................................................................................
╠═>Procesamiento de señales......................................................................................
╠═>Aplicaciones comerciales......................................................................................
╠═>Consultas................................................................................................................
╚═>Materias Integradas .............................................................................................
I – 1.
I – 1.
I – 1.
I – 1.
I – 1.
I – 1.
I – 1.
I – 1.
I – 1.
I – 2.
I – 2.
I – 3.
I – 3.
I – 3.
Capítulo 2
Sonido
╠═>Introducción...........................................................................................................
╠═>Características físicas............................................................................................
║
╠═>Frecuencia................................................................................................
║
╠═>Amplitud y volumen................................................................................
║
╠═>Decibelio dB............................................................................................
║
╠═>Medición del nivel sonoro.......................................................................
║
╠═>El dBA o la ponderación -A-...................................................................
║
╠═>Suma de niveles de sonido. .................... .................... .................... .....
║
╠═>Presión Acústica y el Nivel de Presión Acústica. .................... ..............
║
╠═>Intensidad fisiológica de un sonido. .................... .................... .............
║
╠═>Intensidad Acústica y el Nivel de Intensidad Acústica. .................... ....
║
╠═>Potencia Acústica y Nivel de Potencia Acústica. .................... ..............
║
╠═>Tiempo de Reverberación. .................... .................... .................... .......
║
╠═>Coeficiente de Absorción de un material. .................... .................... ....
║
╠═>Timbre. .................... .................... .................... .................... ...............
║
╠═>Velocidad del sonido. .................... .................... .................... ..............
║
╠═>Refracción, reflexión e interferencia. .................... .................... ...........
║
╠═>Eco, Reverberación y Resonancia. .................... .................... ...............
║
╠═>Altura (tono) de un sonido. .................... .................... .................... ......
║
╠═>Sensación de tono. .................... .................... .................... ...................
║
╠═>El efecto Doppler. .................... .................... .................... ....................
║
╠═>Tres tipos de sonido importantes. .................... .................... .................
║
╠═>Octava, media octava y tercio de octava. .................... .................... .....
║
╠═>Filtro de ancho de banda constante. .................... .................... .............
║
╠═>Filtro de ancho de banda proporcional. .................... .................... ........
║
╚═>Disminución espacial del nivel sonoro. .................... .................... ........
╠═>Micrófono. .................... .................... .................... .................... .................... ...
╚═>Bibliografía. ..........................................................................................................
II – 1.
II – 2.
II – 2.
II – 2.
II – 3.
II – 3.
II – 4.
II – 4.
II – 4.
II – 4.
II – 5.
II – 5.
II – 5.
II – 5.
II – 6.
II – 6.
II – 6.
II – 7.
II – 7.
II – 8.
II – 8.
II – 8.
II – 9.
II – 9.
II – 10.
II – 11.
II – 11.
II – 12.
Capítulo 3
Ruido
╠═>Introducción. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ...... III – 1.
╠═>Ruido rosa. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ III – 1.
╠═>Ruido blanco. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....
╠═>Contaminación acústica. ........ ........ ........ ........ ........ ........ ........ ........ ........ ......
╠═>Clasificación. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ .....
╚═>Bibliografía. .........................................................................................................
III – 1.
III – 1.
III – 2.
III – 2.
Capítulo 4
Muestreo de señales
╠═>Introducción. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ........ ......
╠═>Representación de una señal de tiempo continuo mediante sus muestras. ........ ..
╠═>Muestreo con tren de impulsos. ........ ........ ........ ........ ........ ........ ........ ........ ....
╠═>Muestreo con retenedor de orden cero. ........ ........ ........ ........ ........ ........ ........ .
╠═>Bibliografía. .........................................................................................................
╚═>Materia Integrada..................................................................................................
IV – 1.
IV – 1.
IV – 2.
IV – 4.
IV – 4.
IV – 4.
Capítulo 5
Conversión de señales analógicas a digitales.
╠═>Introducción. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
╠═>Digitalización del sonido: Velocidad de Muestreo y Cuantización. .... .... .... ....
╠═>Ventajas del audio digital. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
╠═>Pasaje de una señal eléctrica a una señal digital. .... .... .... .... .... .... .... .... .... ....
╠═>Cantidad de sub intervalos en que se divide el rango útil de la señal. .... .... .... ..
╠═>Resolución de un sistema de audio digital.... .... .... .... .... .... .... .... .... .... .... .... .
╠═>Frecuencia de muestreo. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
╠═>Reconstrucción de la señal digitalizada. .... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>Relación entre el ruido de digitalización y la resolución. .... .... .... .... .... .... .... ..
╠═>Dither. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .....
╠═>Dither digital. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
╠═>Reproducción....... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
╠═>Procesamiento digital. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .....
╠═>Bibliografía. .........................................................................................................
╚═>Materia Integrada..................................................................................................
V – 1.
V – 1.
V – 2.
V – 2.
V – 2.
V – 2.
V – 3.
V – 3.
V – 3.
V – 4.
V – 4.
V – 4.
V – 4.
V – 5.
V – 5.
Capítulo6
Síntesis del sonido
╠═>Introducción. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
╠═>Sintetizadores. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
║
╠═>Osciladores. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
║
╠═>Filtros. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
║
╚═>Amplificadores. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
╠═>Procesamiento del sonido digitalizado. .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Aumento o disminución de volumen. .... .... .... .... .... .... .... .... .... .... ...
║
╠═>Filtrado. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
║
╠═>Mezcla. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╚═>Cortado y pegado. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>Procesamiento digital de señales. .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
║
╠═>Filtro pasa altos. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
║
╠═>Filtro pasa bajos. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╚═>Eco. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
╠═>Software de Edición y reproducción.... .... .... .... .... .... .... .... .... .... .... .... .... ....
╚═>Bibliografía. .........................................................................................................
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 1.
VI – 2 .
VI – 2.
VI – 2.
VI – 2.
VI – 2.
VI – 2.
VI – 2.
Capítulo7
Tarjeta de sonido
╠═>Introducción. .................. .................. .................. .................. .................. .......... VII– 1.
╠═>Componentes fundamentales de una placa de sonido.................. .................. ..... VII– 1.
║
╠═>El muestreo.................. .................. .................. .................. ..................
║
╠═>El tamaño de la muestra.................. .................. .................. .................
║
╠═>MIDI.................. .................. .................. .................. .................. .........
║
╠═>Procesadores multi-propósito de señales digitales.................. ...............
║
╠═>Efectos de sonido 3D.................. .................. .................. .................. ...
║
╠═>Entrada y salida digital.................. .................. .................. ...................
║
╠═>Número de Bits.................. .................. .................. .................. ............
║
╠═>Número de voces.................. .................. .................. .................. .........
║
╠═>Calidad del sonido – KHz.................. .................. .................. ...............
║
╠═>Tipo de síntesis MIDI.................. .................. .................. .................. ..
║
╠═>Los parlantes.................. .................. .................. .................. ................
║
╚═>Otras Utilidades.................. .................. .................. .................. ...........
╠═>Entradas salidas. Tipos de conectores.................. .................. .................. ..........
╠═>Características técnicas e Información de la placa de sonido utilizada...............
╚═>Bibliografía, Materia integrada..............................................................................
VII– 1.
VII– 1.
VII– 1.
VII– 1.
VII– 2.
VII– 2.
VII– 2.
VII– 2.
VII– 2.
VII– 2.
VII– 2.
VII– 3.
VII– 4.
VII– 5.
VII– 5.
Capítulo8
DSP (Digital Signal Procesor)
╠═>Introducción. ….…….…….…….…….…….…….…….…….…….…….……..
╠═>Procesador de sonido digital (DSP). ….…….…….…….…….…….…….……..
╠═>El Chip sintetizador de FM. ….…….…….…….…….…….…….…….…….….
╠═>Programación del puerto MIDI para I/O. ….…….…….…….…….…….……...
║
╠═>El modo SB-MIDI. ….…….…….…….…….…….…….…….…….…
║
╚═>El modo MPU-401. ….…….…….…….…….…….…….…….……....
╚═>Bibliografía, Materia Integrada.............................................................................
VIII– 1.
VIII– 1.
VIII– 2.
VIII– 4.
VIII– 4.
VIII– 4.
VIII– 5.
Capítulo9
Formatos digitales
╠═>Introducción. …………………………………………………………………….
╠═>Almacenamiento. ………………………………………………………………..
║
╚═>Sonido Audio Digital. ………………………………………………….
╚═>Formato de archivo: WAVE.................................................................................
╠═>Introducción. ………………………………………………………….
╠═>Especificación RIFF. …………………………………….....................
╠═>Ficheros de sonido WAVE. …………………………………………...
╠═>Tipo de compresión utilizado por WAVE. ……………………………
╠═>Formato de los ficheros de Sonido WAV. …………………………….
╠═>Lectura y grabación de archivos WAVE bajo Windows. ……………..
╚═>Análisis de frecuencia. ……………………………………...................
IX– 1.
IX– 1.
IX– 1.
IX– 3.
IX– 3.
IX– 3.
IX– 3.
IX– 3.
IX– 4.
IX– 4.
IX– 4.
Capítulo 10
MCI de Windows
╠═>Introducción. …………………………………………………………………….
╠═>Comandos MCI “Strings” y “Messages”. ……………………………………….
║
╠═>Comandos “Strings”. …………………………………………………..
║
╠═>Comandos “Messages”. ………………………………………………..
║
╚═>Posibilidades de audio de las cadenas de comandos. ………………….
╠═>Clasificación de los comandos MCI. ……………………………………………
║
╠═>Comandos del sistema . ………………………………………………..
║
╠═>Los Comandos requeridos. …………………………………………….
║
╠═>Los Comandos básicos. ………………………………………………..
║
╚═>Los Comandos extendidos. …………………………………………….
╠═>Funciones MCI, Macros, y Mensajes. …………………………………………..
║
╚═>Descripción de la macro ………………………………………………
╠═>Espera, Notificación, y Banderas Prueba ………………………………………
X – 1.
X – 1.
X – 1.
X – 2.
X – 2.
X – 3.
X – 3.
X – 3.
X – 3.
X – 4.
X – 4.
X – 4.
X – 5.
║
╠═>Bandera de la Espera …………………………………………………..
║
╠═>Bandera de información. ……………………………………………...
║
╚═>Bandera de Prueba ……………………………………………………..
╠═>Comandos de atajo y Variaciones ……………………………………………..
╠═>Dispositivos MCI ………………………………………………………………
║
╠═>Control del dispositivo ………………………………………………..
║
╠═>Reproducción y Posicionamiento ……………………………………..
║
╠═>Tipos de dispositivos ………………………………………………….
║
╠═>Nombres de los dispositivos …………………………………………..
║
╚═>Driver de soporte para los Comandos de MCI ………………………..
╠═>Trabajando con dispositivos MCI………………………………………………..
║
╠═>Abriendo un dispositivo. ………………………………………………
║
║
╠═>Usando un seudónimo. ……………………………………….
║
║
╠═>Especificando un tipo de dispositivo.........................................
║
║
╠═>Los dispositivos simples y compuestos. ……………………...
║
║
╠═>Abriendo un dispositivo usando la extensión. ………………..
║
║
╚═>Archivo nuevo de dato. ………………………………………
║
╠═>Información recuperada de un Dispositivo …………………………….
║
╠═>Obtención de la información del sistema de MCI …………………….
║
╠═>Ejecutando un Dispositivo …………………………………………….
║
╠═>Grabación ……………………………………………………………...
║
║
╚═>Guardando un Archivo Grabado …………………………….
║
╠═>Detener, y hacer una pausa. ……………………………………………
║
╚═>Cerrando un Dispositivo ………………………………………………
╠═>La interfaz de mensajes de comandos desde el lenguaje C……………………...
╠═>Resumen del manejo de un dispositivo MCI. …………………………………..
╚═>Limitaciones de los comandos MCI……………………………………………..
X – 5.
X – 5.
X – 5.
X – 5.
X – 6.
X – 6.
X – 6.
X – 7.
X – 7.
X – 8.
X – 8.
X – 8.
X – 8.
X – 8.
X – 8.
X – 9.
X – 9.
X – 9.
X – 9.
X – 9.
X – 10.
X – 10.
X – 10.
X – 10.
X – 11.
X – 11.
X – 12.
Capítulo 11
Programa de adquisición
╠═>Introducción. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>Programas bajo Windows.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Independencia de la máquina.... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Recursos.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
║
╠═>Ventanas.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
║
╠═>Eventos.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Proyectos.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ................
║
╚═>Controles.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
╚═>Descripción del Programa. .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
╠═>Ficheros de cabecera.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>Declaración del prototipo de las funciones. .... .... .... .... .... .... .... .... .... ..
╠═>Declaración de variables globales.... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>Función Win main.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
║
╠═>Declaración.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
║
╠═>Inicialización.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
║
╚═>Bucle de mensajes.... .... .... .... .... .... .... .... .... .... .... .... .... .... ...
╠═>El procedimiento de ventana.... .... .... .... .... .... .... .... .... .... .... .... .... .... .
║
╠═>Manipulador de mensajes.... .... .... .... .... .... .... .... .... .... .... .... .
║
╚═>Menús.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .
╠═>Funciones de grabación y reproducción.... .... .... .... .... .... .... .... .... .... ....
║
╠═>Función Grabar.... .... .... .... .... .... .... .... .... .... .... .... ...
║
╚═>Función Reproducir.... .... .... .... .... .... .... .... .... .... .... .
╠═>Funciones de diálogo.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ..
║
╠═>Función diálogo “Nombre de archivo” .... .... .... .... ......
║
╚═>Función diálogo “Tiempo de adquisición” .... .... .... ....
╠═>Fichero cabecera “ids.h” .... .... .... .... .... .... .... .... .... .... .... .... .... .... ......
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
1.
1.
1.
1.
1.
1.
2.
2.
2.
2.
3.
3.
4.
4.
4.
5.
5.
5.
6.
7.
7.
10.
11.
11.
12.
13.
╠═>Ficheros de recursos.... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Menú.... .... .... .... .... .... .... .... .... .... .... .... .... .... .........
║
╚═>Diálogos. .... .... .... .... .... .... .... .... .... .... .... .... .... .......
╠═>Estructura del proyecto......... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>Cabecera ids.h.... .... .... .... .... .... .... .... .... .... .... .... ....
║
╠═>winMenu.c.... .... .... .... .... .... .... .... .... .... .... .... .... ....
║
╚═>Recurso win003.rc.... .... .... .... .... .... .... .... .... .... .... ...
╚═>Manejo de la aplicación.. .... .... .... .... .... .... .... .... .... .... .... .... .... .... ....
XI –
XI –
XI –
XI –
XI –
XI –
XI –
XI –
13.
14.
14.
14.
15.
15.
15.
17.
Capítulo 12
Transformadas de Fourier y la DFT.
╠═>Introducción.........................................................................................................
╠═>Clases CT y DT de métodos de Fourier...............................................................
╠═>Transformada clásica de Fourier para señales de tiempo continuo......................
║
╚═>Definición (CTFT)...................................................................
╠═>El espectro de Fourier del modelo de muestreo de tiempo continúo. ..................
╠═>La transformada de Fourier de tiempo discreto....................................................
║
╚═>Relación entre el espectro de tiempo continuo y discreto........
╚═>La transformada discreta de Fourier (DFT)..........................................................
XII – 1.
XII – 1.
XII – 2.
XII – 2.
XII – 2.
XII – 2.
XII – 3.
XII – 3.
Capítulo 13
Análisis de espectro con MATLAB.
╠═>Introducción......................................................................................................... ...
╠═>Procesamiento.m............................................................... .....................................
╠═>En tiempo continuo...................... ..........................................................................
╠═>En tiempo Discreto. .................. .............................................................................
╠═>Espectro continuo.................................................... ...............................................
╠═>Espectro discreto.....................................................................................................
╚═>Bibliografía.......................................................... ...................................................
XIII – 1.
XIII – 2.
XIII – 3.
XIII – 3.
XIII – 4.
XIII – 5.
XIII – 5.
Apéndice A
Código fuente del programa.
╠═>winmenu.c......................................................................................................... ...
╚═>Recurso win003.rc........................................................... ....................................
A – 1.
A – 15.
Capítulo 1
Introducción general
Introducción.
En este apartado se presentaran los componentes fundamentales del proyecto los cuales serán tratados con
profundidad en los siguientes capítulos.
El analizador de espectros aquí tratado consiste en tomar una señal cualquiera y obtener su contenido
frecuencial. Dicho de otro modo se representaran gráficamente las amplitudes de cada una de las armónicas
que componen la señal, utilizando para ello una PC.
Obtención de datos y análisis.
Existen varias formas de realizar el análisis de espectro, una de las mas sencillas es adquiriendo los datos de
forma digital y luego procesarlos. Para ello utilizaremos la placa de sonido como adquisidor, una vez que
obtenemos los datos los almacenamos en disco con un formato de tipo de onda o sea lo almacenamos como
un archivo cuya extensión es “.wav”. para el análisis de espectro se toma este archivo se elimina la cabecera y
se lo procesa en el programa MATLAB.
Etapas para el análisis
Para poder realizar el análisis frecuencial se tienen las siguientes etapas:
•
•
•
•
•
•
Etapa de entrada.
Adaptador de nivel.
Adquisición.
Medición.
Memoria.
Presentación.
Etapa de entrada:
Es la encargada de impedir el paso de señales indeseables y proteger al dispositivo en caso de sobre tensión o
algún otra anomalía.
Adaptador de nivel:
Consiste en variar la ganancia de un amplificador con el objetivo de obtener una señal con un nivel constante
de amplitud para que los datos obtenidos en la adquisición no se modifiquen constantemente con cualquier
variación de la amplitud de la señal de entrada.
Adquisición:
Consiste en tomar los datos que luego serán procesados.
Medición:
Para realizar la medición o sea interpretar los datos obtenidos es importante conocer el rango de frecuencias
en el cual se está realizando la adquisición de estos datos, es decir la frecuencia mínima y máxima de
muestreo, que en este caso se encuentra en 50Hz y 50kHz, rango que comprende el espectro de audición
humana.
Memoria:
Es la encargada de almacenar los datos obtenidos de la adquisición, para ello se usa la memoria RAM de la
PC.
Presentación:
Por medio de un programa poder visualizar los datos obtenidos y procesados.
I - 1
Diagrama en bloques.
La etapa de adquisición y filtrado es realizada por medio de una placa de sonido la cual posee un DSP y un
filtro pasa bajos.
La adquisición se realiza después de que la señal fue filtrada por el filtro pasa bajos, el cual evita el paso de
señales de alta frecuencia que no están en el rango de medición. La señal debe ser muestreada a una razón de
muestreo determinada.
Estas acciones la ejecuta la placa de sonido ya que posee el filtro pasa bajos y realiza el muestreo de la señal a
una frecuencia de muestreo de hasta 44,1 Khz a 16 bits.
Los datos obtenidos del muestreo se almacenan en la memoria RAM de la PC, luego, estos datos, son usados
por el software para realizar el procesamiento de dichos datos.
El procesamiento consiste en obtener las componentes frecuenciales de la señal muestreada.
Procesamiento de señales
El procesamiento de la señal se puede realizar de dos formas:
⇒ Análisis mediante Transformada Rápida de Fourier.
Es un análisis de banda angosta que se aplica sobre cada señal muestreada. Para ello se debe segmentar
los datos muestreados en varias ventanas, luego ponderar cada ventana definida, una ves realizado este
proceso se aplica el algoritmo de la Transformada Rápida de Fourier a cada ventana previamente
ponderada y se obtienen los espectros de todas las ventanas y finalmente la promediación del los
espectros hallado con uno anteriormente calculado.
⇒ Análisis mediante Filtros Digitales.
Para hacer el análisis de banda ancha por octavas ó tercio de octavas la cual es mayormente usado en
Audio y Acústica. Consiste en pasar el segmento de datos muestreados a través de un banco de filtros
pasabanda con frecuencia centrales y ancho de banda estandarizados ( 37.5 Hz, 63 Hz, 125 Hz, 250 Hz,
... frecuencias centrales de los filtros por octava ). A la salida de cada filtro se obtendrá una señal
filtrada, a la cual se le halla su potencia eléctrica, agrupando todas las potencias de las señales
obtenidas a la salida de cada filtro, se consigue un espectro de potencia que refleja la distribución
espectral de la señal muestreada. Para hacer el análisis de una señal en la banda de audio se requiere 10
filtros pasabanda analógicos por octavas ó 30 filtros pasa banda analógicos por 1/3 de octava, pero
usando técnicas de procesamiento se consigue realizar el análisis por octava con sólo un filtro digital
pasabanda ó sólo 3 filtros por 1/3 de octava.
I - 2
Aplicaciones comerciales:
El analizador de espectros puede ser usado para variadas aplicaciones tanto en ambientes industriales como
también aplicaciones didácticas, algunas de estas aplicaciones son las siguientes:
Encontrar las respuestas de los filtros.
Medición de equipos de Audio.
Medición de parámetros acústicos.
Ecualización de salas acústicas.
Análisis modal de estructuras.
Análisis de ruidos.
Consultas
Al comienzo de nuestro proyecto fue de mucha importancia obtener información de los distintos métodos para
el análisis de espectros, para ello se realizaron consultas al Ing. Franzini Hugo profesor de la cátedra
Comunicaciones I, ya que dicha materia trata el tema de transformada de Fourier; y al Ing. Culasso Víctor
profesor de la cátedra Medidas electrónica II, en dicha materia se trata el tema “análisis de espectros”.
La consulta a los profesores antes mencionados nos llevo a realizar el proyecto tomando como
fundamento un análisis de espectro digital.
En los capítulos posteriores se nombran las consultas realizadas y la bibliografía utilizada para cada
tema.
Materias Integradas.
Informática II, Análisis de señales y sistemas, Comunicaciones I, Técnicas digitales III, Medidas electrónicas
II.
I - 3
Capítulo 2
Sonido
Introducción
El Sonido es un fenómeno físico que percibimos al producirse una perturbación en el medio en el cual
estamos, son ondas que en este caso, se propagan por aire, sólidos o líquidos.
El cuerpo humano percibe el sonido como un cambio en la presión del aire en el tímpano. De este modo, por
ejemplo: si alguien aplaude, ese aplauso desplaza aire que hace vibrar a las sensibles membranas de nuestros
oídos, esa vibración es decodificada por el cerebro como sonido. Es una forma de energía mecánica que se
representa por una onda sinusoidal que muestra vibraciones a lo largo del tiempo.
En los seres humanos, esto ocurre siempre que una vibración con frecuencia comprendida entre unos 15 y
20.000 hercios llega al oído interno. El hercio (Hz) es una unidad de frecuencia que corresponde a un ciclo
por segundo. Estas vibraciones llegan al oído interno transmitidas a través del aire, y a veces se restringe el
término “sonido” a la transmisión en este medio. Sin embargo, en la física moderna se suele extender el
término a vibraciones similares en medios líquidos o sólidos. Los sonidos con frecuencias superiores a unos
20.000 Hz se denominan ultrasonidos.
En general, las ondas pueden propagarse de forma transversal o longitudinal. En ambos casos, sólo la
energía y la cantidad de movimiento del movimiento ondulatorio se propagan en el medio; ninguna
parte del propio medio se mueve físicamente a una gran distancia. Por ejemplo, imaginemos que
atamos firmemente una cuerda a un poste por un extremo, la estiramos sin tensarla del todo y
sacudimos el otro extremo. Una onda se desplazará por la cuerda hacia el poste, donde se reflejará y
volverá hacia la mano. En realidad, ninguna parte de la cuerda se mueve longitudinalmente hacia el
poste, pero todas las partes de la cuerda se mueven transversalmente. Este tipo de movimiento
ondulatorio se denomina onda transversal. Del mismo modo, si tiramos una piedra a un estanque, una
serie de ondas transversales se propaga desde el punto de impacto. Un corcho que flote cerca de dicho
punto se moverá hacia arriba y hacia abajo, es decir, de forma transversal a la dirección del
movimiento ondulatorio, pero apenas mostrará movimiento longitudinal. En cambio, una onda de
sonido es una onda longitudinal. A medida que la energía del movimiento ondulatorio se propaga
alejándose del centro de la perturbación, las moléculas de aire individuales que transmiten el sonido se
mueven hacia delante y hacia atrás, de forma paralela a la dirección del movimiento ondulatorio. Por
tanto, una onda de sonido es una serie de compresiones y enrarecimientos sucesivos del aire. Cada
molécula individual transmite la energía a las moléculas vecinas, pero una vez que pasa la onda de
sonido, las moléculas permanecen más o menos en la misma posición.
Características físicas
Cualquier sonido sencillo, como una nota musical, puede describirse en su totalidad especificando tres
características de su percepción: el tono, la intensidad y el timbre. Estas características corresponden
exactamente a tres características físicas: la frecuencia, la amplitud y la composición armónica o forma
de onda. El ruido es un sonido complejo, una mezcla de diferentes frecuencias o notas sin relación
armónica.
II - 1
Frecuencia
Percibimos la frecuencia de los sonidos como tonos más graves o más agudos. La frecuencia es el número de
ciclos (oscilaciones) que una onda sonora efectúa en un tiempo dado; se mide en hercios (ciclos por segundo).
Existen distintos métodos para producir sonido de una frecuencia deseada. Por ejemplo, un sonido de
440 Hz puede crearse alimentando un altavoz con un oscilador sintonizado a esa frecuencia. También
puede interrumpirse un chorro de aire mediante una rueda dentada con 44 dientes que gire a 10
revoluciones por segundo; este método se emplea en las sirenas. Los sonidos de un altavoz y una sirena
de la misma frecuencia tendrán un timbre muy diferente, pero su tono será el mismo, equivalente al la
situado sobre el do central en un piano. El siguiente la del piano, la nota situada una octava por encima,
tiene una frecuencia de 880 Hz. Las notas situadas una y dos octavas por debajo tienen frecuencias de
220 y 110 Hz respectivamente. Por definición, una octava es el intervalo entre dos notas cuyas
frecuencias tienen una relación de uno a dos.
Una ley fundamental de la armonía afirma que dos notas separadas por una octava producen una
combinación eufónica cuando suenan simultáneamente. Cuando el intervalo es de una quinta o de una
tercera mayor, la combinación es progresivamente menos eufónica. En física, un intervalo de una
quinta implica que la relación de las frecuencias de ambas notas es de tres a dos; en una tercera mayor,
la relación es de cinco a cuatro. La ley de la armonía afirma que dos o más notas producen un sonido
eufónico al sonar de forma simultánea si la relación entre sus frecuencias corresponde a números
enteros pequeños; si las frecuencias no presentan dichas relaciones, se produce una disonancia.
Amplitud y Volumen.
La amplitud de una onda de sonido es el grado de movimiento de las moléculas de aire en la onda, que
corresponde a la intensidad del enrarecimiento y compresión que la acompañan. Cuanto mayor es la amplitud
de la onda, más intensamente golpean las moléculas el tímpano y más fuerte es el sonido percibido. La
amplitud de una onda de sonido puede expresarse en unidades absolutas midiendo la distancia de
desplazamiento de las moléculas del aire, o la diferencia de presiones entre la compresión y el enrarecimiento,
o la energía transportada. Por ejemplo, la voz normal presenta una potencia de sonido de aproximadamente
una cienmilésima de vatio. Sin embargo, todas esas medidas son muy difíciles de realizar, y la intensidad de
los sonidos suele expresarse comparándolos con un sonido patrón; en ese caso, la intensidad se expresa en
decibelios.
II - 2
Decibelio dB
El decibelio es una unidad logarítmica de medida utilizada en diferentes disciplinas de la ciencia. En
todos los casos se usa para comparar una cantidad con otra llamada de referencia. Normalmente el
valor tomado como referencia es siempre el menor valor de la cantidad. En algunos casos puede ser un
valor promediado aproximado. En Acústica la mayoría de las veces el decibelio se utiliza para
comparar la presión sonora, en el aire, con una presión de referencia. Este nivel de referencia tomado
en Acústica, es una aproximación al nivel de presión mínimo que hace que nuestro oído sea capaz de
percibirlo. El nivel de referencia varia lógicamente según el tipo de medida que estemos realizando. No
es el mismo nivel de referencia para la presión acústica, que para la intensidad acústica o para la
potencia acústica. A continuación se dan los valores de referencia.
Nivel de Referencia para la Presión Sonora (en el aire) = 0.00002 = 2E-5 Pa (rms)
Nivel de Referencia para la Intensidad Sonora ( en el aire) = 0.000000000001 = 1E-12 w/m^2
Nivel de Referencia para la Potencia Sonora (en el aire) = 0.00000000001 = 1E-12 w
Como su nombre indica el decibelio es la décima parte del Bel. El Bel es el logaritmo en base 10 de la
relación de dos potencias o intensidades. No obstante esta unidad resulta demasiado grande por lo que se ha
normalizado el uso de la décima parte del Bel, siendo el decibel o decibelio. La formula para su aplicación es
la siguiente, partiendo que la intensidad acústica en el campo lejano es proporcional al cuadrado de la presión
acústica, se define el nivel de presión sonora como:
LP = 10 log
P2
P
= 20 log
PR
PR
Siendo Lp = Nivel de Presión sonora; p la presión medida; pr la presión de referencia (2E-5 Pa). Como es
fácil ver el nivel de referencia siempre se corresponde con el nivel de 0 dB:
LP = 20 log
0,00002
= 20 log 1 = 0dB
0,00002
Por la tanto en 0 dB tenemos el umbral de audición del oído humano, se supone que no es posible oír
por debajo de este nivel, o sea variaciones de nivel en la presión del aire inferiores a 0,00002 pascal.
La razón por la que se utiliza el decibelio es que si no, tendríamos que estar manejando números o muy
pequeños o excesivamente grandes, con lo que la posibilidad de error seria muy grande al hacer
cálculos. Además también hay que tener en cuenta que el comportamiento del oído humano esta más
cerca de una función logarítmica que de una lineal, ya que no percibe la misma variación de nivel en las
diferentes escalas de nivel, ni en las diferentes bandas de frecuencias.
Medición del Nivel Sonoro
Para medir el nivel sonoro disponemos de los Sonómetros. Estos aparatos nos permiten conocer el Nivel de
Presión sonora o SPL (Sound Presure Level). Normalmente suelen ser sistemas digitales y presentan en una
pantalla de cristal liquido los valores medidos. Estos siempre se dan como decibelios dB y en referencia al
valor antes señalado de (2E-5 Pa). Con el sonómetro es posible además del hallar el valor rms de la presión,
también ver los picos máximos y niveles mínimos de la medida. Los sonómetros normalmente no dan la
medida en dB lineales si no que dan ya con la ponderación y son dBA/dBC etc..
Una función muy utilizada a la hora de medir niveles de presión acústica y que ofrecen los sonómetros es la
medición en modo Leq. Normalmente se utiliza el Leq 1' (leq a un minuto). El sonómetro mide las diferentes
II - 3
presiones que se generan durante un tiempo determinado (Leq X) siendo X = 1 minuto en nuestro caso, el
valor que nos da al finalizar el minuto de medida es un valor en dB que equivaldría al de una señal de valor
continuo durante todo el minuto y que utilizaría la misma energía que se ha medido durante el minuto. Hay
que observar que en una medida de un minuto los valores varían y si se quiere determinar un valor medio de
ruido hay que hacerlo con la función Leq, de otra forma se obtendrán valores erróneos puesto que podemos
tener valores de pico durante un instante y no ser representativos del nivel de ruido normal que se esta
intentando determinar.
El dBA o la ponderación -AEn el punto anterior hemos visto que el dB es un valor lineal, quiere decir que los valores medidos son
los valores tomados como validos sin que sufran ninguna alteración. Si los valores de presión acústica
los medimos de esta forma, linealmente, aun siendo cierta dicha medida, tendrá poco valor en cuanto a
la percepción del odio humano. El oído no se comporta igual para el mismo nivel de presión en
diferentes frecuencias. Por ejemplo tomemos un sonido lineal en toda la banda de 20 Hz a 20 kHz
tenemos en todas las bandas un nivel de 30 dB, si nuestro oído fuese lineal oiríamos los mismo o mejor
con la misma intensidad auditiva las frecuencias mas bajas, que las medias y que las agudas. Sin
embargo esto no es cierto el oído humano tiene una menor sensibilidad en las frecuencias mas graves, y
en las mas agudas frente a las medias. Lo que mas oímos por tanto son las frecuencias medias, y las que
menos las mas graves seguidas de las más agudas.
Como vemos es necesario encontrar una forma de ajustar los niveles de dB que hemos medido con la
percepción que el oído tiene de los mismos según cada frecuencia. Esta corrección se realiza ponderando los
dB medidos mediante una tabla de ponderación ya especificada y que se llama tabla "A". Los decibelios ya
ponderados en "A" se representan como dBA y los no ponderados, llamados lineales, como dB.
Por ejemplo si en una frecuencia de 100 Hz hemos medido 80 dB, al ponderarlo pasaran a ser 60,9 dBA, esto
quiere decir que un nivel de presión sonora de 80 dB en una frecuencia de 100 Hz es oída por nuestro sistema
de audición como si realmente tuviese 60,9 dBA y no 80 dB.
Suma de niveles de sonido
Hemos visto que el decibelio es una función logarítmica y por tanto cuando hablamos de dB de presión
sonora no es posible sumarlos sin mas. Por ejemplo 30 dB + 30 dB no es igual a 60 dB si no a 33 dB
como vamos a ver a continuación.
Para poder sumar dos decibelios podemos emplear la siguiente ecuación:
dB1 + dB2 = 10 log(10
dB1
10
+ 10
dB2
10
)
La suma de dos dB nunca puede ser más de 3 dB más que el mayor de los dos. Si la diferencia que hay entre
los dos valores a sumar es mayor de 10 dB la suma no tiene valor practico y se toma el valor del mayor de los
dos. Por ejemplo si sumamos 20 dB + 10 dB el resultado será igual a 20 dB (aproximado). Solamente son
significativos para la suma los valores que tienen una diferencia menor a 10 dB.
Presión Acústica y el Nivel de Presión Acústica
La presión sonora como hemos visto antes, es la presión que se genera en un punto determinado por una
fuente sonora. El nivel de presión sonora SPL se mide en dB(A) SPL y determina el nivel de presión que
realiza la onda sonora en relación a un nivel de referencia que es 2E-5 Pascal en el aire.
Es el parámetro más fácil de medir, se puede medir con un sonómetro. Su valor depende del punto donde
midamos, del local etc. Realmente no da mucha información sobre las características acústicas de la fuente, a
no ser que se haga un análisis frecuencia de los nivel de presión, dado que el SPL siempre esta influenciado
por la distancia a la fuente, el local etc.
Intensidad fisiológica de un sonido.
La intensidad fisiológica o sensación sonora de un sonido se mide en decibelios (dB). Por ejemplo, el
umbral de la audición está en 0 dB, la intensidad fisiológica de un susurro corresponde a unos 10 dB y
II - 4
el ruido de las olas en la costa a unos 40 dB. La escala de sensación sonora es logarítmica, lo que
significa que un aumento de 10 dB corresponde a una intensidad 10 veces mayor: por ejemplo, el ruido
de las olas en la costa es 1.000 veces más intenso que un susurro, lo que equivale a un aumento de 30
dB.
La distancia a la que se puede oír un sonido depende de su intensidad, que es el flujo medio de energía
por unidad de área perpendicular a la dirección de propagación. En el caso de ondas esféricas que se
propagan desde una fuente puntual, la intensidad es inversamente proporcional al cuadrado de la
distancia, suponiendo que no se produzca ninguna pérdida de energía debido a la viscosidad, la
conducción térmica u otros efectos de absorción. Por ejemplo, en un medio perfectamente homogéneo,
un sonido será nueve veces más intenso a una distancia de 100 metros que a una distancia de 300
metros. En la propagación real del sonido en la atmósfera, los cambios de propiedades físicas del aire
como la temperatura, presión o humedad producen la amortiguación y dispersión de las ondas sonoras,
por lo que generalmente la ley del inverso del cuadrado no se puede aplicar a las medidas directas de la
intensidad del sonido.
Intensidad Acústica y el Nivel de Intensidad Acústica
Se puede definir como la cantidad de energía sonora transmitida en una dirección determinada por unidad de
área. Con buen oído se puede citar dentro de un rango de entre 1x10-12 w por metro cuadrado, hasta 1 w.
Para realizar la medida de intensidades se utiliza actualmente analizadores de doble canal con
posibilidad de espectro cruzado y una sonda que consiste en dos micrófonos separados a corta
distancia. Permite determinar la cantidad de energía sonora que radia una fuente dentro de un
ambiente ruidoso. No es posible medirlo con un sonómetro. El nivel de intensidad sonora se mide en
w/m2.
Potencia Acústica y Nivel de Potencia Acústica
La potencia acústica es la cantidad de energía radiada por una fuente determinada. El nivel de potencia
Acústica es la cantidad de energía total radiada en un segundo y se mide en w. La referencia es 1pw = 1E-12
w.
Para determinar la potencia acústica que radia una fuente se utiliza un sistema de medición alrededor de la
fuente sonora a fin de poder determinar la energía total irradiada.
La potencia acústica es un valor intrínseco de la fuente y no depende del local donde se halle. La potencia
acústica el valor no varia por estar en un local reverberante o en uno seco. Al contrario de la Presión Acústica
que si que varia según varié las características del local donde se halle la fuente, la distancia etc.
Tiempo de Reverberación
El Tiempo de Reverberación RT, es el tiempo que tarda una señal, desde que esta deja de sonar, en atenuarse
un nivel de 60 dB. Para realizar la medida se genera un ruido y se mide a partir de que este deja de sonar,
entonces se determina el tiempo que tarda en atenuarse 60 dB.
El Tiempo de Reverberación se mide de forma frecuencial, esto es, un local no tiene el mismo RT en 200
Hz que en 4 kHz. Ello es debido a que el RT viene determinado por el Volumen de la sala, y por los
coeficientes de absorción de sus superficies, o si se prefiere por las superficies con un coeficiente de
absorción determinado. Como los coeficientes de absorción de los diferentes materiales que componen
cualquier local no son iguales para todas las frecuencias, las reflexiones generadas en el interior del
local serán diferentes para cada frecuencia y por lo tanto el RT del local es diferente según las
frecuencias.
Para calcular la RT de un local sin realizar mediciones se puede utilizar la formula de Sabine:
V 
RT60 = 0,163 
 A
V = Volumen de la sala en m3 y A = Superficie de Absorción en m2
Como norma cuanto mayor es el local mayor es el RT. Si los materiales que lo componen internamente son
poco absorbentes el RT también aumentara.
II - 5
El valor de RT es muy importante si se quiere conseguir buenos niveles de inteligibilidad dentro de los
locales.
Coeficiente de Absorción de un material
El coeficiente de absorción de un material es la relación entre la energía absorbida por el material y la
energía reflejada por el mismo. Dada esta formulación su valor siempre esta comprendido entre 0 y 1.
El máximo coeficiente de absorción esta determinado por un valor de 1 donde toda la energía que
incide en el material es absorbida por el mismo, y el mínimo es 0 donde toda la energía es reflejada.
El coeficiente de absorción varia con la frecuencia y por tanto los fabricantes de materiales acústicos dan los
coeficientes de absorción por lo menos en resolución de una octava.
Sabiendo los materiales de una sala y sabiendo sus coeficientes de absorción podemos saber como sonora esa
sala en cada frecuencia y podremos también saber, mediante la formula de Sabine, Eyring etc, el tiempo de
reverberación también por frecuencias.
Timbre.
El timbre es la característica del sonido que nos permite distinguir los tonos producidos por
instrumentos distintos aunque las ondas sonoras tengan la misma amplitud y frecuencia. Los armónicos
son componentes adicionales de la onda que vibran con múltiplos enteros de la frecuencia principal y
dan lugar a diferencias de timbre. El oído distingue por su timbre la misma nota producida por un
diapasón, un violín o un piano.
Si se toca el “la” situado sobre el “do” central en un violín, un piano y un diapasón, con la misma
intensidad en los tres casos, los sonidos son idénticos en frecuencia y amplitud, pero muy diferentes en
timbre. De las tres fuentes, el diapasón es el que produce el tono más sencillo, que en este caso está
formado casi exclusivamente por vibraciones con frecuencias de 440 Hz. Debido a las propiedades
acústicas del oído y las propiedades de resonancia de su membrana vibrante, es dudoso que un tono
puro llegue al mecanismo interno del oído sin sufrir cambios. La componente principal de la nota
producida por el piano o el violín también tiene una frecuencia de 440 Hz. Sin embargo, esas notas
también contienen componentes con frecuencias que son múltiplos exactos de 440 Hz, los llamados
tonos secundarios, como 880, 1.320 o 1.760 Hz. Las intensidades concretas de esas otras componentes,
los llamados armónicos, determinan el timbre de la nota.
Velocidad del sonido.
La frecuencia de una onda de sonido es una medida del número de vibraciones por segundo de un
punto determinado. La distancia entre dos compresiones o dos enrarecimientos sucesivos de la onda se
denomina longitud de onda. El producto de la longitud de onda y la frecuencia es igual a la velocidad de
propagación de la onda, que es la misma para sonidos de cualquier frecuencia (cuando el sonido se
propaga por el mismo medio a la misma temperatura). Por ejemplo, la longitud de onda del la situado
sobre el do central es de unos 78,2 cm, y la del la situado por debajo del do central es de unos 156,4
centímetros.
La velocidad de propagación del sonido en aire seco a una temperatura de 0 °C es de 331,6 m/s. Al
aumentar la temperatura aumenta la velocidad del sonido; por ejemplo, a 20 °C, la velocidad es de 344
m/s. Los cambios de presión a densidad constante no tienen prácticamente ningún efecto sobre la
velocidad del sonido. En muchos otros gases, la velocidad sólo depende de su densidad. Si las moléculas
son pesadas, se mueven con más dificultad, y el sonido avanza más despacio por el medio. Por ejemplo,
el sonido avanza ligeramente más deprisa en aire húmedo que en aire seco, porque el primero contiene
un número mayor de moléculas más ligeras. En la mayoría de los gases, la velocidad del sonido también
depende de otro factor, el calor específico, que afecta a la propagación de las ondas de sonido.
Generalmente, el sonido se mueve a mayor velocidad en líquidos y sólidos que en gases. Tanto en los
líquidos como en los sólidos, la densidad tiene el mismo efecto que en los gases; la velocidad del sonido
varía de forma inversamente proporcional a la raíz cuadrada de la densidad. La velocidad también
varía de forma proporcional a la raíz cuadrada de la elasticidad. Por ejemplo, la velocidad del sonido
en agua es de unos 1.500 m/s a temperaturas ordinarias, pero aumenta mucho cuando sube la
temperatura. La velocidad del sonido en el cobre es de unos 3.500 m/s a temperaturas normales y
II - 6
decrece a medida que aumenta la temperatura (debido a la disminución de la elasticidad). En el acero,
más elástico, el sonido se desplaza a unos 5.000 m/s; su propagación es muy eficiente.
Refracción, reflexión e interferencias.
Un eco es una onda sonora reflejada. El intervalo entre la emisión y la repetición del sonido corresponde al
tiempo que tardan las ondas en llegar al obstáculo y volver. Con frecuencia, el eco es más débil que el sonido
original porque no todas las ondas se reflejan. Generalmente, los ecos escuchados en las montañas se
producen cuando las ondas sonoras rebotan en grandes superficies alejadas más de 30 m de la fuente. Dando
golpecitos en un tubo metálico pegado al oído también pueden escucharse ecos.
El sonido avanza en línea recta cuando se desplaza en un medio de densidad uniforme. Sin embargo,
igual que la luz, el sonido está sometido a la refracción, es decir, la desviación de las ondas de sonido de
su trayectoria original. En las regiones polares, por ejemplo, donde el aire situado cerca del suelo es
más frío que el de las capas más altas, una onda de sonido ascendente que entra en la región más
caliente, donde el sonido avanza a más velocidad, se desvía hacia abajo por la refracción. La excelente
recepción del sonido a favor del viento y la mala recepción en contra del viento también se deben a la
refracción. La velocidad del aire suele ser mayor en las alturas que cerca del suelo; una onda de sonido
ascendente que avanza a favor del viento se desvía hacia el suelo, mientras que una onda similar que se
mueve en contra del viento se desvía hacia arriba, por encima de la persona que escucha.
El sonido también se ve afectado por la reflexión, y cumple la ley fundamental de que el ángulo de
incidencia es igual al ángulo de reflexión. Un eco es el resultado de la reflexión del sonido. El sonar se
basa en la reflexión de los sonidos propagados en agua. Una bocina es un tubo cónico que forma un haz
de ondas de sonido reflejando algunos de los rayos divergentes en los lados del tubo. Un tubo similar
puede recoger ondas de sonido si se dirige el extremo ancho hacia la fuente de sonido.
El sonido también experimenta difracción e interferencia. Si el sonido de una única fuente llega a un
oyente por dos trayectorias diferentes —por ejemplo, una directa y otra reflejada—, los dos sonidos
pueden reforzarse; sin embargo, si no están en fase pueden interferir de forma que el sonido resultante
sea menos intenso que el sonido directo sin reflexión. Las trayectorias de interferencia son distintas
para sonidos de diferentes frecuencias, con lo que la interferencia produce distorsión en sonidos
complejos. Dos sonidos de distintas frecuencias pueden combinarse para producir un tercer sonido
cuya frecuencia es igual a la suma o diferencia de las dos frecuencias originales.
Eco, Reverberación y Resonancia
Cuando se genera un sonido en el interior de un local las superficies que componen el mismo ocasionan una
serie de diferentes efectos dependiendo del las características de dichas superficies.
Esto ocurre porque las ondas sonoras inciden en las diferentes superficies y estas las reflejan de diferente
forma según su coeficiente de reflexión acústica.
Como es lógico, primero siempre se percibe el sonido directo, esto es, el sonido que nos llega a nuestro oído
sin que se aún se halla reflejado en ninguna superficie. Una vez recibido el sonido directo, llegará a nuestros
oídos, con un retraso de tiempo con respecto al sonido directo, el sonido reflejado por las superficies del local.
Tanto el retraso como el nivel sonoro del sonido reflejado dependen de las características físicas del local y
sus superficies.
Si el retraso entre el sonido directo y el reflejado es mayor de 1/10 de segundo, nuestro sistema de audición
será capaz de separar las dos señales y percibirlas como tales, primero una y después la otra, esto es lo que se
entiende por eco. Por ejemplo: supongamos que estamos dentro de un local de grandes dimensiones y una
persona que esta separada de nosotros a cierta distancia nos dice "HOLA"; primero llegara a nuestros oídos el
"HOLA" del sonido directo, y en el caso de un Eco este nos llegara como mínimo 1/10 segundo después, por
lo tanto oiremos "HOLA....(1/10 segundo mínimo)...HOLA", y lo interpretaremos efectivamente como dos
mensajes diferentes separados por un intervalo de tiempo determinado. Sin embargo nuestro interlocutor
únicamente ha articulado un "HOLA".
Cuando en la misma situación que en el caso anterior, el sonido reflejado nos llega con un tiempo inferior a
1/10 de segundo, nuestro sistema de audición no es capaz de separar ambas señales y las toma como una
misma pero con una duración superior de esta. Normalmente esto se entiende como reverberación. La
reverberación de un local se mide según su tiempo de reverberación (rt) en segundos y varia según la
frecuencia de análisis que se utilice. Esto es debido a que los diferentes materiales que componen las
II - 7
superficies del local no se comportan por igual en todo el espectro sonoro, y por tanto los coeficientes de
absorción de cada superficie de un mismo material varia según la frecuencia. Conociendo el tiempo de
reverberación de un local podemos saber como se comportara el mismo en diferentes aplicaciones. Cuando el
tiempo de reverberación alcanza valores muy altos con respecto al sonido directo, puede ocurrir un
enmascaramiento de este y se puede perder la capacidad de entender la información contenida en el mensaje
que se percibe.
La resonancia se ocasiona cuando un cuerpo entra en vibración por simpatía con una onda sonora que incide
sobre el y coincide su frecuencia con la frecuencia de oscilación del cuerpo o esta es múltiplo entero de la
frecuencia de la onda que le incide.
Altura (tono) de un sonido
Como ya sabemos la frecuencia es una entidad física y por tanto puede ser medida de forma objetiva por
diferentes medios. Por contra la altura o tono de un sonido es un fenómeno totalmente subjetivo y por tanto no
es posible medirlo de forma objetiva.
Normalmente cuando se aumenta la frecuencia de un sonido, su altura también sube, sin embargo esto no se
da de forma lineal, o sea no se corresponde la subida del valor de la frecuencia con la percepción de la subida
de tono.
La valoración subjetiva del tono se ve condicionada no solo por el aumento de la frecuencia si no también por
la intensidad, y por el valor de dicha frecuencia. Para frecuencias inferiores a 1.000 Hz (incluida esta), si se
aumenta la intensidad el tono disminuye, entre 1.000 Hz y 5.000 Hz el tono es prácticamente independiente
de la intensidad que tenga, por encima de 5.000 Hz el tono aumenta si aumenta la intensidad.
La unidad de altura es el "Mel". (en ocasiones se utiliza el "Bark" equivalente a 100"Mels").
Sensación de tono
Si se practica una audiometría a una persona joven normal, se comprueba que su oído es sensible a
todos los sonidos entre 15-20 hercios y 15.000-20.000 hercios. El oído de las personas mayores es menos
agudo, sobre todo en las frecuencias más elevadas. El oído es especialmente sensible en la gama que va
desde el “la” situado por encima del “do” central hasta el “la” que está cuatro octavas por encima; en
esa zona, una persona puede percibir un sonido cientos de veces más débil que una octava por encima o
dos octavas por debajo. El grado en que un oído sensible puede distinguir entre dos notas puras que
difieran ligeramente en intensidad o frecuencia varía en los diferentes rangos de intensidad y
frecuencia de los tonos. En sonidos de intensidad moderada situados en el rango de frecuencia para el
que el oído es más sensible (entre 1.000 y 2.000 Hz aproximadamente), es posible distinguir una
diferencia de intensidad de un 20% (1 decibelio, o dB) y una diferencia en frecuencia de un 0,33%
(alrededor de una vigésima de nota). En este mismo rango, la diferencia entre el sonido más tenue que
puede oírse y el sonido más fuerte que puede distinguirse como tal sonido (los sonidos más fuertes se
“sienten”, o perciben, como estímulos dolorosos) es de unos 120 decibelios: una diferencia de intensidad
de aproximadamente un billón de veces.
Todas estas pruebas de sensibilidad se refieren a tonos puros, como los producidos por un oscilador
electrónico. Incluso para esos tonos puros, el oído es imperfecto. Dos notas con frecuencia idéntica pero
una gran diferencia de intensidad pueden aparentar una ligera diferencia de tono. Más importante
resulta la diferencia en las intensidades relativas aparentes en las distintas frecuencias. A intensidades
altas, el oído es aproximadamente igual de sensible a la mayoría de las frecuencias, pero a bajas
intensidades el oído es mucho más sensible a las frecuencias medias que a las extremas. Por tanto, un
equipo de reproducción de sonido que funciona perfectamente parecerá no reproducir las notas más
graves y agudas si se reduce mucho la intensidad.
El efecto Doppler
El efecto Doppler se origina cuando hay un movimiento relativo entre la fuente sonora y el oyente cuando
cualquiera de los dos se mueven con respecto al medio en el que las ondas se propagan. El resultado es la
aparente variación de la altura del sonido. Existe una variación en la frecuencia que percibimos con la
frecuencia que la fuente origina.
II - 8
Para entenderlo mejor supongamos que estamos parados en el anden de una estación, a lo lejos un tren viene a
gran velocidad con la sirena accionada, mientras el tren este lejos de nosotros oiremos el silbido de la sirena
como una frecuencia determinada, cuando el tren pase delante nuestro y siga su camino, el sonido de la sirena
cambia con respecto al estábamos oyendo y con respecto al que vamos a oír una vez que el tren nos rebasa y
sigue su camino.
La frecuencia que aparente se puede determinar según las siguientes fórmulas:
Fuente móvil
• fx = (c/(c-u))fs
Receptor en movimiento:
• fx = ((c-v)/c)fs
Ambos en movimiento:
• fx = ((c-v)/(c-u))fs
•
•
•
•
•
fx = Frecuencia aparente
c = Velocidad del sonido
v = Velocidad del observador
u = Velocidad de la fuente
fs = Frecuencia de la fuente
Tres tipos de sonido importantes
En la voz, la música y el ruido, es raro escuchar un tono puro. Una nota musical contiene, además de la
frecuencia fundamental, tonos más agudos que son armónicos de la misma. La voz contiene una mezcla
compleja de sonidos, de los que algunos (pero no todos) guardan una relación armónica entre sí. El
ruido está formado por una mezcla de muchas frecuencias diferentes dentro de un determinado rango;
por tanto, puede compararse con la luz blanca, que se compone de una mezcla de luces de los distintos
colores. Los distintos ruidos se distinguen por sus diferentes distribuciones de energía en los distintos
rangos de frecuencias.
Cuando se transmite al oído un tono musical que contiene determinados armónicos del tono
fundamental, pero carece de otros armónicos o del propio tono fundamental, el oído forma diferentes
“batidos” o pulsaciones cuya frecuencia es la suma o la diferencia de los sonidos originales, con lo que
producen los armónicos que faltan o el tono fundamental que no figura en el sonido original. Estas
notas también son armónicos de la nota fundamental original. Esta respuesta incorrecta del oído puede
resultar útil. Por ejemplo, un equipo reproductor de sonido sin un altavoz grande no puede producir
sonidos de tono más grave que el “do” situado dos octavas por debajo del “do” central; sin embargo, el
oído de una persona que escuche ese equipo puede proporcionar la nota fundamental a partir de las
frecuencias de batido de sus armónicos. Otra imperfección del oído ante los sonidos ordinarios es la
incapacidad de oír notas de alta frecuencia cuando existen sonidos de baja frecuencia de intensidad
considerable. Este fenómeno se denomina enmascaramiento.
En general, para que se entienda el habla y se comprenda satisfactoriamente un tema musical basta
reproducir las frecuencias entre 250 y 3.000 Hz (el rango de frecuencias de un teléfono normal), aunque
algunos sonidos —como la zeta— requieren frecuencias de hasta 6.000 Hz. Sin embargo, para que el
efecto sea natural hay que reproducir el rango que va aproximadamente de 100 a 10.000 Hz. Los
sonidos generados por unos pocos instrumentos musicales sólo pueden reproducirse con naturalidad
con frecuencias algo más bajas, y algunos ruidos necesitan frecuencias más altas.
Octava, media octava y tercio de octava
El termino de octava se toma de una escala musical, se considera el intervalo entre dos sonidos que tienen una
relación de frecuencias igual a 2 y que corresponde a ocho notas de dicha escala musical. Por ejemplo: si
comenzamos con una nota como DO, la octava completa será: DO-RE-MI-FA-SOL-LA-SI-DO. Si el primer
DO estaba afinado en 440 Hz el segundo estará en 880 Hz, ya que hemos indicado que en la octava hay una
relación de frecuencias igual a 2.
En el caso de un ecualizador gráfico de una octava, las frecuencias centrales de los filtros podían ser las
siguientes: 16 Hz - 31,5 Hz - 63 Hz - 125 Hz - 250 Hz - 500 Hz - 1kHz - 2 kHz - 4 kHz - 8 kHz - 16 kHz. En
algunos casos la relación de 2:1 de la octava no se cumple exactamente.
II - 9
Cuando se necesitan filtros de mayor precisión, de un ancho de banda mas estrecho, se puede dividir la octava
en valores mas pequeños, por ejemplo: la media octava divide cada octava en dos, y por tanto tendremos el
doble de puntos que en una octava, siguiendo con el ejemplo empleado en una octava tendríamos: 16 Hz 22,4 Hz - 31,5 Hz - 45 Hz - 63 Hz - 90 Hz - 125 Hz - 180 Hz - 250 Hz - 355 Hz - 500 Hz - 710 Hz - 1kHz 1,4 kHz - 2 kHz - 2,8 kHz - 4 kHz - 5,6 kHz - 8 kHz - 11,2 kHz - 16 kHz.
En el caso de un tercio de octava, cada intervalo de la octava se divide en tres partes con lo que
tendremos tres veces mas de filtros para poder ajustar, quedando los cortes como siguen : 16 Hz - 20
Hz - 25 Hz - 31,5 Hz - 40 Hz - 50 Hz - 63 Hz - 80 Hz - 100 Hz - 125 Hz - 160 Hz - 200 Hz - 250 Hz - 315
Hz - 400 Hz - 500 Hz - 630 Hz - 800 Hz - 1 kHz - 1,25 kHz - 1,6 kHz - 2 kHz - 2,5 kHz - 3,15 kHz - 4 kHz
- 5 kHz - 6,3 kHz - 8 kHz - 10 kHz - 12,5 kHz - 16 kHz
Filtro de ancho de banda constante
Un filtro de ancho de banda constante consiste básicamente en un filtro de banda estrecha sintonizable y
constante. Esto nos permite seleccionar la frecuencia central que deseamos y también el ancho de banda del
filtro. El ancho de banda del filtro viene dado por el siguiente valor:
w = f2 - f1
Siendo w = ancho de banda del filtro, f2 = frecuencia superior y f1 = frecuencia inferior.
Y la frecuencia central del filtro se obtiene normalmente de:
fc = Raíz Cuadrada(f1*f2)
La frecuencia central se puede ajustar a cualquier punto del espectro y mantienen siempre el mismo ancho de
banda. Por ejemplo: supongamos que tenemos un filtro de ancho de banda constante con un ancho de banda
de 20 Hz, si lo colocamos de forma que la frecuencia inferior sea 100 Hz (f1) la superior será igual a 120 Hz y
su frecuencia central será 109,54 Hz aproximadamente. Si ahora nos desplazamos a un margen de frecuencias
superior, f1 = 4.000 Hz, f2 será igual a 4020 Hz y la frecuencia central será 4010 Hz. Como se ve el ancho de
banda siempre es constante y no varia al variar el punto de trabajo del filtro.
Filtro de ancho de banda proporcional
Los filtros de ancho de banda proporcional son filtros que cumplen la remisa de f2/f1 =constante, o sea que si
dividimos la frecuencia superior por la inferior siempre nos tiene que dar un valor que sea constante, por lo
que el ancho de banda es proporcional a la frecuencia central. En el caso de un filtro de octava y de tercio de
octava la relación de proporción es:
Octava f2/f1 = 2
Tercio de Octava f2/f1 = 2^(1/3)
Como es fácil deducir el ancho de banda de este tipo de filtros varia al variar la frecuencia, cuanto mas
subimos mayor es el ancho de banda, siempre manteniendo la proporción expresada según el filtro sea de
octava, tercio etc.
Cada vez que subimos una octava doblamos el ancho de banda del filtro. Por ejemplo supongamos que
estamos trabajando con un filtro de 1/3 de octava y nos situamos en la frecuencia de 100 Hz tenemos que la
frecuencia inmediatamente inferior es 80 Hz y la superior 125, podemos obtener la relación de
proporcionalidad del filtro según:
f2/f1 = constante
125/80 = 1,56
Podemos ver que tenemos un valor de 1,56 y que corresponde a un ancho de banda de
f2-f1 = 125-80 = 45 Hz.
II - 10
Si ahora con el mismo valor de la proporción (1,56) colocamos el filtro en la frecuencia central de 200 Hz en
lugar de los 100 Hz de antes, veremos que la proporción se mantiene pero el ancho de banda aumenta justo al
doble:
f2/f1 = 250/160 = 1,56
f2-f1 = 250 - 160 = 90 Hz
Cada vez que subamos la frecuencia central aumentara el ancho de banda del filtro en la proporción expresada
(1 octava =2 y 1/3 octava = 2^(1/3)). Cada vez que doblamos la frecuencia se dobla el ancho de banda del
filtro. Por lo tanto este tipo de filtros resultan mas precisos en las frecuencias bajas que en las altas, ya que en
frecuencias como 8 kHz el ancho de banda aumenta hasta 3.700 Hz mientras que como hemos visto para el
mismo filtro en la frecuencia de 100 Hz tiene un ancho de banda de 45 Hz.
Los filtros proporcionales con resoluciones de octava, tercio etc son los mas utilizados tanto en
analizadores como en ecualizadores para fines musicales y acústicos.
Disminución espacial del nivel sonoro
Si tenemos una fuente sonora determinada, y estamos situados a una distancia de ella, al alejarnos o
acercarnos el nivel de presión sonora varia según las características de la fuente, el lugar donde se encuentre y
la distancia entre otros factores. Podemos calcular el nivel de presión acústica dentro de un local en cualquier
punto con la siguiente formula:
Lp = Lw + 10 log ((Q/4*Pi*r*2)+(4/R))
Lp = Nivel de presión sonora.
Lw = Nivel de potencia de la fuente sonora en dB.
Q = Directividad de la fuente sonora.
r = distancia entre la fuente y el punto de medida en metros.
R = constante acústica del local (m2).
En espacios al aire libre se considera que cada vez que se dobla la distancia entre la fuente sonora y el oyente,
se disminuye el nivel sonoro en 6 dB. Por ejemplo supongamos que estamos escuchando un altavoz a una
distancia de 10 metros, si utilizamos un sonómetro y medimos el nivel de presión acústica obtenemos un valor
supuesto de 80 dB, si ahora nos distanciamos 10 metros mas, o sea doblamos la distancia del punto inicial,
obtendremos una lectura de 74 dB, 6 dB menos que en el primer punto, si por ultimo nos alejamos 20 metros
de este ultimo punto, doblando así su distancia, estamos a 40 metros de la fuente, obtendremos también un
descenso de 6 dB, tendremos por tanto, 68 dB.
Micrófono
El micrófono es dispositivo que se utiliza para transformar la energía del sonido en energía eléctrica,
durante el proceso de grabación y reproducción de sonido. Los micrófonos constituyen un elemento
esencial en muchos tipos de sistemas de comunicaciones y de instrumentos de medida de sonido y ruido.
El inventor Alexander Graham Bell creó en 1876 el primer micrófono durante la construcción del
teléfono.
La variante más sencilla de los teléfonos modernos es el micrófono de carbón, utilizado en los teléfonos.
Está compuesto por un disco metálico relleno de gránulos de carbón, recubierto por un diafragma
metálico móvil. El disco y el diafragma disponen de unos cables que van conectados a un circuito
eléctrico, de forma que a través de los gránulos de carbón pasa una corriente eléctrica. Las ondas
sonoras hacen vibrar el diafragma, alterando la presión sobre los gránulos de carbón. La resistencia
eléctrica de los gránulos varía con la presión, haciendo que la corriente se modifique en el circuito con
las vibraciones del diafragma. La corriente puede activar un teléfono cercano o se puede amplificar y
transmitir hasta un receptor remoto. La amplificación de las variaciones de la corriente se puede
utilizar también para modular un transmisor de radio.
Otra variante muy corriente, el micrófono de cristal, emplea cristales piezoeléctricos, en los que se
origina un voltaje entre las dos caras del cristal cuando se le aplica una presión. En este tipo de
II - 11
micrófono las ondas sonoras hacen vibrar un diafragma que a su vez modifica la presión sobre un
cristal piezoeléctrico, lo cual genera un pequeño voltaje que más tarde se amplifica.
Entre los micrófonos dinámicos se encuentran los micrófonos de cinta y los de bobina móvil. Los
primeros llevan una fina cinta metálica adherida al diafragma, colocado en el seno de un campo
magnético. Cuando la onda sonora incide sobre el diafragma y hace vibrar la cinta, en ésta se genera un
pequeño voltaje por inducción electromagnética. El funcionamiento del micrófono de bobina móvil se
basa prácticamente en el mismo principio, pero posee una bobina de hilo fino en lugar de una cinta.
Algunos micrófonos modernos, diseñados para captar solamente sonidos unidireccionales, llevan una
combinación de cinta y de bobina.
Otro tipo es el micrófono de condensador. Posee dos finas láminas metálicas muy próximas, que actúan
como un condensador. La lámina posterior va fija, mientras que la anterior hace de diafragma. Las
ondas sonoras modifican la distancia entre las láminas, alterando la capacitancia eléctrica entre ambas.
Si se integra un micrófono de este tipo en el correspondiente circuito, se pueden amplificar las
variaciones y producir una señal eléctrica. Este tipo de micrófonos suelen ser muy pequeños. En los
audífonos se utiliza otro tipo muy habitual, el micrófono de condensador de electretos.
Las características más importantes de cualquier micrófono son su respuesta en frecuencia,
direccionalidad, sensibilidad e inmunidad a las perturbaciones externas como golpes o vibraciones.
Bibliografía
Biblioteca Encarta.
Apuntes de Sonido digital por Antonio Sacco. www.antoniosaco.com.ar
www.gui.uva.es/login/14/sonido1.html
II - 12
Capítulo 3
Ruido
Introducción
El ruido, en física, es una señal acústica, eléctrica o electrónica formada por una mezcla aleatoria de
longitudes de onda. En teoría de la información, el término ruido designa una señal que no contiene
información. En acústica, el llamado ruido blanco está formado por todas las frecuencias audibles,
igual que la luz blanca está formada por todas las frecuencias visibles. El ruido también es una noción
subjetiva aplicada a cualquier sonido no deseado. La contaminación acústica debida al ruido es un
grave problema medioambiental, sobre todo si se considera que los niveles de sonido superiores a una
determinada intensidad pueden causar daños físicos.
Ruido rosa
El ruido rosa es un ruido cuyo nivel sonoro esta caracterizado por un descenso de tres decibelios por octava.
Cuando el ruido rosa se visualiza en un analizador con filtros de octava, el ruido se ve como si todas las
bandas de octava tuviesen el mismo nivel sonoro, lo cual es cierto, pero el ruido rosa no tiene el mismo nivel
en todas las frecuencias.
Esto ocurre por que como hemos visto los filtros de octava, tercio etc, son filtros proporcionales y por tanto
cada vez que subimos una octava, doblamos el ancho de banda y por ese motivo el ruido rosa decrece 3 dB
por octava, justo la proporción en que aumenta el ancho de banda, el doble. De esta forma visualizamos el
ruido rosa como un ruido de nivel constante en todas las bandas de octava.
Se utiliza para analizar el comportamiento de salas, altavoces, equipos de sonido etc. Es una señal conocida,
mismo nivel en todas las bandas (sonido "plano") , y si lo amplificamos con un altavoz dentro de una sala
podemos conocer datos sobre el comportamiento acústico del altavoz, la sala etc. Normalmente se genera
entre 20 Hz y 20 kHz. Su sonido es muy parecido al que podemos oír cuando se sintoniza entre dos emisoras
de FM, en el espacio que se recibe únicamente el ruido, es como un soplido.
Ruido blanco
El ruido blanco es un ruido cuyo nivel es constante en todas las frecuencias. Si lo visualizamos con un
analizador con filtros de octava, veremos que el espectro mostrado no es lineal como hemos dicho que es el
ruido blanco, si no que aumenta 3 dB por octava. Esto se debe al mismo fenómeno que con el ruido rosa, al
doblar la octava se dobla el ancho de banda y si se tenemos el mismo nivel sonoro en todas las frecuencias, el
nivel sonoro por octava se doblara y aumentara 3 dB con respecto al anterior.
Contaminación acústica
Se refiere al ruido cuando éste se convierte en un sonido molesto que puede producir efectos fisiológicos
y psicológicos nocivos para las personas, llegando también a afectar a poblaciones de animales. La
causa principal de la contaminación acústica es la actividad humana: el transporte, la construcción de
edificios y obras públicas y la industria, entre otras. Los efectos producidos por el ruido pueden ser
fisiológicos, como la pérdida de audición o el insomnio, y psicológicos, como la irritabilidad exagerada.
El ruido viene siendo un problema para la humanidad desde muy antiguo, existiendo referencias
escritas sobre este problema ya desde la época de la Roma imperial. Las primeras normas conocidas
relativas a la contaminación acústica datan del siglo XV, cuando en la ciudad de Berna se prohibió la
circulación de carretas que, por su estado, pudieran producir ruidos excesivos que molestasen a los
ciudadanos. En el siglo XVI, en Zurich se dictó una norma que prohibía hacer ruidos por la noche para
no alterar el descanso de los ciudadanos. En la actualidad, cada país ha desarrollado la legislación
específica correspondiente para regular el ruido y los problemas que éste conlleva.
El ruido se mide en decibelios (dB); los equipos de medida más utilizados son los sonómetros. Un
informe publicado en 1995 por la Universidad de Estocolmo para la Organización Mundial de la Salud
(OMS), considera los 50 dB como el límite superior deseable, si bien las molestias generalizadas en la
III - 1
población ocurren a partir de los 85 dB. Entre 0 y 20 dB se considera que el ambiente es silencioso;
hasta 60 dB se considera que hay poco ruido; entre los 80 y los 100 dB se considera que el ambiente es
muy ruidoso; y sobrepasando este umbral el ruido se hace intolerable. Como ejemplos, valga decir que
el sonido ambiente en un bosque sin perturbaciones ajenas a ese medio rara vez alcanza los 20 dB
(normalmente se encuentra alrededor de 15 dB), sonido que sólo se sobrepasa ligeramente en un
dormitorio. En una biblioteca o en la sala de estar de una vivienda el ruido oscila entre 30 y 40 dB,
mientras que en una oficina típica el ambiente soporta un ruido de unos 65 dB. El ruido del tráfico de
una ciudad está en un nivel de unos 85 dB, el de un camión pesado circulando en 90 dB, el de un
martillo neumático en una obra en 100 dB, y el de un avión despegando entre los 120 y los 130 dB.
Clasificación.
El ruido puede clasificarse por su duración, intensidad, regularidad, impacto (rapidez con que se eleva la
intensidad) o fluctuación, entre otros factores. Existe contaminación acústica natural, como la producida por
las erupciones volcánicas, las emanaciones violentas de los géiseres, la corriente de un río o el ruido de una
colonia de gaviotas, entre otros ejemplos.
Existen medidas destinadas a mitigar o disminuir el nivel de inmisión de ruido (el ruido que recibimos) en
zonas donde éste es excesivamente alto, por ejemplo en las viviendas cercanas a un aeropuerto. Es el caso de
la instalación de dobles ventanas o la colocación de estructuras de hormigón o de metacrilato, o de muros de
tierra en zonas próximas a vías de comunicación.
Bibliografía
Biblioteca Encarta.
Apuntes de Sonido digital por Antonio Sacco. www.antoniosaco.com.ar
www.gui.uva.es/login/14/sonido1.html
III - 2
Capítulo 4
Muestreo de señales
Introducción
Bajo ciertas condiciones, una señal se puede representar, y reconstruir completamente, partiendo del
conocimiento de sus valores instantáneos, o muestras, igualmente espaciados en el tiempo. Esta
propiedad deriva de un resultado básico que se conoce como el “teorema del muestreo”.
El teorema del muestreo hace de nexo entre señales de tiempo continuo con señales de tiempo discreto,
ya que una señal de tiempo continuo mediante una secuencia de muestras instantáneas proporciona un
mecanismo para representar una señal de tiempo continuo mediante una señal de tiempo discreto. En
muchos contextos, el procesamiento de señales de tiempo discreto es más flexible y a menudo preferible
al procesamiento de señales de tiempo continuo, en parte debido a la creciente disponibilidad de
sistemas digitales y de tiempo discreto de bajo costo, ligeros, programables y fácilmente reproducibles.
Esta tecnología también ofrece la posibilidad de explorar el concepto de muestreo para convertir una
señal de tiempo continuo a una señal de tiempo discreto. Después de procesar la señal de tiempo
discreto empleando un sistema de tiempo discreto, podemos convertirla de nuevo a tiempo continuo.
Representación de una señal de tiempo continuo mediante sus muestras: el teorema del muestreo.
Si a una señal x(t) de banda limitada se modula en amplitud con un tren de pulsos periódicos, lo que
corresponde a extraer segmentos de tiempos igualmente espaciados se puede recuperar exactamente mediante
un filtrado pasa bajos si la frecuencia fundamental del tren de pulsos modulador es mayor que el doble de la
frecuencia mas alta presente en x(t). Además la habilidad para recuperar x(t) es independiente de la duración
en tiempo de los pulsos individuales. Entonces, conforme esta duración se hace mas pequeña, la modulación
de los pulsos está, en efecto, representando a la señal x(t) mediante muestras instantáneas igualmente
espaciadas en el tiempo.
IV - 1
Muestreo con tren de impulsos.
El tren de impulsos p(t) se conoce como la función de muestreo, el periodo T como el periodo de muestreo y
la frecuencia fundamental de p(t),
ws = 2π
tenemos:
, como la frecuencia de muestreo. En el dominio del tiempo
T
x p = x(t ) p (t )
donde
+∞
p (t ) =
∑ ∂(t − nT )
n = −∞
x p (t ) es un tren de impulsos cuya amplitudes son iguales a las muestras de x(t) en intervalos espaciados por
T, esto es:
+∞
∑ x(nT )∂(t − nT )
X p (t ) =
n = −∞
de la propiedad de modulación:
X p (t ) =
1
[X (ω ) * P(ω )]
2π
P(ω ) =
2π
T
y sabiendo que:
+∞
∑ ∂(ω − kω )
s
n = −∞
de manera que:
X p (ω ) =
Esto es,
1 +∞
∑ X (ω − kω s )
T n = −∞
x p (ω ) es una función periódica en el dominio de la frecuencia que consiste de una suma de replicas
de X(w) desplazadas y escaladas por 1/T.
IV - 2
Si la frecuencia de muestreo es menor a la frecuencia de la señal muestreada se produce un efecto llamado
traslape en donde los espectros de la señal muestreada se superponen entre si .
Por lo tanto si Ws>2Wm x(t) se puede recuperar exactamente a partir de
x p (t ) por medio de un filtro pasa
bajos con ganancia T y una frecuencia de corte mayor a Wm y menor que Ws – Wm. Este resultado básico,
conocido como teorema del muestreo se puede expresar como sigue:
Teorema del muestreo:
Sea x(t) una señal de banda limitada con X(w)=0 para
ω > ωm .
Entonces x(t) esta determinada
unívocamente por sus muestras x(nT), n = 0,±1,±2,±3,... si
ω > 2ω m
donde:
ωs =
2π
T
Dadas estas muestras, podemos reconstruir x(t) generando un tren de impulsos periódicos en el que los
impulsos sucesivos tienen amplitudes que corresponden a valores de muestras sucesivas. Este tren de
impulsos es entonces procesado a través de un filtro pasa bajos ideal con ganancia T y cuya frecuencia de
corte es mayor que Wm y menor que (Ws-Wm). La salida resultante será exactamente igual a x(t).
La frecuencia de muestreo también se conoce como la frecuencia de Nyquist. La frecuencia 2Wm que, bajo el
teorema del muestreo, debe ser excedida por la frecuencia de muestreo, se denomina por lo común como la
velocidad de Nyquist.
IV - 3
Muestreo con retenedor de orden cero.
El teorema del muestreo establece el hecho de que una señal de banda limitada está representada de manera
univoca por sus muestras y su motivación reside en el muestreo por un tren de impulsos. En la practica, los
pulsos angostos de gran amplitud, que se aproximan a impulsos, son relativamente difíciles de lograr, y con
frecuencia es mas conveniente generar la señal muestreada mediante el dispositivo conocido como retenedor
de orden cero. Tal sistema muestrea la señal x(t) en determinados instantes de muestreo subsecuentes.
La reconstrucción de x(t) a partir de la salida de un retenedor de orden cero puede d nuevo llevarse a cabo
mediante filtrado pasa bajos. Sin embargo, en este caso, el filtro requerido ya no tiene ganancia constante en
la banda de paso.
Bibliografía
Señales y sistemas (Alan V. Oppenheim; Alan S. Willsky).
Materia Integrada
Análisis de señales y sistemas. Tema Muestreo de señales.
IV - 4
Capítulo 5
Conversión de señales analógicas a digitales.
Introducción
Una señal de audio es captada por un micrófono como una señal eléctrica analógica. Se dice que una señal es
analógica, cuando la misma está formada por valores continuos, tanto en el tiempo como en amplitud.
Si bien esta señal puede ser procesada en forma analógica por medios electrónicos, para su procesamiento en
una computadora es necesario digitalizarla. Este proceso de digitalización se realiza con un dispositivo
conocido como conversor analógico digital o (ADC por sus siglas en inglés), y se lleva a cabo en dos pasos:
muestreo y discretización.
El primer paso se conoce con el nombre de muestreo, y consiste en tomar muestras de la señal en forma
periódica.
El segundo paso se conoce como discretización, y consiste en aproximar el valor continuo a una escala
discreta.
El resultado es una secuencia finita de valores enteros, que pueden ser procesados digitalmente:
La precisión con la cual de lleve a cabo la digitalización determinará la calidad de la onda, y está gobernada
principalmente por dos parámetros: frecuencia de muestreo y precisión de discretización.
Digitalización del sonido: Velocidad de Muestreo y Cuantización
Digitalizar un sonido abarca dos procesos: Muestreo y Cuantización.
El Muestreo consiste en tomar información a cerca de la variación de la frecuencia de un sonido, tomando una
cierta cantidad de muestras por segundo, de modo que luego uniendo las muestras tomadas, sea posible
reproducir o volver a "armar" el sonido original. Al proceso de toma de muestras antes mencionado se lo
denomina también "SAMPLEO" y cuanto más muestras se tomen por segundo, mayor será la aproximación al
sonido original. Ahora bien para samplear sonidos audibles, que se encuentran en el rango de frecuencias de
20Hz a 20Khz sin pérdida de información, está comprobado que hay que samplearlos al doble de la
frecuencia más alta, es decir a 44Khz. Hacer un muestreo a 44 Khz significa tomar 44.000 muestras por
segundo (a esta frecuencia se samplea el sonido que escuchamos en los CD de audio comerciales).
El proceso de Cuantización apunta a determinar cuantos valores posibles pueden tener las muestras
tomadas. Esto tiene una relación directa con la con la cantidad de bits asignados a cada muestra.
Resulta claro que se logrará más fidelidad al sonido original tomando muestras de 16 bit que de 8.
V- 1
Cuanto más grande es la velocidad de muestreo y la cantidad de bits por muestra mayor será el archivo
de sonido que se genere. También será mayor un archivo Estéreo que uno Mono. Es por esto que en la
actualidad se han creado formatos de archivo comprimidos como el PCM y el ADPCM.
Ventajas del audio digital
Las ventajas sobre el audio analógico que lo hacen insustituible son:
En primer lugar permite ser almacenado en forma inalterable. Dado que lo que se almacenan son números, es
decir símbolos, es mucho más difícil alterar la información guardada que en el caso en que se guarda un
campo magnético proporcional a la señal, como en un cassette. Otra ventaja es que permite aprovechar la
tecnología de procesamiento digital de señales para introducir efectos, modificaciones o mejoras imposibles o
muy difíciles de lograr analógicamente. Por ejemplo, es posible conseguir retardos, efectos de reverberación,
supresión de ruido, etc.
Pasaje de una señal eléctrica a una señal digital
Se utiliza un proceso de muestreo (discretización en el tiempo) y digitalización (discretización en amplitud).
El muestreo consiste en tomar valores de la señal a intervalos regulares de tiempo. La digitalización consiste
en subdividir el rango útil total de la señal en cierta cantidad de "casilleros" o subintervalos numerados, y
asignar a cada muestra el número de subintervalo en el cual se encuentra. Por ejemplo, si el rango de una
señal que varía entre 0 y 10 V se subdivide en 16 subintervalos, a una muestra de 7,3 V se le asignará un
número igual a la parte entera de 7,3*16/10 = 11,68, es decir 11. Este proceso es llevado a cabo por un
conversor analógico/digital.
Cantidad de subintervalos en que se divide el rango útil de la señal
Normalmente se elige como una potencia de 2, de manera que los valores asignados a las muestras están entre
0 y 2n - 1, donde n corresponde a la cantidad de bits, es decir de dígitos binarios.
Resolución de un sistema de audio digital
Es la cantidad de bits que se utiliza para representar las muestras de audio, es decir la cantidad de bits que
conforman cada palabra. Cuanto mayor sea la resolución, más precisa será la representación. Por ejemplo,
con una resolución de 8 bits, el rango de variación de la señal se divide en 256 subintervalos, mientras que
con una resolución de 16 bits lo hace en 65536 subintervalos, cuya amplitud será, por consiguiente, mucho
menor. El audio digital para el consumo masivo (por ejemplo el CD o las placas de sonido de las
computadoras) tiene una resolución de 16 bits. En sistemas de audio profesional se utilizan 20 bits y aún 24
bits
V- 2
Frecuencia de muestreo
También llamada tasa de muestreo, es la cantidad de muestras por unidad de tiempo. Cuanto mayor sea,
mayor es la respuesta en frecuencia del sistema. El estándar para los discos compactos (CD) es de 44,1 kHz.
La frecuencia de muestreo debe ser mayor que el doble de la máxima frecuencia fmáx presente en la señal.
Esta condición se denomina condición de Nyquist. Obsérvese que no es suficiente que sea mayor que el doble
de la máxima frecuencia útil, ya que si hay ruido por encima de ésta, podría producirse un tipo de distorsión
denominado aliasing.
Según el denominado teorema del muestreo, si se muestrea con una frecuencia que no cumple la condición de
Nyquist al intentar reconstruir la señal se generan frecuencias espurias que no estaban presentes
originalmente. Supongamos, por ejemplo, que queremos muestrear una señal audible que contiene además un
ruido de 35 kHz. Si utilizamos la frecuencia normalizada de 44,1 kHz, a pesar de que ese ruido es
originalmente inaudible (por ser mayor que el límite superior de 20 kHz del oído humano), al intentar
recuperar la señal aparecerá un ruido de 9,1 kHz (= 44,1 kHz - 35 kHz), que es perfectamente audible. Este
tipo de frecuencias que aparecen dentro del espectro útil se denominan frecuencias "alias".
En ese caso hay que actuar sobre la señal. Se utiliza un filtro antialias, que suprime todas las frecuencias por
encima de la frecuencia de Nyquist, es decir la mitad de la frecuencia de muestreo fM. En el caso del CD, que
utiliza una frecuencia de muestreo de 44,1 kHz, el filtro antialias debe conservar todas las frecuencias por
debajo de 20 kHz y eliminar todas las que están por encima de 22,05 kHz (= 44,1 kHz / 2 ).
Reconstrucción de la señal digitalizada
Se utiliza un conversor digital/analógico. Este dispositivo recibe las sucesivas muestras digitalizadas y las
transforma en valores de tensión eléctrica mediante un factor de escala. Por ejemplo, si el factor de escala es
de 10/16 V, una muestra igual a 11 se transformará en un valor de tensión de 11*10/16 = 6,875 V. El valor de
tensión que corresponde a cada muestra se mantiene constante hasta que llega la próxima muestra. Resulta así
una onda escalonada formada por tramos constantes. Estas señales no presentan un efecto importante al
momento de escuchar el sonido, ya que genera frecuencias por encima del espectro audible. Sin embargo, es
conveniente agregar un filtro de suavizado que limite el contenido de frecuencias a lo estrictamente necesario,
para evitar la presencia de frecuencias que podrían interferir con otros procesos, produciendo batidos
audibles, por ejemplo.
A su vez la señal reconstruida no coincide exactamente con la original por que si comparamos la señal
original con la señal reconstruida vemos, por ejemplo, que un valor de señal de 7,3 V se "reconstruyó" como
6,875 V, introduciéndose un error de -0,425 V. El error será tanto menor cuanto más pequeños sean los
subintervalos en que se divide el rango útil de la señal, es decir, cuanto mayor sea la resolución en bits. La
evolución en el tiempo de este error se denomina ruido de digitalización.
Relación entre el ruido de digitalización y la resolución
La mejor manera de evaluar el ruido de cualquier sistema (incluidos los de audio digital) es a través de la
relación señal / ruido (S/R) en decibeles. Para el audio digital, la máxima S/R que puede obtenerse es,
aproximadamente, igual a 6*n, donde n es la resolución en bits. Por ejemplo, un sistema de 16 bits, como el
disco compacto (CD), admite una S/R de 6*16 = 96 dB. Nota: Debido a limitaciones en la parte analógica, la
S/R suele ser menor que ese valor, por ejemplo 90 dB.
Una resolución de 24 bits implica una relación señal / ruido de 144 dB. Ello significa que si la señal es de 4 V
(un valor considerado muy alto para una señal de nivel de línea), entonces el ruido de digitalización estará 144
dB por debajo, que son 0,25 microvolts (esto significa que el salto que se produce entre el escalón
correspondiente a un valor digital y el escalón que le sigue es de 0,25 microvolt). Ahora bien, casi todas las
salidas de línea tienen una resistencia (impedancia) de salida del orden de 100 ohms. Toda resistencia tiene un
ruido eléctrico (de origen térmico) que, calculado para este valor de resistencia, da 0,18 microvolt. Esto
significa que con 24 bits estamos prácticamente al límite de lo que puede lograrse con la electrónica
analógica. La mayor relación S/R que idealmente podría lograrse con una resolución mayor sería
inaprovechable a causa del ruido térmico. Por otra parte, el ruido circuital no es sólo térmico. Los
semiconductores en general producen bastante ruido, siendo muy raros (y costosos) los circuitos con
relaciones señal / ruido mayores de 120 dB.
La relación señal / ruido necesaria para una buena calidad de reproducción debería ser comparable con el
rango dinámico del oído, que es la diferencia entre el umbral de dolor y el umbral de audición. En el caso más
extremo, es decir el de personas jóvenes con excelente audición, estos umbrales están cerca de 120 dB y 0 dB
V- 3
respectivamente, por lo cual una relación señal / ruido de 120 dB debería ser suficiente para las mayores
exigencias. Sin embargo, en general las condiciones de escucha normales no permiten llevar a la práctica esta
relación señal / ruido, ya que es muy difícil lograr ambientes con ruido de fondo inferior a 20 dB. Por lo tanto
una relación señal / ruido de 100 dB debería resultar suficiente en la mayor parte de los casos.
El trabajar con 20 bits y 24 bits, obteniendo relaciones S/R de 120 dB y 144 dB respectivamente, permite una
mejor calidad en la conversión. Un conversor de 20 bits es mucho más lineal y tiene menor ruido que uno de
sólo 16 y a su vez aportan formatos directamente compatibles con las nuevas tecnologías (por ejemplo el
DVD).
Dither
Cuando se está digitalizando una señal de muy poca amplitud, los saltos discretos entre escalones sucesivos
adquieren una dimensión comparable con la amplitud de la propia señal. Esto implica que la forma de onda
sufre una distorsión que resulta ser perfectamente audible y molesta. Esto es porque además del espectro del
sonido propiamente dicho se agregan sus armónicos, que contienen energía concentrada en el espectro en
frecuencias discretas. En otras palabras, la energía del ruido de digitalización está concentrada. Se ha
encontrado que si, antes del muestreo, se agrega una pequeña cantidad de ruido aleatorio (de espectro
continuo y no discreto), al cabo del proceso de digitalización la señal resultante también tiene la energía
correspondiente al ruido de digitalización distribuida, en lugar de concentrada. Desde el punto de vista de la
relación señal / ruido, hubo un ligero empeoramiento, pero desde el punto de vista perceptivo, el ruido se ha
vuelto mucho más tolerable e imperceptible. Hasta se puede trabajar con la forma de su espectro para hacerlo
menos notorio. El ruido agregado se denomina dither.
Dither digital
Esto sucede en los procesos de recuantización para pasar, por ejemplo, de 24 bits a 16 bits. Si simplemente se
truncaran los 8 bits menos significativos, estaríamos en presencia de algo equivalente a un muestreo y
digitalización sin dither. En este caso, podría agregarse un dither generado analógicamente, pero también es
posible agregar uno producido digitalmente en la forma de una sucesión de números pseudo aleatorios (es
decir, obtenidos por un algoritmo de cómputo que si bien es determinístico aparenta ser aleatorio). Este dither
se genera con la resolución original (más alta), y luego simplemente se redondea.
Reproducción
La reproducción de la señal se realiza en forma inversa, utilizando un conversor digital analógico (o DAC por
sus siglas en inglés).
Procesamiento digital
El procesamiento digital de señales de audio presenta numerosas ventajas frente al analógico:
• Es posible cuantificar la distorsión que sufrirá la señal por los procesos de conversión A/D y D/A
• La señal digital no sufre distorsión
• Puede hardware genérico y de bajo costo para el procesamiento de la señal, el cual puede ser
fácilmente modificado
• Permite un aprovechamiento de canales de transmisión en forma más eficiente
• Pueden utilizarse algoritmos de compresión de datos para optimizar canales de transmisión y
almacenamiento
El proceso completo se muestra en el siguiente diagrama:
Bibliografía
Entrada/Salida de sonido en Windows Gabriel Agustín Praino, Facultad de Ingeniería, Universidad de Bs. As.
SONIDO DIGITAL Universidad de Concepción, Departamento de Ingeniería Industrial
V- 4
Apuntes de Sonido digital por Antonio Sacco. www.antoniosaco.com.ar
Universidad de Concepción /Departamento de Ingeniería Industrial. Apuntes de Sistemas de Computación
www.udec.com
Materia Integrada
Análisis de señales y sistemas. Tema: Muestreo de señales.
Técnicas Digitales II, Tema: Conversores A/D, D/A.
Medidas electrónicas II, Tema: Conversores A/D, D/A.
V- 5
Capítulo 6
Síntesis del sonido
Introducción.
Como ya sabemos la onda sonora es bastante compleja si consideramos que además de intensidad, tono y
timbre se debe tener en cuenta la envolvente de ésta. Pero aún así, los hallazgos de Fourier demostraron que
cualquier onda, por compleja que sea, puede reconstruirse a partir de la suma de ondas simples, a veces
infinitas; y que bastan sólo unos pocos componentes para aproximarse al sonido real con un grado de
precisión aceptable. La aplicación de este principio nos introduce directamente en la producción electrónica
del sonido a partir de unos sonidos simples. Es lo que se llama síntesis digital del sonido.
Sintetizadores
Se les llama sintetizadores a los instrumentos musicales electrónicos capaces de generar sonido. Esto lo hacen
manipulando en tiempo real diversos parámetros como: intensidad, tono, timbre y componentes de la
envolvente. Los sintetizadores son polifónicos, es decir, producen varias notas (instrumentos, sonidos o
voces) a la vez; y por otro lado pueden ser politímbricos (para cada voz), con lo que se parecen a los
instrumentos tradicionales. La síntesis del sonido es producto de unión de tres componentes: oscilador, filtro y
amplificador.
Los osciladores: generan el tono fundamental del sonido. Son los módulos VCO (Voltage Controlled
Oscillator) u osciladores por control de tensión, que producen una serie de fluctuaciones de tensión que son la
representación eléctrica de la frecuencia de las vibraciones.
Los filtros: modelan el sonido y generan aproximadamente el timbre. Son los módulos VCF (Voltage
Controlled Filter) o filtros por control de tensión los que filtran ciertas frecuencias en beneficio de otras. Los
VCF más importantes son los lowpass o filtros de paso bajo que filtran las frecuencias altas dejando pasar las
bajas y los highpass o filtros de paso alto que filtran las frecuencias bajas dejando pasar las altas. Los filtros
están caracterizados por el punto de corte (Cut Off) que cortará las frecuencias que sean inferiores o
superiores a este valor.
Los amplificadores: regulan el volumen y por tanto intervienen sobre la intensidad del sonido. Generalmente
se le llaman módulos VCA (Voltage Controlled Amplifier) o amplificadores por control de tensión.
Existen módulos adicionales controladores que perfilan aún más la onda producida: el generador de
envolvente (EG: Envelope Generator) y el oscilador de baja frecuencia (LFO: Low Frequency Oscillator). El
generador de envolvente permite controlar los cuatro parámetros de la envolvente ataque (A), caída (C), parte
sostenida (S) y extinción (R) o incluso combinaciones selectivas hablándose de AR, ADR, DADSR.
La arquitectura clásica de los sintetizadores está basada en la síntesis sustractiva, cuyo nombre procede del
hecho de que los timbres de las notas se conforman eliminado o filtrando armónicos.
Existen otras tecnologías de síntesis como la síntesis aditiva, que recompone las formas sonoras desde cero
controlando la amplitud de cada armónico de los 16 o 32 existentes por tono lo que demanda cálculo intensivo
y la síntesis FM que modula las frecuencias de uno o varios osciladores con las de otros, etc.
Procesamiento del sonido digitalizado
Una vez que tenemos el sonido digitalizado, los valores numéricos pueden ser sometidos a diversas
operaciones de transformación. Esto es lo que se conoce como Procesamiento de Sonido; aunque existen
múltiples formas de procesar sonido, con múltiples propósitos (efectos especiales, eliminación de ruido, etc.),
las operaciones más elementales son:
Aumento o disminución de volumen: Consiste en incrementar o disminuir los valores de amplitud de una
onda. Esta variación suele hacerse en una tasa fija para toda la onda (se suele expresar en %). Una variante es
el Fade, que consiste en la atenuación gradual y progresiva del volumen en una parte determinada de la onda,
o la inversa (el aumento gradual y progresivo de volumen).
Filtrado: Consiste en seleccionar determinadas bandas de frecuencias en un sonido y someterlas a alguna
operación (por ejemplo, silenciarlas o atenuarlas, o las operaciones inversas)
Mezcla: Consiste en juntar o superponer dos sonidos diferentes, digitalizados de antemano. Juntos formarán
una sola onda; generalmente, es posible especificar valores de volumen diferentes para cada sonido
VI - 1
individual. Una variante es la producción de un sonido estéreo, de forma que cada una de las ondas originales
ocupe un canal
Cortado y pegado: Consiste en la posibilidad de eliminar o insertar partes de un sonido en determinados
lugares de una onda. Con programas Windows, esto suele hacerse a través del Portapapeles.
Procesamiento digital de señales:
Filtro pasa altos
s[n] = s[n] - s[n-1]
Filtro pasa bajos
s[n] = (s[n] + s[n-1] + s[n-2]) / 3
Eco
s[n] = s[n] + a * s[n-r]
donde:
• s[n] es la n-esima muestra de la señal
• a es un factor de atenuación (entre 0 y 1)
• r es un retardo (mayor a 0)
Software de Edición y reproducción
Los programas que permiten editar música y sonido se diferencian según el tipo de archivos que manejan, ya
sea basados en partitura (MIDI, MOD...) o en muestreo (WAV, MP3...). Actualmente, casi todas las tarjetas
de sonido incluyen software propietario tanto para la edición como para la reproducción de sonidos.
Algunos permiten agregar instrumentos basados en nuevos muestreos, para las tarjetas de sonido que soportan
tablas de voces por software. Otra característica común para este tipo de programas es que si se dispone de un
instrumento digital, éste puede conectarse al puerto MIDI/Joystick para grabar sesiones en vivo. De esta
forma se pueden registrar las notas que han sido interpretadas durante la ejecución; sin embargo los
instrumentos musicales (voces) serán reemplazados por aquellos que estén disponibles en la tarjeta de sonido.
Por otro lado, los editores de sonidos digitales, se caracterizan por su capacidad para soportar múltiples tipos
de archivos, de manera de incluir la mayor cantidad de estándares de la industria.
Como el tamaño de un archivo de sonido es un tema a tener en consideración, la calidad del software estará en
relación a la capacidad que tenga de aprovechar los diferentes algoritmos de compresión de audio. También es
posible encontrar editores de sonido en tiempo real.
Los programas reproductores de audio generalmente soportan todo tipo de formato incluyendo audio digital y
MIDI. El Windows Media Player de Microsoft, puede manejar una extensa variedad de archivos de sonido y
video, o bien reproducir pistas de CD.
Bibliografía:
SONIDO DIGITAL Universidad de Concepción, Departamento de Ingeniería Industrial
VI - 2
Capítulo7
Tarjetas de sonido
Introducción
Una tarjeta de sonido es el dispositivo de hardware encargado de la reproducción de sonido. Es el nexo entre
una señal de sonido analógica y una digital, es decir, es la unidad que permite el traspaso de las señales a
dispositivos multimedia externos (parlantes, grabador o reproductor de CD, etc).
Es una tarjeta de expansión que permite que el computador genere, manipule y envíe sonidos. De su calidad
dependerá directamente el sonido reproducido por nuestro equipo, pero en general, las tarjetas de sonido
permiten al computador:
_Enviar sonidos a los parlantes o a un equipo conectado a la tarjeta.
_Grabar sonido desde un micrófono conectado al computador.
_Manipular sonido almacenado en el disco duro.
Sus principales funciones son:
_Capturar las señales procedentes del exterior, ya sea a través de dispositivos capaces de generar una señal
de onda, como por ejemplo un equipo de música .
_Reproducir sonidos de naturaleza digital.
Los componentes principales, que pertenecen a la mayoría de las tarjetas de sonido son los Jacks y los
Conectores.
Un Jack es la interfaz de conexión de un solo orificio, que permiten conectar otros dispositivos a la tarjeta de
sonido, uno por orificio. Se encuentra en el panel posterior de la tarjeta.
Los conectores son interfaces de la tarjeta de sonido que le permiten conectar otros dispositivos a la tarjeta.
Componentes fundamentales de una placa de sonido
La tarjeta de sonido es la encargada de convertir la información digital procesada por nuestro equipo en datos
analógicos , o sonidos, para que sean reproducidos por unos parlantes conectados a la propia tarjeta de sonido.
Igualmente, los sonidos analógicos introducidos por medio de un micrófono, un equipo de música conectado a
LINE-IN, o un instrumento musical conectado al puerto MIDI, son transformados en información digital para
que sea reconocida y procesada por el equipo.
Por último, la tarjeta de sonido es la encargada de reproducir por medio de los parlantes conectados a ella las
pistas musicales de un COMPACT DISC de música insertado en nuestra unidad de CD-ROM. Para ello, el
CD-ROM y la TARJETA DE SONIDO deben estar conectados por un cable que normalmente viene incluido
con las unidades de CD-ROM.
El muestreo
La capacidad de muestreo es uno de los factores más importantes en la calidad de una tarjeta de sonido. Es la
velocidad a la cual la tarjeta de sonido toma muestras (medida en KHz), las velocidades de muestreo
normalmente son de 11.025 KHz, 22.050 KHz, y 44.1 KHz.
El tamaño de la muestra
Determina la calidad del sonido, los tamaños de muestra más comunes son de 8, 12, 16, 20 y 32 bits.
MIDI (musical instrument digital interfase)
Casi todas las tarjetas de sonido soportan MIDI, un estándar adoptado por la industria de la música electrónica
para controlar dispositivos como sintetizadores y tarjetas de sonido que emiten música.
Procesadores multi-propósito de señales digitales
Las tarjetas de sonido tienen un procesador de señales digitales (DSP). Hacen que la tarjeta de sonido sea
inteligente, liberando a la computadora del trabajo en tareas intensivas como filtrar ruidos de grabaciones o
compresión de sonido.
VII - 1
Efectos de sonido 3D
Algunas tarjetas incluyen efectos de sonido de 3D. Estos trabajan retardando el tiempo de ciertas posiciones
de la señal de sonido tal que las frecuencias diferentes llegan al oído a diferentes tiempos, de modo que se
crea un “sonido ambiental”
Entrada y salida digital
Extensiones para las tarjetas de sonido que son encontrados solo en sistemas de sonido profesionales. Proveen
entrada y salida digital S/PDIF y una mejora a la entrada y salida de MIDI. La conectividad S/PDIF permite
a los productores de multimedia e ingenieros de sonido conectar dispositivos compatibles con S/PDIF como
un reproductor DAT (Digital Audio Tape) para producciones finales de muy alta calidad.
Número de Bits
Las primeras tarjetas de sonido eran de 8 bits (AdLib) y no eran capaces de reproducir sonido digital. Luego
aparecieron las tarjetas de sonido con capacidad de reproducción digital (Sound Blaster y Sound Blaster Pro,
esta última con capacidad de reproducir sonido estéreo) y más tarde las tarjetas de sonido de 16 bits (Sound
Blaster 16).
Número de voces
Las tarjetas de sonido actuales llevan al final un número 16, 32 ó 64. Este número no se refiere al número de
bits, sino al número de voces o instrumentos que son capaces de reproducir simultáneamente. Es decir, una
tarjeta 16 (Sound Blaster 16 o compatibles, Gravis Ultrasound, etc.) es capaz de reproducir 16 voces o
instrumentos simultáneamente, una tarjeta 32 (Sound Blaster 32, Guillemot Maxi Sound 32, etc.) es capaz de
reproducir 32 voces simultáneamente y una tarjeta 64, lo mismo.
Debemos tener en cuenta que algunas tarjetas de sonido pueden reproducir 64 voces simultáneamente, pero
32 de ellas por software, al no estar soportadas por la tarjeta (Sound Blaster 64), con lo que el procesador del
equipo tiene que dedicar parte de sus recursos a este proceso.
A mayor número de voces o instrumentos, mayor será la calidad del sonido reproducido.
Calidad del sonido - KHz
La relación entre la cantidad de muestras por segundo de un sonido y la calidad es directa. Por tanto a mayor
número de KHz mayor calidad de sonido. Las primeras tarjetas de sonido de 8 bits eran capaces de reproducir
a una frecuencia de 22KHz, la mitad de la calidad de música de un reproductor de Compact Disc. Con la
aparición de las tarjetas de 16 bits, esta frecuencia se elevó a 44,1KHz (la frecuencia de los reproductores de
Compact Disc)
Desde ese momento, la frecuencia de muestreo no ha variado, pues la calidad obtenida es más que suficiente
para garantizar una gran calidad. Sin embargo, están en el mercado tarjetas de sonido con una capacidad de
muestreo superior, 48KHZ y hasta 55,2KHz.
Tipo de síntesis MIDI
MIDI (Musical Instrument Digital Interface - Interfaz digital para instrumentos musicales) es una serie de
instrucciones enviadas por una aplicación que le indican a la tarjeta de sonido qué instrumento suena, en qué
nota y con qué duración.
Las tarjetas de sonido con SINTESIS FM usan una combinación de ondas que imitan los sonidos de los
distintos instrumentos, dando lugar a una sensación de sonido tipo sintetizador. Este tipo de síntesis la
podemos encontrar en la mayoría de las tarjetas (Sound Blaster 16 y compatibles).
Las tarjetas de sonido con SINTESIS POR TABLA DE ONDAS (WAVETABLE) usan muestras
digitalizadas de sonidos de instrumentos reales que se almacenan en la TABLA DE ONDAS (memoria ROM)
de la tarjeta de sonido. La mayoría de las tarjetas con síntesis por tabla de ondas incluyen además cierta
cantidad de memoria RAM en la propia tarjeta, o la posibilidad de añadir memoria mediante unos zócalos
similares a los de memoria RAM de la placa base, para que podamos grabar muestras y así mejorar la calidad
del sonido.
Los parlantes
La gran mayoría de las tarjetas de sonido incluyen un amplificador interno de 4 Watts por canal, lo que nos
permite conectar a la salida de la tarjeta unos parlantes que no superen esta capacidad.
VII - 2
Otras Utilidades
Muchas de las tarjetas con síntesis por tabla de ondas incluyen DSP (procesador de sonido digital avanzado),
que descarga de trabajo al procesador cuando se realizan ciertos procesos.
Ya que por medio de una conexión a Internet podemos realizar video conferencias o simplemente
comunicación telefónica, se ha empezado a implementar el soporte FULL-DUPLEX en las tarjetas de sonido.
La tecnología FULL-DUPLEX consiste en que la tarjeta es capaz de recibir o grabar la voz que llega a través
del micrófono u otro dispositivo conectado a la entrada LINE-IN, al mismo tiempo que está reproduciendo
por la salida SPEAKER o LINE-OUT la voz o los sonidos que le llegan a través de la conexión a Internet.
El SONIDO 3D nos brinda un efecto tridimensional se puede conseguir por medio de software o por medio de
hardware, de modo que se crea un efecto de sonido envolvente. La única manera de conseguir sonido
envolvente es mediante el uso de 4 parlantes.
Entradas salidas. Tipos de conectores
Las entradas de una tarjeta de audio son conectores eléctricos u ópticos que pueden ser de tipo digital o
analógico. Los más básicos son:
• Line IN: entrada analógica, normalmente estéreo, que recoge el sonido procedente de la salida (Line
OUT) de otro dispositivo de audio, por ejemplo un reproductor de CD, una radio, otro ordenador,
etc.
• Line OUT: salida que proporciona una señal del mismo tipo que la que puede entrar por la Line IN.
Por tanto ésta salida no es apta, en general, para la conexión directa de altavoces, sino para enviar
una señal a otro dispositivo de procesado o amplificación de sonido (por ejemplo: una cadena hi-fi)
• MIC IN : ésta entrada se usa para captar señales más débiles, procedentes de micrófonos o
instrumentos musicales que disponen de transductores acústico-eléctricos (por ejemplo: guitarras
eléctricas). La señal que entra por MIC IN se amplifica en la tarjeta de sonido hasta alcanzar un nivel
adecuado para su proceso.
• Speaker OUT: a ésta salida se suelen conectar unos pequeños altavoces o unos
auriculares. Suele incorporar a su vez una pequeña amplificación que en algunas
•
tarjetas se puede regular mediante un control de volumen hardware externo.
S/PDIF (InterFaz Digital Sonny/Philips): es un tipo de conector de E/S óptico, desarrollado por
Sony y Philips para poder transmitir señales de audio digital entre dos dispositivos sin tener que
convertirlas primero a formato analógico. Al tratar al sonido digitalmente, en ningún momento se
producen pérdidas de calidad al pasar de soporte digital al ordenador o viceversa.
VII - 3
•
MIDI (Musical Instruments Digital Interface). Se trata de una interfaz serie asíncrona para la
conexión de dispositivos controladores (por ejemplo: un teclado MIDI, un módulo de sonidos,...) al
PC. Por lo general las tarjetas de sonido utilizan el mismo puerto para el joystick, por lo que se
requiere un cable MIDI adaptador de un conector DB15 a dos conectores DIN de 5 pines de los que
se utilizan 3: In(4), Out(5) y masa(2). La longitud máxima del cable es de 15 metros y tiene que ser
trenzado y apantallado con la pantalla conectada al pin 2 en ambos extremos. Las patillas 1 y 3 se
dejan sin conectar.
Tradicionalmente, para las E/S anteriores se han utilizado conectores mini-jack como los que usamos en un
walkman, por ejemplo. Éstos siguen siendo los más comunes en las soluciones de nivel bajo y medio. Se trata
de conexiones analógicas de media calidad. Algunas tarjetas incorporan también conectores tipo RCA.
Normalmente cada RCA es un canal independiente (mientras que en el jack van dos canales juntos). Por ello
siempre van de dos en dos (clásicamente el rojo es el canal derecho y el blanco el izquierdo). Ofrecen mayor
calidad que los conectores jack tradicionales pero son más caros y menos compactos. Además de las
anteriores conexiones, que son externas, las hay también internas, siendo la más importante la del CD-ROM a
la tarjeta de sonido, para poder escuchar los CDs de música. Puede ser digital o analógica, de la cual hace
tiempo había varios formatos (para CD-ROMs Sony, Mitsumi, IDE...). Incluso en algunas tarjetas antiguas se
incluía un conector IDE de 40 pines para el CD-ROM.
Características técnicas e Información de la placa de sonido utilizada
La placa de sonido utilizada es una placa “Onboard” modelo CMI8338/C3DX PCI audio. Las características
se muestran en la siguiente tabla:
Especificaciones de Hardware
Respuesta en frecuencia
100Hz - 10KHz
Razón señal ruido
120 db
Frecuencia de muestreo mono
5kHz to 44.1 kHz
Frecuencia de muestreo estereo
5kHz to 44.1 kHz
Fuente de tensión
"+5, +12, -12 Volt"
Consumo de corriente
50, 500, 30 mA
Impedancia del micrófono
600 Ohms
Impedancia de Line-In
39 KOhms
Impedancia de CD Audio-In
No posee
Sensibilidad del micrófono
10 - 200 mVpp
Sensibilidad de Line-In
0 - 2 Vpp
Sensibilidad CD Audio-In
No posee
Resolución de A/D, D/A
16 bits
Potencia de salida
4 Watts, 4 Ohms
Mezclador D/A
Stereo
VII - 4
3D Audio
Direct Soun 3D
Configuración del Hardware
Interrupción IRQ
10
Canal DMA (8 bit)
1
Canal DMA (16 bit)
1, 5 (compartido con el de 8bit)
Joystick I/O Address
200 Hex
Audio I/O Address
220 Hex
FM Synthesizer I/O Address
388 Hex
Sintetizador Wave, I/O Address
No documentado
MPU-401 I/O Address
0300Hex
Conectores
Line-In
Si
Mic-In
Si
Line-Out
No posee
Speaker-Out
Si
PC Speaker-In
No posee
Game/Joystick Port
Si
CD-ROM Audio-In
No posee
CD-ROM Audio-In (MPC2)
No posee
External CD-ROM
No posee
CSP Chip Socket
No posee
Requisitos del sistema
Sistema Operativo
Win. 3.1, 95, 98, NT
Espacio en disco
44.2kb
Slot
Onboard PCI
Placa madre
PC 100
RAM
No documentado
Bibliografía.
TARJETAS DE AUDIO – HARDWARE, http://www.lpi.tel.uva.es
Support – KnowledgeBase Sound Blaster Product Information
Sound Blaster Audio Technologies
www.guillemot.com
www.soundblaster.com
www.duiops.net/hardware.tarjson/tarjson.html
SONIDO DIGITAL Universidad de Concepción, Departamento de Ingeniería Industrial
LA TARJETA DE SONIDO, J&P "El Rincón del Hardware" © 1998-99
Materia Integrada
Técnicas Digitales III. Tema: Pc. Compatibles. (En los apunes de clase no se encuentra el tema placas de
sonido pero se explican el sistema de interrupciones y buses).
VII - 5
Capítulo 8
DSP (Digital Signal Procesor)
Introducción
Este Procesador de Sonido Digital libera de trabajo al procesador central del equipo. Para estudiarlo con algo
más de profundidad, conviene primero de todo distinguir tres conceptos parecidos que usan prácticamente las
mismas siglas y que son por tanto susceptibles de confusión.
En primer lugar tenemos la tecnología general de los DSP (en su acepción de Procesadores Digitales de
Señal), que ha revolucionado el panorama del procesamiento de señales digitales. Estos DSP son poderosos
microprocesadores capaces de procesar mucha información en tiempo real como señales de radio, sonido o
vídeo.
En el contexto de los anteriores es en el que se enmarcan los DSP (Procesadores de Sonido Digital) que se
aplican sobre una señal sonora.
Pero también tenemos el DSP como Procesamiento Digital de Campos Sonoros, que se trata de una tecnología
creada por Yamaha en 1986 para recrear las mismas características acústicas de una sala de conciertos, un
club de jazz o de una sala cinematográfica en nuestro propio hogar.
El DSP que nos interesa ahora es el que se refiere al sonido. Cuando tratamos con una pista de sonido que
tenemos grabada, por ejemplo, podemos tener la posibilidad de aplicarle efectos (eco, coro, reverberación,...)
o también simular sintetizadores de sonido, realizar fades, ... Por supuesto, este proceso de modificación de
una señal digital requiere potencia de cálculo, y además existen multitud de aplicaciones en la que se hace
necesario el procesado de un efecto en tiempo real. Es por ello que actualmente, tanto las tarjetas de gama
baja como las de gama alta incorporan un DSP, diseñado específicamente para éste tipo de tareas con lo cuál
se consigue, además de liberar de carga al procesador del PC, un mayor rendimiento, ya que éste último no
deja de ser una máquina de propósito general, y puede resultar menos capaz para estos procesos.
Con el continuo desarrollo de los avances en tecnología digital, el DSP se ha convertido en la parte principal
de cualquier tarjeta de sonido, y entre las especificaciones de cualquier tarjeta comercial, incluso de gama más
baja podemos encontrar funciones como:
• Efectos digitales en tiempo real y en cualquier fuente de sonido como reverberación, coro, flanger,
variador de fase o distorsión.
• Capacidad de proceso, mezcla y posicionamiento de hasta 131 canales por Hardware.
• Control de agudos, graves y efectos aplicados en cualquier señal de sonido.
• Configuración de salida optimizada para auriculares, dos o cuatro altavoces.
• Tecnología capaz de ubicar un sonido mono o estéreo en un espacio de 360°.
• Entornos creados por el DSP como sala, teatro, club, etc. En cualquier fuente de sonido y
modificable por el usuario.
Procesador de sonido digital (DSP)
Este chip es el encargado de procesar todas la órdenes enviadas por las aplicaciones y organiza a los demás
chips de sonido de la tarjeta para que reproduzcan los sonidos que se solicitan. Se ocupa de enviar y recibir
los datos MIDI de los teclados electrónicos y los sintetizadores; así como descomprimir los archivos al ir
llegando a la computadora. A continuación se muestran los comandos utilizados para programar el DSP en las
versiones 2.00, 2.01+, 3.xx y 4.xx.
Categoría
Comando
Descripción
8 bit direct mode digitezed
10h
output
Sound I/O
20h
input
Transfer time constant
40h
Set digitezed sound transfer time constant
8 bit single cycle DMA
14h
output
VIII - 1
Mode digitezed sound I/O
24h
input
74h
8 bit to 4 bit ADPCM output
75h
8 bit to 4 bit ADPCM output with ref. byte
76h
8 bit to 3 bit ADPCM output
77h
8 bit to 3 bit ADPCM output with ref. byte
16h
8 bit to 2 bit ADPCM output
17h
8 bit to 2 bit ADPCM output output with ref.
byte
8 bit DMA mode digitezed sound
D0h
Pause DMA mode
I/O control
D4h
Continue DMA mode
Digitezed sound output
D1h
Turn on speaker
Speaker control
D3h
Turn off speaker
MIDI I/O
30h
Polling mode input
31h
Interrupt mode input
38
otput
80h
Pquse digitezed sound output for a duration
E1h
Get DSP
number
version
Fuente "Developer Kit for Sound Blaster Series".
El Chip sintetizador de FM
Sintetizar significa "poner junto". Así pues, la función de un sintetizador es la de integrar todos los elementos
que intervienen para reproducir un determinado sonido. En las tarjetas de sonido el chip sintetizador de FM es
el OPL2 u OPL3 de Yamaha. El chip reproduce hasta 11 instrumentos simultáneamente. La simulación de los
sonidos se efectúa aproximando las ondas sinusoidales producidas por él, a las formas de onda generadas por
los instrumentos reales. Para la programación de la tarjeta es necesario enviar los datos hacia los registros
internos por medio de sus dos puertos de entrada y salida:
0388h Dirección/Puerto de Status (R/W)
0389h Puerto de datos (W/O)
Para la reproducción de música FM estereo se usan las direcciones 0220h y 0221h para la bocina izquierda, y
las direcciones 0222h y 0223h para la bocina derecha. Los puertos 0388h y 0389h provocan la salida a través
de ambas bocinas. Las tarjetas poseen un arreglo de doscientos cuarenta y cuatro registros; para escribir en un
registro particular se envía el número de registro (01-F5) al puerto de direcciones, y el valor del dato a su
respectivo puerto. Después de escribir en el puerto de registros se esperan 3.3 microsegundos antes de enviar
la dirección, y 23 microsegundos más para el dato. Los registros son únicamente de escritura. El puerto de
direcciones funciona como byte de status de la tarjeta, en la dirección 388h.
En la siguiente tabla se muestra la función de cada registro:
Dirección
Función
VIII - 2
01
Test LSI / Enable waveform control
02
Timer 1 data
03
Timer 2 data
04
Timer control flags
08
Speech synthesis mode / Keyboard split note select
20-35
Amp Mod / Vibrato / EG type / Key Scaling / Multiple
40-55
Key scaling level / Operator output level
60-75
Attack Rate / Decay Rate
80-95
Sustain Level / Release Rate
A0-A8
Frecuency (low 8 bits)
B0-B8
Key On / Octave / Frecuency (high 2 bits)
BD
AM depth / Vibrato depth / Rhythm control
C0-C8
Feedback strength / Connetion type
E0-F5
Wave Select
Fuente "Programming the AdLib/Sound Blaster"
Los grupos de 22 registros se utilizan por pares para la utilización de cada voz FM. La tarjeta sintetiza sonidos
de hasta 8 octavas de un instrumento. Los valores para la escala cromática son:
Numero
Frecuencia
Nota
16B
277.2
C sostenido
181
293.7
D
198
311.1
D sostenido
1B0
329.6
E
1CA
349.2
F
1E5
370.0
F sostenido
202
392.0
G
VIII - 3
220
415.3
G sostenido
241
440.0
A
263
466.2
A sostenido
287
493.9
B
2AE
523.3
C
El UART MPU-401
Programación del puerto MIDI para I/O
La interfase entre la tarjeta de sonido y los dispositivos MIDI, se realiza a través del chip MPU-401. Este
dispositivo tiene dos modos de operación, el SB-MIDI y el modo UART. El puerto SB-MIDI está disponible
en todas las tarjetas de sonido. El modo UART se incluye únicamente en las tarjetas de 16 bits. Se usa
cualquiera de las dos interfaces MIDI, es mejor usar el modo de 16 bits, tiene sus propios puertos e
interrupciones independientes.
El modo SB-MIDI
Este modo proporciona una interfase para I/O en modo normal como el modo UART.
El dato MIDI entrante se detecta al usar el método de poleo, o el de interrupción.
El modo MPU-401
En este modo la interfase no presenta servicios, literalmente relee todo lo que recibe sin modificar o
interpretar, entre la PC y el dispositivo MIDI. Una vez activado el modo UART, el único comando que
reconoce es el Reset. Estos puntos son básicos para iniciar la programación de la tarjeta de sonido. Sólo tienen
que enviarse los datos a la dirección correcta.
BASE
ADDRESS
I/O
ADDRESSES
USED
220h
220h to 233h
240h
240h to 253h
260h
260h to 273h
280h
280h to 293h
SB16 I/O PORTS
VIII - 4
DESCRIPTION
I/O
ADDRESS
ACCESS
Base + 0h
FM Music Status Port
Read
Base + 0h
FM Music Register Address Port
Write
Base + 1h
FM Music Data Port
Write Only
Base + 2h
Advanced FM Music Status Port
Read
Base + 2h
Advanced FM Music Register Port
Write
Base + 3h
Advanced FM Music Data Port
Write Only
Base + 4h
Mixer chip Register Address Port
Write Only
Base + 5h
Mixer chip Data Port
Read/Write
Base + 6h
DSP Reset
Write Only
Base + 8h
FM Music Status Port
Read
Base + 8h
FM Music Register Port
Write
Base + 9h
FM Music Data Port
Write Only
Base + Ah
DSP Read Data Port
Read Only
Base + Ch
DSP Write Command/Data
Write
Base + Ch
DSP Write-Buffer Status (bit 7)
Read
Base + Eh
DSP Read-Buffer Status (bit 7)
Read Only
Base + 10h
CD-ROM Command or Data Register
Read/Write
Base + 11h
CD-ROM Status Register
Read Only
Base + 12h
CD-ROM Reset Register
Write Only
Base + 13h
CD-ROM Enable Register
Write Only
SB16 I/O PORT FUNCTIONS
Bibliografia:
Developer Kit For Sound Blaster Series.
PROCESADOR DE SONIDO DIGITAL (DSP)
Stephan M_ Bernsee's Audio DSP
Materia Integrada
Técnicas Digitales 3. Tema: DSP
VIII - 5
Capítulo 9
Formatos digitales
Introducción:
La digitalización consiste en cuantificar la amplitud de onda. Como antes visto quedan definidos dos
conceptos que son claves en la digitalización, como son: Tasa de muestreo y resolución.
La tasa de muestreo es el número de lecturas que se hacen por unidad de tiempo.
La resolución es el número de estados diferentes que se pueden distinguir en una señal.
A mayor resolución y mayor tasa de muestreo se obtendrá mayor fidelidad en la señal muestreada.
Almacenamiento
Existen dos posibilidades de almacenamiento los archivos de audio digital y los archivos MIDI.
Sonido Audio Digital
Este método de almacenamiento de audio digital presenta el grave problema de la cantidad de disco duro que
se necesita para su almacenamiento y, sobre todo, memoria que se necesita para trabajar con el audio digital.
Es por ello que se han estado desarrollando formatos de archivos que buscan comprimir cada vez más los
archivos para realizar grabaciones de alta calidad sin necesidad de tanto espacio. Estas técnicas suelen incluir
un método para codificar secuencias largas de bytes repetidos.
Por ejemplo:
Si queremos digitalizar 3 minutos de música, y muestreamos 44100 veces por segundo, como en cada muestra
almacenamos dos bytes (16 bits o un word) obtenemos:
3min x 60 seg/min x 44100 muestras/seg x 2 bytes/muestra = 15.876.000 bytes.
Luego, para poder almacenar una canción de tres minutos, necesitamos casi 16 Mb.
Ahora bien, una vez obtenido el audio en forma digital, el cual esta almacenado en la memoria RAM, se le
debe dar un tipo de formato para crear el archivo que se almacenara en disco, este tipo de formato es utilizado
luego para la reproducción del sonido.
A continuación haremos referencia a los formatos mas utilizados por los distintos paquetes de software del
mercado y que muestran a su vez la evolución de estos formatos:
Formato
AU
IFF
WAV
VOC
Real Audio
MP3
Característica
Son el formato audio estándar en los computadores Sun. Por lo general son de 8 bits y poseen
menor calidad que otros formatos de sonido.
Es común en computadores Macintosth. Pueden ser de 8 o 16 bits, soportan frecuencias de
muestreo de hasta 44.1 KHz y tamaños de muestra de hasta 32 bits por muestra. También está el
IFF-C que es un formato de archivo IFF comprimido.
Es el formato utilizado por defecto por Windows. Posee compresión propia, y, aunque ha
sido sobrepasado técnicamente por otros formatos, es uno de los más conocidos y popularizados.
Puede ser de 8 o 16 bits con índices de muestreo de 11.025, 22.05 ó44.1 KHz, gestiona los datos
en mono o en estéreo y por lo general tienen buena calidad de sonido.
Admite muestras de 8 y 16 bits, admite frecuencias de muestreo de 11.025 kHz, 22.05 kHz, y
44.1 kHz, y los datos pueden guardarse comprimidos o sin comprimir (solo para Sound Blaster
). El formato de archivo VOC usa el concepto de bloques de silencio, es decir, un periodo
extenso de silencio se reemplaza en el archivo de audio con una marca y un valor de su duración
temporal, con lo que se consigue un pequeño ahorro de espacio en disco.
Posee un sistema potente de descompresión, que puede funcionar sin necesidad de operar con el
archivo entero, lo cual permite que los programas de reproducción puedan ir decodificando y
reproduciendo el sonido a medida que la información les va llegando, sin esperar a recibir el
archivo completo. Este mecanismo es utilizable también para video.
Permite almacenar sonido de gran calidad con altas tasas de compresión. Es un formato que se
IX- 1
VQF
está utilizando bastante para transmitir música de alta calidad por la red, así como en otro tipo de
medios informáticos. MPEG Audio File
(Transform-domain Weighted Interleave Vector Quantization): es un nuevo formato de
compresión de audio desarrollado por Yamaha, similar al MP3, pero con una mejor compresión
y calidad de sonido. Los archivos VQF son entre 30-35% más pequeños que un archivo MP3.
aa
aac
aif
aifc
aiff
ape
asf
asx
avi
dat
jmx
lks
lqt
m1v
m3u
mid
midi
mov
mp+
Mp2
mpa
mpe
mpeg
mpg
mpv
ogg
pls
ra
ram
rm
rmi
rmid
rmm
rmx
sdp
smi
smil
snd
swf
tac
wax
wm
wma
wmv
Audible Audio File
FAAC File
Audio File
Audio File
Audio File
Monkey's Audio File
Windows Media File
Windows Media Playlist
Video File
Video CD File
MusicEx File
Learnkey's Real CBT File
Liquid Audio File
MPEG Video File
MP3 Playlist
MIDI File
MIDI File
Quicktime Video File
MPEGPlus File
MPEG Audio File
MPEG Audio File
MPEG Video File
MPEG Video File
MPEG Video File
MPEG Video File
Ogg Vorbis File
MP3 Playlist
Real Audio File
Real Media File
Real Media File
MIDI File
MIDI File
Real Media File
Real Media File
Scalable Multicast File
SMIL Document File
SMIL Document File
Audio File (Mac)
Shockwave File
TAC File
Windows Media Playlist
Windows Media File
Windows Media File
Windows Media File
Los archivos de audio digital son recomendables cuando:
No se tenga control completo acerca del hardware de reproducción.
Se disponga de suficientes recursos para manejar los archivos digitales.
IX- 2
Se necesite reproducir diálogos.
Formato de archivo: WAVE
Introducción
Uno de los formatos de fichero más utilizados para almacenar sonidos es el formato WAV. Se trata de
almacenar las muestras una tras otra (a continuación de la cabecera del fichero, que entre otras cosas indica la
frecuencia de muestreo), sin ningún tipo de compresión de datos, con cuantificación uniforme. La sencillez de
este formato lo hace ideal para el tratamiento digital del sonido.
El formato de archivo de WAVE es un subconjunto de la especificación RIFF de Microsoft que puede incluir
muchos tipos diferentes de datos.
Especificación RIFF (Resource Interchange File Format)
RIFF define un formato de archivo para guardar varios tipos de datos, principalmente datos multimedia tales
como audio y video.
La estructura de la etiquetar del archivo es útil porque ayuda a prevenir problemas de compatibilidad que
pueden ocurrir ya que la definición del archivo cambia con el tiempo. Cada tramo de datos en el archivo se
identifica por un título normal, una aplicación que no reconoce un elemento del datos dado puede saltearse la
información desconocida.
Un archivo RIFF es construido para un bloque de estructura básico llamado “chunk” en la sintaxis “C”.
Existen dos tipos de “chunk”, el RIFF y LIST, los “chunk” pueden contener otros chunk llamados sub-chunk.
Un archivo RIFF compatible contiene tres partes:
Un “chunk INFO-LIST” que contiene un número de requerimientos y “sub-chunk” opcionales que describen
el archivo, su historia y su uso.
Un “sdta-list chunk” que contiene un solo “sub-chunk” que hace la articulación con los samples del audio
digitales.
Un “ pdta-list chunk” contiene nueve “sub-chunk” que definen la articulación de los datos de audio digitales.
Los tres “chunk” pueden aparecer en distinto orden, pero el orden de los diferentes “sub-chunk” es fijo.
La primer “chunk” de una estructura RIFF es el “tipo del formulario” (form type) que describe el tipo global
de los volúmenes del archivo.
Así que la estructura de un archivo RIFF tiene la siguiente forma:
Dirección (hex)
0000
0004
0008
000C
0010
0014
Contenido
'R', 'I', 'F', 'F'
Longitud del archivo-8 (32-bit usando enteros)
Tipo del formulario (4 caracteres)
Primer tipo de “chunk” (4 carácter)
Tamaño del primer “chunk” (32-bit usando enteros)
Datos del primer “chunk”
Ficheros de sonido WAVE
El formato WAVE es un subconjunto de RIFF usado para almacenar audio digital. Su tipo de formulario es el
WAVE y requiere dos “chunk”:
• fmt chunk que describe el sample rate, sample width, etc.
• data chunk que contiene el sample date.
El formato WAVE también puede contener cualquier otro tipo de “chunk” permitido por RIFF, incluso
“chunk LISTA” que se usan para contener tipos optativos de datos como la fecha, el derechos de propiedad
literaria el nombre de autor, etc. Los “chunk” pueden aparecer en cualquier orden.
El archivo WAVE es muy poderoso, este tipo de formato se promulgo al aparecer la API WIN32.
IX- 3
Tipo de compresión utilizado por WAVE.
Las especificaciones del archivo WAVE soporta varios tipos de algoritmos de compresión. En el formato dela
cabecera se indica que tipo de compresión usa, esto es indicado en “fmt chunk”:
Un valor de 1 indica la Modulación de Código de Pulso (PCM) que es una "recta" o no compresión del código
de las muestras. Los valores distintos de 1 indican algún forma de compresión.
Formato de los ficheros de Sonido WAV
El formato de los ficheros .WAV es el siguiente:
Bytes
Contenido Usual Propósito/Descripción
00 - 03 "RIFF"
Bloque de identificación (sin comillas).
04 - 07 ???
Entero largo. Tamaño del fichero en bytes, incluyendo cabecera.
08 - 11 "WAVE"
Otro identificador.
12 - 15 "fmt "
Otro identificador
16 -19 16, 0, 0, 0
Tamaño de la cabecera hasta este punto.
20 - 21 1, 0
Etiqueta de formato. (La versión del tipo de formato utilizado).
22 - 23 1, 0
Número de canales (2 si es estéreo).
24 - 27 ???
Frecuencia de muestreo (muestras/segundo).
28 - 31 ???
Número medio de bytes/segundo.
32 - 33 1, 0
Alineamiento de bloque.
34 - 35 8, 0
Número de Bits por muestra (normalmente 8, 16 ó 32).
36 - 39 "data"
Marcador que indica el comienzo de los datos de las muestras.
40 - 43 ???
Número de bytes muestreados.
resto
Muestras (cuantificación uniforme)
???
Los datos numéricos que ocupan más de un byte se representan de la siguiente forma: Primero están los bytes
menos significativos, y a continuación los más significativos (convenio "little endian", también conocido
como "formato Intel").
Lectura y grabación de archivos WAVE bajo Windows
Para la lectura de un archivo WAVE su usa las funciones de Win32, para ello se utiliza la función PlaySound
(). Si se utiliza un sistema operativo de 16-bit como Windows, se usa la función sndPlaySound(). Se puede
usar ambas funciones sin conocer sobre el formato interior del archivo.
Para obtener un mejor manejo se puede utilizar las funciones MCI de Windows que proporcionan un mejor
manejo de los archivos WAVE.
Análisis de frecuencia
Para realizar un análisis de frecuencia se utiliza Fast Fourier Transform (FFT), directamente a los datos
obtenidos descartando de antemano la cabecera del archivo.
Bibliografía:
SONIDO DIGITAL Universidad de Concepción, Departamento de Ingeniería Industrial
www.unitec.edu.co/biblioteca/multimedia/tm8
Developer Kit For Sound Blaster Series, Segunda Edición
IX- 4
The WAVE File Format, http://www.lightlink.com/tjweber/StripWav/WAVE.html
SoundFont 2.01 Technical Specification
Microsoft Windows SDK Multimedia Programmer’s Reference.
IX- 5
Capítulo 10
MCI de Windows
Introducción:
La programación de sonido bajo Windows se puede llevar a cabo con dos herramientas diferentes, los
comandos MCI y las funciones de bajo nivel del API de Windows.
La programación de sonido (tanto de audio digital como de MIDI) es un caso particular de la programación
multimedia. La programación en Windows puede abordar el multimedia a través de dos enfoques diferentes:
el MCI y las funciones de bajo nivel. El MCI es el método más sencillo.
MCI proporciona aplicaciones con compatibilidad a dispositivos independientes para controlar periféricos de
audio y video. Las aplicaciones pueden usar MCI para controlar y soportar cualquier dispositivo multimedia,
incluyendo los dispositivos de audio basados en forma de onda, secuencias MIDI, dispositivos de CD de
audio y video digital (cintas de video).
Las siglas MCI corresponden a Media Control Interface, un conjunto de herramientas de programación con
las que se logra una funcionalidad muy similar a la del reproductor de medios de Windows (de hecho, esta
aplicación las utiliza casi exclusivamente). Uno de los puntos más relevantes del MCI, es que trata del mismo
modo todos los dispositivos multimedia (reproductor de CD, vídeo analógico y digital, videodisco, audio
digital y MIDI). Existen dos interfaces de uso de los comandos MCI, el interfaz de cadenas de comandos
(command-string interface) y el interfaz de mensajes de comandos (command-message interface).
Comandos MCI “Strings” y “Messages”
MCI soporta comandos “Strings” y “Messages”. Se puede usar cualquiera de los dos métodos , o ambos, en
su aplicación de MCI.
• La interfase de comando “Messages” consiste de constantes y estructuras. Se utiliza la función
“mciSendCommand” para enviar los mensajes a un dispositivo de MCI.
• La interfase de comando “Strings” provee una versión textual del mensaje de comando. Se utiliza la
función “mciSendString” parra enviar los “Strings” a un dispositivo de MCI. Los comandos
“Strings” duplican la funcionalidad de los mensajes de comando. El sistema operativo convierte los
comandos “Strings” a comandos de mensaje para enviarlos a el dispositivo MCI para que lo procese.
Los comandos “Messages” agrupan la información en forma de estructuras, que son fáciles de
interpretar en aplicaciones C. Estas estructuras pueden contener información sobre muchos aspectos
diferentes de un dispositivo.
Los comandos “Strings” agrupa la información en forma de “Strings”, y se puede recuperar sólo un “Strings”
por vez. La aplicación debe analizar o debe probar cada “Strings” para interpretarlo.
Algunas aplicaciones MCI usan los “Strings” cuando el valor del retorno no importa (solo para verificar el
éxito) y comandos de mensajes para recuperar la información del dispositivo.
Comandos “Strings”
Para enviar un comando “Strings” a un dispositivo MCI, se usa la función mciSendString que incluye los
parámetros para el comando “Strings” y un buffer para cualquier retorno de información.
la función mciSendString retorna cero si la operación fue exitosa. Si la función falla, la palabra de bajo-orden
del valor del retorno contiene un código del error. Se puede pasar este código del error a la función
mciGetErrorString para conseguir una descripción del error.
Sintaxis del comando Strings
Los comandos string MCI usan una sintaxis de tipo verbo-objeto-modificador. Cada comando string incluye
un comando, un identificador del dispositivo, y un comando del argumento. Los argumentos son optativos
para algunos comandos y requeridos por otros.
Un comando string tiene el siguiente información:
_Argumentos del comando device_id
Este componente contiene la siguiente información:
X- 1
•
•
•
El comando especifica un comando de MCI, como "open", "close", o "play".
El "device_id" identifica una petición a un dispositivo MCI. El device_id se crea cuando el
dispositivo se abre.
Los argumentos especifican las banderas y variables usadas por el comando. Las banderas
son palabras claves reconocidas por el comando MCI. Las variables son números o strings
que aplican al comando MCI o a la bandera. Por ejemplo, el comando play usa los
argumentos "de la posición" a la posición" para indicar las posiciones para empezar y parar.
Cuando se usa una bandera que tiene una variable asociada, se debe proporcionar un valor
para la variable. si no esta especificado (es optativo) los argumentos del comando asumen
un valor predefinido.
La función del ejemplo siguiente envía el comando con las banderas "desde" y "hasta":
DWORD PlayFromTo(LPSTR lpstrAlias, DWORD dwFrom, DWORD dwTo)
{
char achCommandBuff[128];
// Form the command string.
wsprintf(achCommandBuff, "play %s from %u to %u",
lpstrAlias, dwFrom, dwTo);
// Send the command string.
return mciSendString(achCommandBuff, NULL, 0, NULL);
}
Comandos “Messages”
La interfase de comando "menssage" se diseña para ser usada por aplicaciones que exigen a una interfaz del
lenguaje C para controlar los dispositivos multimedia. Usa un paradigma "mensaje de paso" para comunicarse
con los dispositivos MCI. Se puede enviar una orden usando la función mciSendCommand.
La función mciSendCommand retorna cero si es exitoso. Si la función falla, la palabra de retorno contiene un
código del error. Se puede pasar este código de error a la función mciGetErrorString para conseguir una
descripción textual del error.
La sintaxis de comando "Messages"
Los comandos MCI "menssages" consisten en los siguientes elementos :
• Un valor constante del mensaje
• Una estructura que contiene los parámetros para la orden
• Un juego de banderas especificando las opciones para el comando y validando los campos en el
bloque del parámetro.
El ejemplo siguiente usa el mciSendCommand la función para enviar el comando MCI_PLAY al dispositivo
identificado por un identificador del dispositivo.
mciSendCommand(wDeviceID,
MCI_PLAY,
0,
(DWORD)(LPVOID) &mciPlayParms);
//
//
//
//
device identifier
command message
flags
parameter block
El identificador de dispositivo da en el primer parámetro que es recupera cuando el dispositivo se abre usando
el comando MCI_OPEN. El último parámetro es la dirección de una estructura MCI_PLAY_PARMS sobre la
cual se podría contener la información dónde empezar y acabar la reproducción. Muchos comandos MCI
"menssages" usan una estructura para contener parámetros de este tipo. El primer miembro de cada uno de
estas estructuras identifica la ventana que recibe un mensaje MM_MCINOTIFY cuando termina la
operación.
Posibilidades de audio de las cadenas de comandos
Básicamente, las acciones realizables en el campo del sonido son las siguientes:
X- 2
_Acceder a cualquier punto de un CD audio
_Reproducir total o parcialmente un CD audio
_Reproducir total o parcialmente ficheros de forma de onda
_Grabar ficheros de forma de onda
_Obtener información sobre el dispositivo de forma de onda
_Reproducir total o parcialmente ficheros MIDI
_Obtener información sobre el dispositivo de MIDI
_Obtener información de retorno sobre el éxito de las operaciones
Clasificación de los comandos MCI.
MCI define cuatro clasificaciones de los comandos: sistema, requerimiento, básico, y extendido. La lista
siguiente describe la clasificación de estos comandos:
• Comandos de Sistema se que ocupa directamente MCI, en lugar del dispositivo.
• Comandos de Requerimiento se ocupa el dispositivo. Todos los dispositivos MCI deben soportar las
órdenes y banderas requeridas.
• Comandos básicos (o comandos optativos) es usado por algunos drivers. Si un driver soporta
comandos básicos, debe soportar un conjunto definido de banderas para ese comando.
• Comandos extendidos son específicos a un tipo del dispositivo o driver.
Mientras que los comandos de sistema y los requeridos son el juego de comandos mínimos para cualquier
driver MCI, los comandos esenciales y los extendidos no son soportados por todos los drivers. Su aplicación
siempre puede usarse en el sistema y puede requerir órdenes y banderas, pero si necesita usar un comando
esencial o extendido o banderas, debe preguntar al driver si es compatible, ello se hace con la función
(MCI_GETDEVCAPS).
Comandos del sistema
Son los procesos MCI que el sistema ordena directamente, en lugar de pasarlos a los dispositivos de MCI.
Descripción del mensaje string:
Comando
"break"
"sysinfo"
Constante
Descripción
MCI_BREAK
Pone una llave de descanso para un dispositivo de MCI.
MCI_SYSINFO devuelve la información sobre los dispositivos de MCI.
Los Comandos requeridos
Todos los dispositivos de MCI soportan los siguiente comandos requeridos.
La Descripción de Mensaje "string"
Comando
"capability "
"close"
"info"
"open"
"status"
Constante
MCI_GETDEVCAPS
MCI_CLOSE
MCI_INFO
MCI_OPEN
MCI_STATUS
Descripción
Se obtiene las capacidades de un dispositivo.
Cierra el dispositivo.
Se obtiene la información textual de un dispositivo.
Inicializa o abre un dispositivo.
Se obtiene la información de estado del dispositivo.
Algunas de las banderas de este comando no se requieren, porque es un comando básico. Los dispositivos
también deben soportar un juego comandos bandera para los comandos requeridos.
Los Comandos básicos
La lista siguiente resume los comandos básicos. El uso de estos comandos por un dispositivo de MCI es
optativo.
X- 3
La Descripción de Mensaje "sting":
Comando
"load"
"pause"
"play"
"record"
"resume"
"Save"
"Seek"
"Set"
"status"
"stop"
Constante
MCI_LOAD
MCI_PAUSE
MCI_PLAY
MCI_RECORD
MCI_RESUME
MCI_SAVE
MCI_SEEK
MCI_SET
MCI_STATUS
MCI_STOP
Descripción
Lee los datos de un archivo.
Para la ejecución. La grabación pueden reanudarse en la posición actual.
Pone a trasmitir los datos a la salida.
Comienza la grabación de datos de la entrada.
Resume la ejecución o grabando en una pausa el dispositivo.
Guarda los datos a un archivo del disco.
Busca adelante o hacia atrás.
el estado en que opera del dispositivo.
Obtiene la información de estado del dispositivo.
Para la ejecución.
Los Comandos extendidos
Algunos dispositivos de MCI tienen órdenes adicionales, o ellos se le agregan banderas a las órdenes
existentes. Mientras algunos comandos extendidos se le aplican a un driver del dispositivo específico, la
mayoría de ellos se aplican a todos los driver de un tipo del dispositivo particular.
Este tipo de comando son utilizados para video digital y secuencias MIDI.
Funciones MCI, Macros, y Mensajes.
Muchas aplicaciones de MCI usan la función mciSendString y mciSendCommand.
El identificador del dispositivo requerido por la mayoría de los comandos MCI se obtiene llamando al
comando "open" (MCI_OPEN). Por ejemplo si se necesita un identificador pero no quiere abrir el
dispositivo, o consultar las capacidades del dispositivo antes de tomar alguna otra acción se puede llamar la
función del mciGetDeviceID.
La función mciGetCreatorTask permite a la aplicación usar un identificador del dispositivo para obtener una
referencia de la tarea que creó ese identificador.
La función mciGetYieldProc y mciSetYieldProc asignan y recuperan la dirección de la función callback que
asoció con la bandera "wait" (MCI_WAIT).
La función mciGetErrorString devuelve un cordón que describe un valor de error MCI. Cada cordón que MCI
devuelve, que puede ser un datos o una descripción del error, posee un máximo de 128 caracteres. Los
campos de caja de diálogo (Dialog box ) que son más pequeño que 128 caracteres truncarán los cordones más
largos que retorna MCI.
Los macros de MCI son las herramientas que se pueden usar para crear y desmontar valores que especifican
los formatos de tiempo. Éstos formatos de tiempo se usan en muchos comandos MCI. Los formatos
representados por las macros es: hours/minutes/seconds (HMS), minutes/seconds/frames (MSF), y
tracks/minutes/seconds/frames (TMSF).
Descripción de la macro
Constante
MCI_HMS_HOUR
MCI_HMS_MINUTE
MCI_HMS_SECOND
MCI_MAKE_HMS
MCI_MAKE_MSF
MCI_MAKE_TMSF
MCI_MSF_FRAME
MCI_MSF_MINUTE
Descripción
Retorna la horas compuesto de un valor de HMS.
Retorna la horas compuesto de un valor de HMS.
Retorna la horas compuesto de un valor de HMS.
Crea un valor de HMS.
Crea un valor de MSF.
Crea un valor de TMSF.
Retorna el componente de los frames con un valor de MSF.
Retorna el componente de los minutos con un valor de MSF.
X- 4
MCI_MSF_SECOND
MCI_TMSF_FRAMe
MCI_TMSF_MINUTE
MCI_TMSF_SECOND
MCI_TMSF_TRACK
Retorna el componente de los segundos con un valor de MSF.
Retorna el componente de los frames con un valor de TMSF.
Retorna el componente de los minutos con un valor de TMSF.
Retorna el componente de los segundos con un valor de TMSF.
Retorna el componente de los track con un valor de TMSF.
MCI también proporciona dos mensajes: MM_MCINOTIFY y MM_MCISIGNAL.
El mensaje MM_MCINOTIFY informa a una aplicación del resultado de un comando MCI siempre que ese
comando especifique la bandera "notifique" (MCI_NOTIFY).
El mensaje MM_MCISIGNAL es específico de los dispositivos del video digital; informa a la aplicación
cuando se alcanza una posición especificada .
Espera, Notificación, y Banderas Prueba
Muchas órdenes de MCI incluyen banderas que modifican el comando.
Las banderas "Wait" (MCI_WAIT) y "Notify" (MCI_NOTIFY) son comunes en cada comando. La bandera
"Test" (MCI_TEST) está disponible para digital-video y dispositivos de VCR.
Bandera de la Espera
Los comandos de MCI retornan inmediatamente al usuario, aun cuando toma varios minutos para completar
la acción. Se puede usar la bandera "wait" (MCI_WAIT) para dirigir el dispositivo que espere hasta que la
acción pedida se complete antes de devolver el mando a la aplicación.
Por ejemplo, el comando no devolverá el mando a la aplicación hasta que se complete:
mciSendString("play mydevice from 0 to 100 wait",
lpszReturnString, lstrlen(lpszReturnString), NULL);
Nota :
Se puede cancelar la espera apretando CTRL+BREAK. Las aplicaciones pueden redefinir usando el comando
"break" (MCI_BREAK). (MCI_BREAK usa la estructura MCI_BREAK_PARMS ) Cuando una espera se
cancela, MCI intenta devolver el mando a la aplicación sin interrumpir el comando asociado con la bandera
de espera.
Bandera de información.
La bandera "notify" (MCI_NOTIFY) dirige al dispositivo para anunciar un mensaje MM_MCINOTIFY
cuando el dispositivo completa una acción. Su aplicación debe tener un procedimiento de ventana para
procesar el mensaje de MM_MCINOTIFY. Un mensaje de MM_MCINOTIFY indica que el proceso de un
comando se ha completado, pero no indica si el comando fue completado con éxito, si falló, o se reemplazó o
abortó.
En la interfaz de comando "string", se usa en el parámetro de la función mciSendString . En la interfaz del
comando "message", se especifica en la palabra dwCallBack de la estructura enviada con el comando
"menssage". (Cada estructura asociada con un comando "menssage" contiene este miembro.)
Bandera de Prueba
la bandera "test" (MCI_TEST) pregunta al dispositivo para determinar si puede ejecutar el comando. El
dispositivo devuelve un error si no puede ejecutar el comando. No devuelve ningún error si puede ocuparse
del comando. Cuando se especifica esta bandera, MCI devuelve el mando a la aplicación sin ejecutar el
comando.
Esta bandera es soportada por video digital y dispositivos VCR para todos los comandos excepto
"open"(MCI_OPEN) y "close" (MCI_CLOSE).
X- 5
Comandos de atajo y Variaciones
Se puede usar varios comandos atajos al trabajar con las órdenes de MCI. Estos atajos permiten usar un solo
identificador para referirse a todos los dispositivos de la aplicación que se ha abierto, o para abrir un
dispositivo sin emitir explícitamente un comando "open"(MCI_OPEN ).
Se puede especificar un "all" (MCI_ALL_DEVICE_ID) como identificador del dispositivo para cualquier
comando que no devuelve información. Cuando se especifica "all", MCI envía la orden secuencialmente a
todos los dispositivos abiertos por la aplicación actual.
Por ejemplo, el comando "close" "all" cierra todos los dispositivos abiertos y el comando "play" "all"
empiezan a ejecutarse todos los dispositivos abiertos por la aplicación. Ya que MCI envía los comandos
secuencialmente a los dispositivos de MCI, hay un intervalo entre, cuando los primero y el último dispositivo
recibe el comando.
Usando "all" es una manera conveniente de transmitir un comando a todos sus dispositivos, pero no se debe
confiar en él para sincronizarlos.
Cuando se emite un comando y se especifica a un dispositivo que no está abierto, MCI intenta abrir el
dispositivo antes de llevar a cabo el comando. Las siguientes reglas se aplican para abrir los dispositivos
automáticamente:
• La apertura automática sólo trabaja con la interfaz del "comando string".
• La apertura automática falla para comandos que son específico a los driver del dispositivo
personalizado.
• La apertura automática de los dispositivos, no responden a órdenes que usan "all" como un nombre
de dispositivo.
• La apertura automática no permite que una aplicación especifique el tipo de bandera. Sin el nombre
del dispositivo, MCI determina el nombre del dispositivo para las entradas en un registro. Para usar
un dispositivo específico, se puede combinar el nombre del dispositivo con el nombre del archivo
usando con un punto de admiración.
Si una aplicación usa la apertura automático para abrir un dispositivo, la aplicación debe verificar el valor de
retorno de cada orden abierta para verificar que el dispositivo este todavía abierto. MCI cierra
automáticamente cualquier dispositivo que abre automáticamente. MCI cierra un dispositivo en las siguientes
situaciones:
• El comando se completa.
• Se aborta el comando.
• Se notificación de la demanda en un comando subsiguiente.
• MCI descubre una falla.
Dispositivos MCI
Cada dispositivo multimedia MCI posee un juego de órdenes de MCI. Por ejemplo, play (MCI_PLAY )
hace que el dispositivo se abra para reproducir un archivo, no importa el tipo de datos con que el
dispositivo trabaja.
Control del dispositivo
Para controlar un dispositivo de MCI, se abre el dispositivo, envía los comandos necesarios, y entonces
cierra el dispositivo. Los comandos pueden ser muy similares, incluso para dispositivos MCI
completamente diferentes.
Este ejemplo ejecuta el track número 6 de un CD de audio usando mciSendStrimg :
mciSendString("open cdaudio", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("set cdaudio time format tmsf", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("play cdaudio from 6 to 7", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("close cdaudio", lpszReturnString, lstrlen(lpszReturnString), NULL);
El ejemplo siguiente muestra la misma serie de comandos para reproducir los primeros 10000 samples de un
archivo de forma de onda:
X- 6
mciSendString(
"open c:\mmdata\purplefi.wav type waveaudio alias finch", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("set finch time format samples", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("play finch from 1 to 10000", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("close finch", lpszReturnString, lstrlen(lpszReturnString), NULL);
Reproducción y Posicionamiento
Varios comandos MCI como (MCI_PLAY), (MCI_STOP), (MCI_PAUSE), (MCI_RESUME),
(MCI_SEEK), afecta la reproducción o el posicionamiento de un archivo multimedia. Si un dispositivo de
MCI recibe un comando de reproducción mientras otro comando de reproducción esta siendo ejecutado,
acepta el comando y detiene o reemplaza el comando anterior.
Muchos comandos MCI, como (MCI_SET ), no afectan la reproducción. Una notificación de uno de estos
comandos no interfiere con la reproducción pendiente o comandos de posición con tal de que las
notificaciones no se realicen al mismo driver.
Tipos de dispositivos
MCI reconoce un conjunto básico de dispositivo. Un tipo de dispositivo es un conjunto de drivers de MCI que
comparten un conjunto de comando en común y se usa para controlar dispositivos multimedia similares o
archivos de datos. Muchos comandos MCI como (MCI_OPEN), se le debe especificar un tipo del dispositivo.
Dispositivo
cdaudio
digitalvideo
dat
overlay
scanner
sequencer
vcr
waveaudio
videodisk
Constante
MCI_DEVTYPE_CD_AUDIOCD
MCI_DEVTYPE_DIGITAL_VIDEO
MCI_DEVTYPE_DAT
MCI_DEVTYPE_OVERLAY
MCI_DEVTYPE_SCANNER
MCI_DEVTYPE_SEQUENCER
MCI_DEVTYPE_VCR
MCI_DEVTYPE_WAVEFORM_AUDIO
MCI_DEVTYPE_VIDEODISC
Descripción
Reproductor de CD de audio
Vídeo digital en una ventana
Reproductor de cinta DAT
Vídeo analógico en una ventana
Scanner de imágenes
Secuenciador MIDI
Vídeo en cinta magnética
Ficheros de onda
Reproductor de disco de vídeo
Los nombres de la columna dispositivo son los que utilizaremos en las cadenas de comandos, mientras que las
constantes se utilizan en los mensajes de comandos.
Nombres de los dispositivos
Para identificar a un driver de MCI, MCI usa los nombres del dispositivo.
Los nombres del dispositivo se identifican en la sección [mci] del archivo SYSTEM.INI o en la parte
apropiada del registro. Esta información identifica a todos los drivers de MCI para Windows.
X- 7
La lista de dispositivos MCI disponibles, varía
de un ordenador a otro en función de los
drivers instalados.
La lista de dispositivos disponibles coincidirá
con las entradas de la sección [mci] en el
fichero system.ini :
[mci]
cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv
vcr=mcivisca.drv
MPEGVideo=mciqtz.drv
MPEGVideo2=mciqtz.drv
La lista del ejemplo es una lista básica que el
instalador de Windows coloca, si detecta la
presencia de una tarjeta de sonido y de una
unidad de CD-ROM. En el caso de otros
dispositivos menos frecuentes, como lectores
de videodisco, scanners, etc. la instalación de
los drivers y la modificación del system.ini, se
llevará a cabo desde el software que acompañe
al aparato.
Driver de soporte para los Comandos de MCI
Los drivers de MCI mantienen la funcionalidad los comandos de MCI. El software del sistema realiza algunas
tareas de direccionar datos, pero toda la reproducción multimedia, la presentación, y la grabación se ocupa los
drivers de MCI.
Los driver varían en el soporte de comandos MCI y las banderas del comando. Porque los dispositivos
multimedia pueden tener capacidades muy diferentes, MCI se diseña para permitir a los drivers extenderse o
se reducen comandos para igualar las capacidades del dispositivo.
Trabajando con dispositivos MCI
Abriendo un Dispositivo
Antes de usar un dispositivo, se debe inicializarlo usando (MCI_OPEN) . Este comando carga al driver en la
memoria y recupera el identificador del dispositivo que se usará para identificar el dispositivo en los
comandos de MCI. Se debe verificar el valor de retorno de la función mciSendString o mciSendCommand
antes de usar el identificador del dispositivo para asegurar que el identificador es válido. (También se puede
recuperar un identificador de dispositivo usando la función mciGetDeviceID).
Como todos comandos de mensaje (command messages) de MCI, MCI_OPEN tiene una estructura asociada.
Estas estructuras a veces se llaman los bloques del parámetro. La estructura predefinida para MCI_OPEN es
MCI_OPEN_PARMS. Ciertos dispositivos (como waveform y overlay) han extendido sus estructuras
(MCI_WAVE_OPEN_PARMS y MCI_OVLY_OPEN_PARMS ) para acomodar los parámetros optativos
adicionales. A menos que se necesite usar estos parámetros adicionales, se puede usar la estructura
MCI_OPEN_PARMS con cualquier dispositivo de MCI.
El número de dispositivos que usted puede tener abierto sólo está limitado por la cantidad de memoria
disponible.
Usando un seudónimo
X- 8
Cuando se abre un dispositivo, se puede usar la bandera de "seudónimo" o "alias" para especificar un
identificador del dispositivo para el dispositivo. Esta bandera le permite asignar un identificador corto del
dispositivo para los dispositivos compuestos con nombres de archivo largo, y le permite abrir casos múltiples
del mismo archivo o dispositivo.
Por ejemplo, el comando siguiente asigna el de identificador de dispositivo al nombre de archivo largo
C:\NABIRDS\SOUNDS\MOCKMTNG.WAV:
mciSendString(
"open c:\nabirds\sounds\mockmtng.wav tipo de “alia” para wave ",
lpszReturnString, lstrlen(lpszReturnString), NULL);
En la interfaz comando mensaje, se especifica un alias usando el miembro lpstrAlias de la estructura
MCI_OPEN_PARMS.
Especificando un Tipo del Dispositivo
Cuando se abre un dispositivo, se puede usar la bandera "tipe" para referirse a un tipo de dispositivo, en lugar
de un driver del dispositivo específico. El ejemplo siguiente abre el archivo waveform-audio
C:\WINDOWS\CHIMES.WAV (usando la bandera "tipe" para especificar el tipo de dispositivo de
waveaudio) y asigna los el seudónimo "chimes":
mciSendString (
c:\windows\chimes.wav tipo de alias para el waveaudio chimes",
lpszReturnString, lstrlen(lpszReturnString), NULL);
En la interfaz del comando mensaje, la funcionalidad de la bandera del "type" se proporciona por el miembro
del lpstrDeviceType de la estructura MCI_OPEN_PARMS
Los Dispositivos simples y Compuestos
MCI clasifica a los driver del dispositivo como simple o compuesto. Los drivers para los dispositivos
compuestos requieren el nombre de un archivo del datos para la reproducción; los drivers para los dispositivos
simples no lo hacen.
Los dispositivos simples incluyen cd de audio y dispositivos del video. Hay dos maneras de abrir los
dispositivos simples:
• Especificando un indicador a un string null-terminated que contiene el nombre del dispositivo del
registro o el archivo SYSTEM.INI. Por ejemplo, para abrir un dispositivo de video usando el
comando siguiente:
mciSendString ("open videodisc", lpszReturnString,
lstrlen(lpszReturnString), NULL);
En este caso, el "video" es el nombre del dispositivo en el registro o en la sección [ mci] de SYSTEM.INI.
• Especificando el nombre real del driver del dispositivo. Abriendo un dispositivo que usa el nombre
de archivo del driver del dispositivo, sin embargo, hace que la aplicación sea especifica del
dispositivo y puede impedir que la aplicación corra sin los cambios de la configuración de sistema.
Si se usa un nombre de archivo, no es necesario especificar el camino completo o la extensión del
archivo, MCI asume que el driver se localiza en un directorio del sistema y su extensión es DRV.
Los dispositivos compuestos incluyen waveaudio y dispositivos sequencer.
Hay tres maneras de abrir un dispositivo compuesto:
•
Especificando sólo el nombre del dispositivo. Esto le permite abrir un dispositivo compuesto sin
asociar un nombre de archivo.
• Especificando sólo el nombre de archivo. El nombre del dispositivo es determinado de las
asociaciones en el registro.
• Especificando el nombre de archivo y el de dispositivo. MCI ignora las entradas en el registro y abre
el nombre del dispositivo especificado.
Para asociar un archivo de datos con un dispositivo particular, se especifica el nombre de archivo y el nombre
del dispositivo. Por ejemplo, el comando siguiente abre el dispositivo de waveaudio con el archivo
MYVOICE.SND:
mciSendString("open myvoice.snd type waveaudio", lpszReturnString, lstrlen(lpszReturnString), NULL);
Abriendo un Dispositivo Usando la Extensión de archivo
X- 9
Si el comando (MCI_OPEN ) especifica sólo el nombre del archivo, MCI usa la extensión del archivo para
seleccionar el dispositivo apropiado de la lista del registro o de las extensiones del mci en la sección del
archivo SYSTEM.INI.
Archivo nuevo de dato
Para crear un archivo nuevo de datos, simplemente se especifica un nombre de archivo. MCI no guarda un
nuevo archivo hasta que no se lo guarde usando (MCI_SAVE ). Al crear un nuevo archivo, se debe incluir un
alias del dispositivo con (MCI_OPEN ).
El ejemplo siguiente abre un archivo nuevo de waveaudio, comienza y finaliza el grabado, entonces guarda y
cierra el archivo:
mciSendString("open new type waveaudio alias capture", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("record capture", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("stop capture", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("save capture orca.wav", lpszReturnString, lstrlen(lpszReturnString), NULL);
mciSendString("close capture", lpszReturnString,lstrlen(lpszReturnString), NULL);
Información recuperada de un Dispositivo
Cada dispositivo responde al comando (MCI_GETDEVCAPS ), (MCI_STATUS ), e (CI_INFO ). Estos
comandos obtienen la información sobre el dispositivo. Las banderas y los comandos básicos proporcionan
una cantidad mínima de información sobre un dispositivo. Muchos dispositivos complementan los comandos
básicos con banderas extendidas que proporcionar información adicional sobre el dispositivo.
Obtención de la información del sistema de MCI
El comando (MCI_SYSINFO ) obtiene la información del sistema sobre los dispositivos de MCI. MCI se
ocupa de este comando sin relevarlo a cualquier dispositivo de MCI. Para la interfaz de comando mensaje,
MCI devuelve la información del sistema en la estructura MCI_SYSINFO_PARMS .
Se puede usar el comando (MCI_SYSINFO) para recuperar la información, como el número de dispositivos
de MCI en un sistema, el número de dispositivos de MCI de un tipo particular, el número de dispositivos de
MCI abierto, y los nombres de los dispositivos. Este comando se llama a menudo más de una vez para
recuperar un pedazo de información. Por ejemplo, se podría recuperar el número de dispositivos de un tipo
particular en la primera llamada y entonces podría enumerar los nombres de los dispositivos en la próximo.
Ejecutando un Dispositivo
El comando (MCI_PLAY ) ejecuta la reproducción de un dispositivo. Sin cualquier bandera, este comando
empieza reproducir en la posición actual y reproduce hasta que el comando se interrumpa o hasta el fin del
archivo. También se puede usar (MCI_SEEK ) para cambiar la posición actual.
La mayoría de los dispositivos que soportan el comando también soportan las banderas (MCI_FROM) y
(MCI_TO). Estas banderas indican la posición a que el dispositivo debe empezar y debe detener la
reproducción.
Las unidades asignadas al valor de la posición dependen del formato de tiempo usado por el dispositivo. Cada
dispositivo tiene un formato de tiempo predefinido, pero se debe especificar el formato de tiempo usando
(MCI_SET ) antes de emitir cualquier comando que usa los valores de la posición.
Grabación
La especificación generales de MCI soportan grabación de video-digital, secuencias MIDI, VCR, y los
dispositivos de audio del tipo forman de onda; sin embargo, sólo se usa en audio-waveform y dispositivos de
VCR. Se puede insertar o borrar la información grabada en un archivo existente o se puede grabar en un
nuevo archivo. Para grabar en un archivo existente, se abre un dispositivo de audio-waveform y se guarda
como se hace normalmente. Para grabar en un nuevo archivo con la interfaz de comando mensaje, se
especifica un archivo de longitud cero.
Cuando MCI crea un nuevo archivo para grabar, el formato de los datos se pone a un formato predefinido
especificado por el driver del dispositivo. Para usar otro tipo formato de que no sea el formato predefinido, se
debe usar el comando (MCI_SET).
X - 10
Para empezar a grabar, se usa un registro y un comando ellos son: ( MCI_RECORD y la estructura
MCI_RECORD_PARMS ).
Si no se especifica un fin, la grabación continúa hasta que se envíe una parada (MCI_STOP ). Si se graba en
un archivo nuevo, se puede empezar a grabar al principio del archivo nuevo y especificar una situación de fin
para terminar la grabación.
Guardando un Archivo Grabado
Cuando la grabación está completo, se usa el comando ( MCI_SAVE y la estructura MCI_SAVE_PARMS )
para guardar la grabación antes de cerrar el dispositivo.
Detener, y hacer una pausa.
El comando (MCI_STOP ) suspende la reproducción o grabación de un dispositivo. Muchos dispositivos
también soportan el comando (MCI_PAUSE ). La diferencia entre la parada y la pausa depende del
dispositivo. Normalmente la pausa suspende el funcionamiento pero deja al dispositivo listo para reanudar
inmediatamente la reproducción o grabación.
Cerrando un Dispositivo
El cierre se realiza con el comando (MCI_CLOSE ) libera el acceso del comando a un dispositivo o archivo.
MCI libera un dispositivo cuando todas las tareas que usan un dispositivo lo han cerrado. Para ayudar a MCI a
manejar los dispositivos, la aplicación debe cerrar cada dispositivo o archivo cuando ya fue usando.
Cuando se cierra un dispositivo externo de MCI que usa sus propios medios de comunicación en lugar de los
archivos (como el CD audio), el driver deja el dispositivo en su modo actual de funcionamiento. Así, si se
cierra un dispositivo de CD de audio que está reproduciendo, aunque el driver del dispositivo se libera de la
memoria, el CD de audio continuará reproduciendo hasta que alcance el fin de su volumen.
La interfaz de mensajes de comandos desde el lenguaje C
Cuando se utiliza el interfaz de cadenas, una llamada a las funciones mciSendString() o mciExecute(), fuerza
al sistema a interpretar la cadena y desglosar cada uno de los parámetros que la componen. Con estos valores
el sistema realiza internamente una nueva llamada, esta vez a la función mciSendCommand(), que es la
función utilizada directamente por el interfaz de mensajes.
Ambos interfaces ofrecen la misma funcionalidad y poseen, por así decirlo, el mismo "vocabulario", pero
donde el interfaz de cadenas, utiliza cadenas de texto, el de mensajes, utiliza datos estructurados y constantes
predefinidas en el fichero de cabecera “mmsystem.h”.
Cada uno de los comandos, dispositivos o modificadores que pueden formar parte de una cadena MCI, tienen
un valor numérico asociado, accesible desde una constante de C. Así por ejemplo, el comando open tiene
asociada la constante MCI_OPEN, y el dispositivo waveaudio, la constante MCI_DEVTYPE_WAVEFORM.
El prototipo de la función mciSendCommand() es el siguiente:
DWORD mciSendCommand(UINT wIDDispositivo, UINT wComando, DWORD dwParam1, DWORD
dwParam2);
wIDDispositivo, es un entero sin signo, que identifica al dispositivo.
wComando, indica el comando a realizar, mediante una de las constante del tipo MCI_XXX.
dwParam1 es un entero largo en el que se colocan constantes de tipo bandera (flags) que indican diferentes
formas de llevar a cabo la acción (esperar, avisar, etc.)
dwParam2 está definido como entero largo, pero contiene en realidad la dirección de una estructura C con
información adicional para el comando (inicio, final, etc.).
El tipo de estructura varía con el valor de wComando, ya que cada uno posee una estructura asociada.
Resumen del manejo de un dispositivo MCI
X - 11
1. Abrir un dispositivo con el comando MCI_OPEN y los parámetros necesarios (dispositivo y fichero) en la
estructura MCI_OPEN_PARMS. En este caso, el parámetro wIDDispositivo se deja a cero.
2. Almacenar en una variable, el identificador del dispositivo abierto, retornado en el campo wDeviceID de
MCI_OPEN_PARMS, en la llamada anterior.
3. A partir de la obtención de este identificador, lo podremos utilizar para cualquier otra operación.
4. Consultar el estado del dispositivo, con el comando MCI_STATUS y la estructura CI_STATUS_PARMS.
5. Modificar algún parámetro del dispositivo, con el comando MCI_SET y la estructura MCI_SET_PARMS.
6. Reproducir un fichero con el comando MCI_PLAY y la estructura MCI_PLAY_PARMS.
7. Grabar un fragmento (sólo aplicable al dispositivo de onda) con el comando MCI_RECORD y la estructura
MCI_RECORD_PARMS.
8. También se pueden utilizar los comandos MCI_PAUSE, MCI_RESUME y MCI_STOP, para parar
temporalmente, reanudar, o parar definitivamente la reproducción o la grabación. En este caso no se utiliza
ninguna estructura, dejando por lo tanto a cero el último parámetro de la función.
9. Salvar un fichero a disco con el comando MCI_SAVE y la estructura MCI_SAVE_PARMS.
10.Cerrar un dispositivo con el comando MCI_CLOSE. No se utiliza ninguna estructura, por lo que el último
parámetro se deja a cero.
En caso de que se produzca algún error, se puede utilizar la función mciGetError(), que devuelve una cadena
con el mensaje de error correspondiente al código numérico.
Limitaciones de los comandos MCI
En el tema del sonido, las posibilidades MCI son especialmente notables para los dispositivos de onda y el
CD audio. Las principales restricciones:
• Imposibilidad de grabar mensajes MIDI.
• Imposibilidad de elección del puerto de salida para MIDI
• Imposibilidad de enviar mensajes individuales para MIDI.
Bibliografía:
Soporte técnico de Microsoft
Microsoft Windows SDK Multimedia Programmer’s Reference.
Programación de sonido con los comandos MCI, Sergi Jordà Puig, Audio digital y MIDI, Guías Monográficas
Anaya Multimedia, Madrid 1997
X - 12
Capítulo 11
Programa de adquisición
Introducción
Este programa de adquisición se basa en tomar datos desde la placa de sonido mediante el uso de los
comandos MCI de Windows y almacenarlos en un archivo del tipo de forma de onda o WAVE, a su vez esta
aplicación se ejecuta bajo el sistema operativo Windows y posee un entorno grafico.
La aplicación fue desarrollada en Dev-C++ 4, el cual nos permite el uso de las API de Windows y el uso de
los comandos MCI.
Programas bajo Windows
Los programas de Windows presentan las siguientes características:
Independencia de la máquina
Los programas Windows son independientes de la máquina en la que se ejecutan, el acceso a los dispositivos
físicos se hace a través de interfaces, y nunca se accede directamente a ellos. Esta es una de las principales
ventajas para el programador, ya que no hay que preocuparse por el modelo de tarjeta gráfica o de impresora,
la aplicación funcionará con todas, y será el sistema operativo el que se encargue de que así sea.
Recursos
Un concepto importante es el de recurso. Desde el punto de vista de Windows, un recurso es todo aquello que
puede ser usado por una o varias aplicaciones. Existen recursos físicos, que son los dispositivos que
componen el ordenador, como la memoria, la impresora, el teclado o el ratón y recursos virtuales o lógicos,
como los gráficos, los iconos o las cadenas de caracteres.
Por ejemplo, si nuestra aplicación requiere el uso de un puerto serie, primero debe averiguar si está
disponible, es decir, si existe y si no lo está usando otra aplicación; y después lo reservará para su uso. Esto es
necesario porque este tipo de recurso no puede ser compartido. Lo mismo pasa con la memoria o con la tarjeta
de sonido, aunque son casos diferentes. Por ejemplo, la memoria puede ser compartida, pero de una forma
general, cada porción de memoria no puede compartirse, y se trata de un recurso finito. Las tarjetas de sonido,
dependiendo del modelo, podrán o no compartirse por varias aplicaciones.
Otros recursos como el ratón y el teclado también se comparten, pero se asigna su uso automáticamente a la
aplicación activa, a la que normalmente mantiene contacto con el usuario.
Desde otro punto de vista, también consideramos recursos a varios componentes como los menús, los iconos,
los cuadros de diálogo, las cadenas de caracteres, los mapas de bits, los cursores, etc. En sus programas,
Windows almacena separados el código y los recursos, dentro del mismo fichero, y estos últimos pueden ser
editados por separado, permitiendo por ejemplo, hacer versiones de los programas en distintos idiomas sin
tener acceso a los ficheros fuente de la aplicación.
Ventanas
La forma en que se presentan las aplicaciones Windows ante el usuario, es la ventana. Cada aplicación tiene
al menos una ventana, la ventana principal, y todas las comunicaciones entre usuario y aplicación se canalizan
a través de una ventana. Cada ventana comparte el espacio de la pantalla con otras ventanas, incluso de otras
aplicaciones, aunque sólo una puede estar activa, es decir, sólo una puede recibir información del usuario.
XI - 1
Eventos
Los programas en Windows están orientados a eventos, esto
significa que normalmente los programas están esperando a que
se produzca un acontecimiento que les incumba, y mientras
tanto permanecen aletargados o dormidos.
Un evento puede ser por ejemplo, el movimiento del ratón, la
activación de un menú, la llegada de información desde el
puerto serie, una pulsación de una tecla...
Esto es así porque Windows es un sistema operativo multitarea,
y el tiempo del microprocesador ha de repartirse entre todos los
programas que se estén ejecutando. Si los programas fueran
secuenciales puros, esto no sería posible, ya que hasta que una
aplicación finalizara, el sistema no podría atender al resto.
Proyectos
Debido a la complejidad de los programas Windows, normalmente los dividiremos en varios ficheros fuente,
que se compilan por separado y se enlazan juntos.
Para crear un proyecto Windows usando este compilador elegiremos el menú "File/New Project". Se abrirá un
cuadro de diálogo donde podremos elegir el tipo de proyecto. Elegimos "Windows Application" y "C++
Project". A continuación pulsamos "Aceptar".
El compilador crea un proyecto con un fichero C++, con el esqueleto de una aplicación para una ventana.
Controles
Los controles son la forma en que las aplicaciones Windows intercambian datos con el usuario. Normalmente
se usan dentro de los cuadros de diálogo, pero pueden usarse en cualquier ventana.
Los más importantes son:
• Control estatic: son etiquetas, marcos, iconos o dibujos.
• Control edit: permiten que el usuario introduzca datos alfanuméricos en la aplicación.
• Control list box: el usuario puede escoger entre varias opciones de una lista.
• Control combo box: es una combinación entre un edit y un list box.
• Control scroll bar: barras de desplazamiento, para la introducción de valores entre márgenes
definidos.
• Control button: realizan acciones o comandos, de button de derivan otros dos controles muy
comunes:
1. Control check box: permite leer variables de dos estados "checked" o "unchecked"
2. Control radio button: Se usa en grupos, dentro de cada grupo sólo uno puede ser activado.
Descripción del Programa.
Ficheros de cabecera
Los ficheros de cabecera utilizados son los siguientes:
• “windows.h” que es el fichero para crear aplicaciones Windows llamando a las API.
• “mmsystem.h” fichero cabecera para el uso de MCI.
• “stdlib.h” fichero que posee funciones estándar de librerías.
• “stdio.h” fichero que posee funciones estándar de entrada salida.
• “ids.h” fichero que posee declaraciones de constantes utilizadas por la aplicación.
XI - 2
Para que la aplicación pueda ser ejecutada bajo Windows fue necesario incluir la siguiente librería:
winmm.lib.
#include <windows.h>
#include <mmsystem.h>
#include <stdlib.h>
#include <stdio.h>
#include "ids.h"
#pragma comment(lib, "winmm.lib").
Declaración del prototipo de las funciones.
Cada tipo (o clase) de ventana que usemos en nuestro programa, o cada cuadro de diálogo, necesitará un
procedimiento propio, que deberemos declarar y definir.
Siguiendo la estructura de un programa C, esta es la zona de declaración de prototipos.
Para el procedimiento de la ventana la declaración del prototipo de la función tiene la siguiente forma:
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
Los cuadros de diálogo poseen el siguiente prototipo:
1. Función por la cual llamamos a un procedimiento que realiza un cuadro de diálogo, en pantalla, por
el cual podemos visualizar el tiempo de adquisición:
BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);
2.
Función por la cual realizamos el manejo con caracteres alfanuméricos de un “control edit”:
BOOL CALLBACK DlgProc3(HWND, UINT, WPARAM, LPARAM);
3.
Función por la cual realizamos el manejo con caracteres numéricos de un “control edit”:
BOOL CALLBACK DlgProcnum(HWND, UINT, WPARAM, LPARAM);
Las funciones utilizadas para la grabación y reproducción de ficheros WAVE se declaran de la siguiente
forma:
1.
Declaración de la función de grabación:
DWORD playWaveFile(HWND, LPSTR);
2.
Declaración de la función de reproducción:
DWORD recordWAVEFile(HWND, DWORD);
Declaración de variables globales
Nuestra aplicación hace uso de algunas variables globales, alguna solo las utiliza Windows como por ejemplo
el nombre de clase, y otras son utilizadas a lo largo del programa:
1. Nombre de la clase:
char szClassName[ ] = "Adquisidor";
2.
Tiempo de adquisición que se realiza en milisegundos, es del tipo entero ya que solo se admiten
caracteres tipo numérico:
int MilliSeconds;
3.
Nombre del archivo con que guardaremos nuestra adquisición, es un array de caracteres:
char Nombre[80];
4.
Para poder almacenar nuestro nombre de archivo haremos uso de una estructura, en la cual existe un
solo parámetro tipo carácter:
XI - 3
typedef struct stDatos
{
char Texto[80];
} DATOS;
5.
Para poder almacenar nuestro tiempo de muestreo y luego verificar que se incluyen solo caracteres
numéricos usaremos una estructura, en la cual existe un solo parámetro tipo entero: typedef struct
inDatos
{
int Numero;
} INDATOS;
Función Win main
La función Winmain se divide en tres partes claramente diferenciadas: declaración, inicialización y bucle de
mensajes.
La función WinMain tiene cuatro parámetros de entrada:
• hInstance es un manipulador para la instancia del programa que estamos ejecutando. Cada vez que se
ejecuta una aplicación, Windows crea una Instancia para ella, y le pasa un manipulador de dicha
instancia a la aplicación.
• hPrevInstance es un manipulador a instancias previas de la misma aplicación. Como Windows es
multitarea, pueden existir varias versiones de la misma aplicación ejecutándose, varias instancias. En
Win32 usa un segmento distinto para cada instancia y este parámetro es siempre NULL, sólo se
conserva por motivos de compatibilidad con Win 3.11.
• lpszCmdParam, esta cadena contiene los argumentos de entrada del comando de línea.
• nCmdShow, este parámetro especifica cómo se mostrará la ventana.
Función winmain:
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR pszArgument, int
nFunsterStil)
Declaración
En la primera zona declararemos las variables que necesitamos para nuestra función WinMain:
• HWND hWnd, un manipulador para la ventana principal de la aplicación. Ya que nuestra aplicación
necesitará al menos una ventana.
• MSG Message, una variable para manipular los mensajes que lleguen a nuestra aplicación.
• WNDCLASSEX wincl, una estructura que se usará para registrar la clase particular de ventana que
usaremos en nuestra aplicación.
La declaración se realiza de la siguiente forma:
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
También haremos uso de otra declaración previa la cual es el tiempo de adquisición el cual debe poseer un
valor por defecto, en este caso el valor por defecto será 1000 ms:
MilliSeconds = 1000;
Inicialización
Esta zona se encarga de registrar la clase o clases de ventana, crear la ventana y visualizarla en pantalla.
Para registrar la clase primero hay que rellenar adecuadamente la estructura WNDCLASSEX, que define
algunas características que serán comunes a todas las ventanas de una misma clase, como color de fondo,
icono, menú por defecto, el procedimiento de ventana, etc. Después hay que llamar a la función
RegisterClassEx.
XI - 4
A continuación se crea la ventana usando la función CreateWindowEx. Esta función nos devuelve un
manipulador de ventana que podemos necesitar en otras funciones.
Para que la ventana sea visible hay que llamar a la función ShowWindow. La primera vez que se llama a ésta
función, después de crear la ventana, se puede usar el parámetro nCmdShow de WinMain como parámetro o
mejor aún, como se recomienda por Windows, el valor SW_SHOWDEFAULT.
Estructura de la ventana:
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof(WNDCLASSEX);
Usa icono y puntero del ratón por defecto:
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
Registra la clase de ventana, si falla sale del programa:
if(!RegisterClassEx(&wincl)) return 0;
La clase es registrada, ya se puede crear el programa:
hwnd = CreateWindowEx(
0,
/* Extended possibilities for variation */
szClassName,
/* Classname */
"Adquisidor de Datos ",
/* Title Text */
WS_OVERLAPPEDWINDOW,
/* default window */
CW_USEDEFAULT,
/* Windows decides the position */
CW_USEDEFAULT,
/* where the window ends up on the screen */
544,
/* The programs width */
375,
/* and height in pixels */
HWND_DESKTOP,
/* The window is a child-window to desktop */
LoadMenu(hThisInstance, "Menú"),/* menú llamado del recurso win003.rc*/
hThisInstance,
/* Program Instance handler */
NULL
/* No Window Creation data */
);
Visualización de la ventana:
ShowWindow(hwnd, nFunsterStil);
Bucle de mensajes
Este es el núcleo de la aplicación, como se ve en el programa permanece en este bucle mientras la función
GetMessage retorne con un valor TRUE si retorna cero sale de la aplicación.
while(GetMessage(&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
/* Translate virtual-key messages into character messages */
DispatchMessage(&messages);
/* Send message to WindowProcedure */
}
La función TranslateMessage se usa para traducir los mensajes de teclas virtuales a mensajes de carácter. Los
mensajes traducidos se reenvían a la lista de mensajes del proceso, y se recuperarán con las siguientes
XI - 5
llamadas a GetMessage. La función DispatchMessage envía el mensaje al procedimiento de ventana, donde
será tratado adecuadamente.
El procedimiento de ventana
Cada ventana tiene una función asociada, esta función se conoce como procedimiento de ventana, y es la
encargada de procesar adecuadamente todos los mensajes enviados a una determinada clase de ventana. Es la
responsable de todo lo relativo al aspecto y al comportamiento de una ventana.
Normalmente, estas funciones están basadas en una estructura "switch" donde cada "case" corresponde aun
determinado tipo de mensaje. Esta función es llamada por la función del API DispatchMessage().
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message,WPARAM wParam LPARAM )
•
•
•
•
hwnd es el manipulador de la ventana a la que está destinado el mensaje.
msg es el código del mensaje.
wParam es el parámetro de tipo palabra asociada al mensaje.
lParam es el parámetro de tipo doble palabra asociada al mensaje.
Podemos considerar este prototipo como una plantilla para crear nuestros propios procedimientos de ventana.
El nombre de la función puede cambiar, pero el valor de retorno y los parámetros deben ser los mismos. El
miembro lpfnWndProc de la estructura WNDCLASS es un puntero a una función de este tipo, esa función es
la que se encargará de procesar todos los mensajes para esa clase de ventana. Cuando registremos nuestra
clase de ventana, tendremos que asignar a ese miembro el puntero a nuestro procedimiento de ventana.
Ya que esta función se encuentra fuera de la función Winmain debemos declarar algunas variables que se
usaran a lo largo de la aplicación:
•
•
Declaramos una variable tipo puntero a carácter la cual posee la dirección y el nombre de archivo:
char* WAV="c:\tdiii\tmp.wav";
Declaro como static las variables para el diálogo:
static HINSTANCE hInstance;
static DATOS Datos;
static INDATOS inDatos;
Manipulador de mensajes:
La estructura swich tiene la siguiente forma en donde cada case corresponde a un mensaje:
switch (message)
{
case WM_CREATE:
*
*
*
return 0;
break;
case WM_COMMAND:
*
*
*
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
XI - 6
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
WM_DESTROY es el mensaje que se envía a una ventana cuando se recibe un comando de cerrar, ya sea por
menú o mediante el icono de aspa en la esquina superior derecha de la ventana.
Este mensaje sólo sirve para informar a la aplicación de que el usuario tiene la intención de abandonar la
aplicación, y le da una oportunidad de dejar las cosas en su sitio: cerrar ficheros, liberar memoria, guardar
variables, etc. Incluso, la aplicación puede decidir que aún no es el momento adecuado para abandonar la
aplicación. En este caso, efectivamente cierra la aplicación, y lo hace enviándole un mensaje WM_QUIT,
mediante la función PostQuitMessage.
El resto de los mensajes se procesan en el caso "default", y simplemente se cede su tratamiento a la función
del API que hace el proceso por defecto para cada mensaje, DefWindowProc.
Este es el camino que sigue el mensaje WM_QUIT cuando llega, ya que el proceso por defecto para este
mensaje es cerrar la aplicación.
Menús
Un menú: se trata de una ventana, del tipo pop-up, que contiene una lista de comandos u opciones entre las
cuales el usuario puede elegir.
Cuando se usan en una aplicación, normalmente se agrupan varios menús bajo una barra horizontal, dividida
en varias zonas o ítems.
Cada ítem de un menú, (salvo los separadores y aquellos que despliegan nuevos menús), tiene asociado un
identificador, este identificador se declara en el archivo cabecera ids.h. El valor de ese identificador se usará
por la aplicación para saber qué opción se activó por el usuario, y decidir las acciones a tomar en
consecuencia.
Respondiendo a los mensajes del menú
Las activaciones de los menús se reciben mediante un mensaje WM_COMMAND. Para procesar estos
mensajes, si sólo podemos recibir mensajes desde un menú, únicamente nos interesa la palabra de menor peso
del parámetro wParam del mensaje.
switch (message)
{
case WM_CREATE:
/* Inicialización de los datos de la aplicación */
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
strcpy(Datos.Texto, "c:\\tdiii\\tmp.wav"); //Copio el nom, de arch. a la estructura
strcpy(Nombre,Datos.Texto); //copio de la estructura a la variable Nombre
inDatos.Numero = MilliSeconds; // asigno el valor de MilliSeconds al parámetro de la estructura
return 0;
break;
case WM_COMMAND:
switch(LOWORD(wParam)) //la macro LOWORD para extraer el identificador del ítem del
//parámetro wParam.
{
case CM_ADQ: // ** MENU ** --> GRABAR
//Muestro el tiempo de adquisición
DialogBoxParam(hInstance, "Dialogo2", hwnd, DlgProc2, MilliSeconds);
//función grabar
recordWAVEFile(hwnd, MilliSeconds); //llamo a la fc grabar
/* Msg adquisición terminada */
MessageBox(hwnd, "Adquisición terminada", "Adquisidor", MB_OK);
XI - 7
break;
case CM_REP:
// ** MENU ** --> REPRODUCIR
/* Rutina de REPROPDUCCION */
playWaveFile(hwnd, Nombre);
/* Msg reproducción terminada */
MessageBox(hwnd, "Reproducción terminada", "Adquisidor", MB_OK);
break;
case CM_SALIR: // ** MENU ** --> SALIR
PostQuitMessage(0); /* envía un mensaje WM_QUIT a la cola de mensajes */
break;
case CM_ARCH: // MENU -> config -> arch
DialogBoxParam(hInstance, "Dialogo3", hwnd, DlgProc3, (LPARAM)&Datos);
strcpy(Nombre,Datos.Texto);
MessageBox(hwnd, "Esta fc. no esta incluida", "Adquisidor", MB_OK);
break;
case CM_TIEMPO: // MENU -> config -> tiempo
DialogBoxParam(hInstance, "Dialogonum", hwnd, DlgProcnum, (LPARAM)&inDatos);
MilliSeconds = inDatos.Numero; //cargo el entero con el valor de la estructura
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
/* envía un mensaje WM_QUIT a la cola de mensajes*/
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
El mensaje WM_CREATE tiene como parámetro en lParam un puntero a una estructura CREATESTRUCT
que contiene información sobre la ventana. En nuestro caso sólo nos interesa el campo hInstance.
Funciones de grabación y reproducción:
Estas funciones realizan la grabación y reproducción de archivos WAVE, cada una de las funciones aquí
utilizadas fueron descriptas en el Capítulo 11, MCI de Windows.
Función Grabar:
El prototipo de la función es el siguiente:
DWORD recordWAVEFile(HWND hMainWnd, DWORD dwMilliSeconds)
En donde:
• HWND hMainWnd, es el tipo de ventana.
• DWORD dwMilliSeconds, es el tiempo de adquisición en milisegundos.
Definición de variables:
UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;
MCI_RECORD_PARMS mciRecordParms;
MCI_SAVE_PARMS mciSaveParms;
MCI_PLAY_PARMS mciPlayParms;
XI - 8
Abre un dispositivo de audio de forma de onda con un nuevo archivo para grabar utilizo el archivo adq.wav,
este archivo solo posee las cabeceras de una archivo WAVE.
mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "adq.wav";
Verifico si el dispositivo abrió correctamente:
if (dwReturn = mciSendCommand(0, MCI_OPEN,
MCI_OPEN_ELEMENT | MCI_OPEN_TYPE,
(DWORD)(LPVOID) &mciOpenParms))
{
// Falla al abrir el dispositivo; devuelve error.
MessageBox(hMainWnd, "ERROR apertura ID", "Adquisidor", MB_OK);
return (dwReturn);
}
Si el dispositivo abrió con éxito; obtengo el ID al dispositivo.
wDeviceID = mciOpenParms.wDeviceID;
Ya nos encontramos en condiciones de iniciar la grabación con el tiempo de adquisición ya antes previsto.
mciRecordParms.dwTo = dwMilliSeconds;
if (dwReturn = mciSendCommand(wDeviceID, MCI_RECORD,
MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &mciRecordParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "Adquisición exitosa", "Adquisidor", MB_OK);
return (dwReturn);
}
Ejecuta la grabación para verificar que sea correcta.
MessageBox(hMainWnd, "Ejecuto la adq", "Adquisidor", MB_OK);
mciPlayParms.dwFrom = 0L;
if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY,
MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
return (dwReturn);
}
Se esta en condiciones de guardar el archivo con un nombre por defecto.
if (MessageBox(hMainWnd, "Guardar la adq?",
"", MB_YESNO) == IDNO)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
return (0);
}
// Guardo la adquisición con el nom de arch.
mciSaveParms.lpfilename = "temp.wav";
if (dwReturn = mciSendCommand(wDeviceID, MCI_SAVE,
MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &mciSaveParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "ERROR no se Guardo", "Adquisidor", MB_OK);
return (dwReturn);
}
XI - 9
Una vez finalizado todo el proceso debo finalizar el dispositivo y retornar un valor a la aplicación que llamo a
esta función.
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0); // cierro el dispositivo antes de salir
return (0);
Función Reproducir:
El prototipo de la función es el siguiente:
DWORD playWaveFile(HWND hMainWnd, LPSTR lpstrNombreFichero)
En donde:
• HWND hMainWnd, es el tipo de ventana
• LPSTR lpstrNombreFichero, es un puntero con el nombre del archivo a reproducir.
Definición de variables:
UINT wIDDispositivo;
DWORD dwRetorno;
MCI_OPEN_PARMS mciOpenParms;
MCI_PLAY_PARMS mciPlayParms;
Abrimos dispositivo, indicando tipo de archivo y fichero, en este caso es “Temp.wav”:
mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "temp.wav";
Una ves indicado el tipo de fichero y archivo debemos obtener el id del dispositivo.
MessageBox(hMainWnd, "Comienzo de la Reproducción", "Adquisidor", MB_OK);
if (dwRetorno = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID)&mciOpenParms))
{
MessageBox(hMainWnd, "ERROR en apertura", "Adquisidor", MB_OK);
return (dwRetorno); //Error en la apertura
}
//Apertura correcta. Obtenemos el identificador
wIDDispositivo = mciOpenParms.wDeviceID;
MessageBox(hMainWnd, "Apertura OK, ID OK", "Adquisidor", MB_OK);
Se inicia la reproducción.
mciPlayParms.dwFrom = 0L;
if (dwRetorno = mciSendCommand(wIDDispositivo, MCI_PLAY,
MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wIDDispositivo, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "ERROR reproducción", "Adquisidor", MB_OK);
return (dwRetorno);
}
Terminada la reproducción finalizamos el dispositivo.
mciSendCommand(wIDDispositivo, MCI_CLOSE, 0, 0); // cierro el dispositivo antes de salir
return (0);
XI - 10
Funciones de diálogo
Función Imprimir diálogo(Imprime en pantalla en tiempo de adquisición)
El procedimiento de la función es el siguiente:
BOOL CALLBACK DlgProc2(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
En donde:
• HWND hDlg, identifica el cuadro de diálogo y es el manipulador de la ventana a la que está
destinado el mensaje.
• UINT msg, es el código del mensaje
• WPARAM wParam, es el parámetro de tipo palabra asociado al mensaje
• LPARAM lParam, es el parámetro de tipo doble palabra asociado al mensaje
El procedimiento de diálogo debe retornar con un valor no nulo si procesa el mensaje y cero si no lo hace.
Cuando responde a un mensaje WM_INITDIALOG, el procedimiento debe retornar cero si llama a la función
SetFocus para poner el foco a uno de los controles del cuadro de diálogo. En otro caso, debe
retornar un valor distinto de cero, y el sistema pondrá el foco en el primer control del diálogo que pueda
recibirlo.
{
char texto[25];
switch (msg) /* manipulador del mensaje */
{
case WM_INITDIALOG:
sprintf(texto, "T. de adq. (ms): %d", lParam);
SetWindowText(GetDlgItem(hDlg, TEXTO), texto);
return TRUE;
case WM_COMMAND:
EndDialog(hDlg, FALSE);
return TRUE;
}
return FALSE;
Hemos usado la función estándar “sprintf” para conseguir un texto estático a partir del parámetro “lParam”.
Posteriormente, usamos ese texto para modificar el control estático “TEXTO”. La función “SetWindowText”
se usa para cambiar el título de una ventana, pero también sirve para cambiar el texto de un control estático.
Función diálogo “Nombre de archivo”
Podemos introducir y modificar texto en el cuadro de diálogo, pero no podemos asignar valores iniciales al
control de edición ni tampoco podemos hacer que la aplicación tenga acceso al texto introducido por el
usuario.
Lo primero que tenemos que tener es algún tipo de variable que puedan compartir los procedimientos de
ventana de la aplicación y el del diálogo. En nuestro caso se trata sólo de una cadena. Se trata de crear una
estructura con todos los datos que queremos que el procedimiento de diálogo comparta con el procedimiento
de ventana, al declaración de esta estructura se define como variable global.
El procedimiento de la función es el siguiente:
BOOL CALLBACK DlgProc3(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
Existe un modo de pasar parámetros al cuadro de diálogo, usando la función “DialogBoxParam”, a través del
parámetro “lParam”. Aunque esta opción nos limita a valores enteros, y sólo permite pasar valores al
procedimiento de diálogo, en realidad se puede usar para pasar valores en ambos sentidos, bastará con enviar
un puntero en lugar de un entero. Para ello haremos un llamado del puntero al tipo “LPARAM”. Dentro del
procedimiento de diálogo haremos otro llamado de “LPARAM” al puntero. Esto nos permite declarar la
variable que contiene los datos dentro del procedimiento de ventana.
XI - 11
Ahora tenemos que hacer que se actualice el contenido del control “edit” al abrir el cuadro de diálogo.
El lugar adecuado para hacer esto es en el proceso del mensaje “WM_INITDIALOG”.
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, ID_TEXTO, EM_LIMITTEXT, 80, 0L);
Datos = (DATOS *)lParam;
SetDlgItemText(hDlg, ID_TEXTO, Datos->Texto);
SetFocus(GetDlgItem(hDlg, ID_TEXTO));
return FALSE;
Existen dos llamadas a dos funciones del API. La primera es a SendDlgItemMessage, que envía un mensaje a
un control. En este caso se trata de un mensaje EM_LIMITTEXT, que sirve para limitar la longitud del texto
que se puede almacenar y editar en el control edit. Es necesario que hagamos esto, ya que el texto que puede
almacenar nuestra estructura de datos está limitado a 80 caracteres.
También hemos añadido una llamada a la función SetDlgItemText, que cambia el contenido del texto en el
interior de un control edit.
Al pulsar el botón de aceptar, el dato de nuestra aplicación se actualiza con el texto que hay en el control edit.
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hDlg, ID_TEXTO, Datos->Texto, 80);
EndDialog(hDlg, FALSE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
Para eso hemos añadido la llamada a la función GetDlgItemText, que es simétrica a SetDlgItemText.
Función diálogo “Tiempo de adquisición”
Para la edición de números, el API tiene previstas algunas constantes y funciones. Igual que el caso anterior
debemos crear una estructura con un parámetro, pero en este caso debe ser entero.
El prototipo de la función es el siguiente:
BOOL CALLBACK DlgProcnum(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
Para actualizar el contenido del control edit al abrir el cuadro de diálogo se realiza en el proceso del mensaje:
WM_INITDIALOG:
switch (msg) /* manipulador del mensaje */
{
case WM_INITDIALOG:
datos = (INDATOS *)lParam; //el dato contenido en el estructura lo paso a dato
SetDlgItemInt(hDlg, ID_NUMERO, (UINT)datos->Numero, FALSE);//cambia el contenido del
control a un control numérico
SetFocus(GetDlgItem(hDlg, ID_NUMERO));
return FALSE;
En este caso no es necesario limitar el texto que podemos editar en el control, ya que las propias funciones del
API se encargan de capturar y convertir el contenido del control en un número.
SetDlgItemInt, cambia el contenido de un control edit con un valor numérico.
XI - 12
Para leer el contenido cuando procesemos el comando generado al pulsar el botón de "Aceptar" añadimos la
llamada a la función GetDlgItemInt, que es simétrica a SetDlgItemInt. El proceso difiere del usado para
capturar cadenas, ya que en este caso la función nos devuelve el valor numérico del contenido del control edit.
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
numero = GetDlgItemInt(hDlg, ID_NUMERO, &NumeroOk, FALSE);//lee el contenido del control
if(NumeroOk)
{
datos->Numero = numero;
EndDialog(hDlg, FALSE);
}
else
MessageBox(hDlg, "Número no válido", "Error", MB_ICONEXCLAMATION | MB_OK);
break;
case IDCANCEL: EndDialog(hDlg, FALSE);
break;
}
También devuelve un parámetro que indica si ha habido algún error durante la conversión. Si el valor de ese
parámetro es TRUE, significa que la conversión se realizó sin problemas, si es FALSE, es que ha habido un
error. Si nuestro programa detecta un error visualizará un mensaje de error y no permitirá abandonar el cuadro
de diálogo.
Pero si ha habido un error, el valor de retorno de GetDlgItemInt será cero. El flag
BM_ICONEXCLAMATION en el MessageBox, añade un icono al cuadro de mensaje y el sonido
predeterminado para alertar al usuario.
Fichero cabecera “ids.h”
este fichero cabecera contiene todas las declaraciones de identificadores, tanto para el menú como para los
mensajes.
Constantes del menú pop-up “Adquirir”:
• #define CM_ADQ 100, se define la opción Adquirir del menú.
• #define CM_REP 101 , se define la opción Reproducir del menú.
• #define CM_SALIR 102 , se define la opción Salir del menú.
Constantes del menú pop-up “Configurar”:
• #define CM_ARCH 103, se define la opción Nombre de archivo del menú.
• #define CM_TIEMPO 104, se define la opción Tiempo de adquisición del menú.
Constantes para los diálogos:
• #define TEXTO 106
• #define CM_DIALOGO 107
• #define ID_TEXTO 108, constante para la edición de texto.
• #define ID_NUMERO 110, constante para la edición de enteros.
Ficheros de recursos
Una forma de implementar menús es por medio de un fichero de recursos, para crear o modificar menús
durante la ejecución de la aplicación.
1. Usaremos siempre etiquetas como identificadores para los ítems de los menús, y nunca valores numéricos
literales.
2. Crearemos un fichero de cabecera con las definiciones de los identificadores, en nuestro caso se llamará
"ids.h".
XI - 13
3. Incluiremos este fichero de cabecera tanto en el fichero de recursos, como en el del código fuente de
nuestra aplicación.
Dev-C++, posee un editor de recursos: File New Resource File. En el cual editaremos nuestro recurso.
En nuestro recurso hemos incluido un icono para la aplicación de la siguiente forma:
win003 ICON "c:\\tdiii\\Multimedia.ico"
En un recurso se debe incluir los ficheros de cabecera utilizados:
#include <windows.h>
#include "ids.h"
En un fichero de recursos podemos crear toda la estructura de un menú.
Menú
Menu MENU
BEGIN
POPUP "&Adquirir"
BEGIN
MENUITEM "&Adquirir", CM_ADQ
MENUITEM SEPARATOR
MENUITEM "&Reproducir", CM_REP
MENUITEM SEPARATOR
MENUITEM "&Salir", CM_SALIR
END
POPUP "&Configurar"
BEGIN
MENUITEM "&Archivo", CM_ARCH
MENUITEM SEPARATOR
MENUITEM "&Tiempo", CM_TIEMPO
END
END
Definimos el menú mediante una cadena identificadora, sin comillas, seguida de la palabra MENU. Entre las
palabras BEGIN y END podemos incluir items, separadores u otras columnas. Para incluir columnas usamos
una sentencia del tipo POPUP seguida de la cadena que se mostrará como texto en el menú. Cada
POPUP se comporta del mismo modo que un MENU.
Los ítems se crean usado la palabra MENUITEM seguida de la cadena que se mostrará en el menú, una coma,
y el comando asignado a ese ítem, que puede ser un número entero, o, como en este caso, una macro definida.
Los separadores se crean usando MENUITEM seguido de la palabra SEPARATOR.
El símbolo & , por ejemplo "&Adquirir" indica que la siguiente letra puede usarse para activar la opción del
menú desde el teclado, usando la tecla [ALT] más la letra que sigue al símbolo &. Para indicar eso, en
pantalla, esa letra se muestra subrayada.
Diálogos.
Los cuadros de diálogo son la forma de ventana de comunicación entre una aplicación Windows y el usuario.
Para facilitar la tarea del usuario a la hora de introducir datos, existen varios tipos de controles, cada uno de
ellos diseñado para un tipo específico de información. Los más comunes son los "static", "edit", "button",
"listbox", "scroll", "combobox", "group", "checkbutton", "ratiobutton", "updown", "listview", "treeview",
"gauge", "tab" y "trackbar".
Un cuadro de diálogo es una ventana normal, aunque con algunas peculiaridades. También tiene su
procedimiento de ventana (procedimiento de diálogo), pero puede devolver un valor a la ventana que lo
invoque. Igual que los menús, los cuadros de diálogo se pueden construir durante la ejecución o a partir de un
fichero de recursos.
Dialogo2 DIALOG
0, 0, 118, 48
// Puntos de inicio y fin
XI - 14
STYLE DS_MODALFRAME | //se creará un cuadro de diálogo con un marco de dialog-box modal
que puede combinarse con una barra de título y un menú de sistema.
WS_POPUP |
//crea una ventana "pop-up".
WS_VISIBLE |
//crea una ventana inicialmente visible.
WS_CAPTION CAPTION
//crea una ventana con una barra de título,
"Adquisidor"
//Nombre de la ventana.
FONT 8, "Helv"
// Fuente y tamaño de la letra
BEGIN
CONTROL
// palabra clave que indica que vamos a definir un control.
"Tiempo (ms):",
//texto que se mostrara
TEXTO,
//id es el identificador del control.
"static",
// class es la clase de control, en nuestro caso "static".
SS_LEFT |
//indica un simple rectángulo y el texto suministrado se alinea en su
//Interior a la izquierda.
WS_CHILD |
//crea el control como una ventana hija.
WS_VISIBLE,
//crea una ventana inicialmente visible.
8, 9, 84, 8
// coordenadas del control.
CONTROL "Aceptar",
IDOK,
//esta definido dentro de windows.h
"button",
//class es la clase de control, en nuestro caso "button".
BS_PUSHBUTTON | //crea un botón corriente que envía un mensaje WM_COMMAND
BS_CENTER |
// centra el texto horizontalmente en el área del botón.
WS_CHILD |
WS_VISIBLE |
WS_TABSTOP,
// define un control que puede recibir el foco del teclado cuando el
//Usuario pulsa la tecla TAB.
56, 26, 50, 14
END
Dialogo3 DIALOG //Nombre de arch "mensaje de guardar"
0, 0, 118, 48
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION
"Adquisidor" FONT 8, "Helv"
BEGIN
CONTROL "Archivo:", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 9, 28, 8
CONTROL "",
ID_TEXTO, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
36, 9, 76, 12
CONTROL "Aceptar", IDOK, "BUTTON",BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 8, 26, 45, 14
CONTROL "Cancelar", IDCANCEL, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 61, 26, 45, 14
END
Dialogonum DIALOG //tiempo de adq ES_NUMBER permite la edición de enteros
0, 0, 118, 48 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Adquisidor" FONT 8, "Helv"
BEGIN
CONTROL "Tiempo (ms):", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 8, 9, 28, 8
CONTROL "", ID_NUMERO, "EDIT", ES_NUMBER | ES_LEFT | WS_CHILD | WS_VISIBLE |
WS_BORDER | WS_TABSTOP, 36, 9, 76, 12
CONTROL "Aceptar", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 8, 26, 45, 14
CONTROL "Cancelar", IDCANCEL, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 61, 26, 45, 14
END
XI - 15
Estructura del Proyecto.
El proyecto incluye los siguientes códigos fuente:
• Cabecera ids.h
• WinMenu.c
• Recurso win003.rc
Para ver el código fuente completo remitirse al Apéndice A
Nota:
Para el correcto funcionamiento de la aplicación se
deben incluir en el proyecto las librerías utilizadas,
recursos, etc. Para ello se accede a Project Project
options y se agrega la librería “libwinmm.a” y el
recurso utilizado “win003.rc” antes de realizar la
compilación. La carpeta que contiene el código fuente
debe tener incluidos los siguientes archivos (algunos
los crea el compilador por ejem.: los archivos con
extensión “o” y “obj”).
XI - 16
Manejo de la aplicación “Adquisidor.exe”.
Una vez ejecutada la aplicación, como primer paso, se debe configurar el tiempo de adquisición en
milisegundos, la aplicación ya trae, por defecto, configurado un tiempo de 1000ms.
También se puede cambiar el nombre del archivo en donde se almacena la adquisición , que por defecto
es tmp.wav, pero no esta disponible en esta aplicación, solo se presenta para desarrollos futuros.
Seleccionamos la opción “Tiempo”del
menú “Configurar”.
El tiempo de adquisición esta comprendido
entre 1 ms y 1000000000 ms. Si el número
ingresado esta fuera de rango nos mostrará
un error.
Una vez realizada la configuración previa estamos en condiciones de realizar la adquisición para ello
seleccionamos “Adquirir” del menú “Adquirir”
Una vez seleccionado visualizaremos el tiempo
durante el cual se llevara a cabo la adquisición.
Presionando “Aceptar” la aplicación nos informa del
comienzo de la adquisición.
Nuevamente presionando el botón “Aceptar”
comienza el proceso de adquisición, durante el
tiempo seleccionado.
Una vez finalizada, la aplicación permite reproducir
la adquisición, con el fin de verificar si esta correcta.
Presionando el botón “Aceptar” comienza la
reproducción.
Si la adquisición obtenida es la deseada estamos en
condiciones de guardar la adquisición, la aplicación
utiliza un nombre por defecto para guardar la
adquisición, este nombre es “tmp.wav” que se
encuentra en la misma carpeta donde se tiene la
aplicación.
XI - 17
Al finalizar todo el proceso de adquisición y
guardado, la aplicación nos informa de la
finalización de dicha adquisición.
Otra particularidad de nuestra aplicación es que nos permite reproducir los archivos adquiridos, para ello
se accede a la opción “Reproducir” del menú “Adquirir”
Una vez seleccionado, la aplicación, nos informa del
comienza de la reproducción.
Al presionar “Aceptar” se presenta una serie de
información, como que la apertura del archivo fue
correcta y que se obtuvo correctamente el
identificador del dispositivo, solo vasta con
presionar “Aceptar” para comenzar la reproducción.
Una vez finalizada la reproducción, se nos informa
de la finalización por medio de un mensaje.
Tanto en la grabación como en la reproducción, en
caso de error se podrá visualizar el siguiente
mensaje.
Para salir de la aplicación se accede al menú “Adquirir” y se selecciona la opción “Salir” o presionado la
cruz “X” en el borde superior derecho.
Bibliografía:
Win API. Aplicaciones con API 32. Julio de 2004, Salvador Pozo Coronado http:\winapi.conclase.net
Microsoft Windows SDK Multimedia Programmer’s Reference.
Programación de sonido con los comandos MCI, Sergi Jordà Puig, Audio digital y MIDI, Guías Monográficas
Anaya Multimedia, Madrid 1997
Materia Integrada:
Informática II. (En nuestro proyecto se trataron la mayoría de los temas de la cátedra )
Consulta realizada al Ing. Vota Ramiro sobre: compilación, manejo de funciones especiales.
Bibliografía de la materia:
Turbo C/C++, Herbert Schild (Los temas aquí tratados eran de nuestro conocimiento lo cual no fue necesario
el uso de esta bibliografía).
El lenguaje de programación C, Kernighan y Ritchie. (Los temas de consulta son: “proposiciones”,
“punteros”, “funciones”).
XI - 18
Capítulo 12
Transformadas de Fourier y la DFT.
Introducción.
Los métodos de Fourier son comúnmente usados para el análisis de señales y el diseño de sistemas en
telecomunicaciones modernas, radar, y procesamiento de imágenes.
Los métodos clásicos de Fourier tales como la serie de Fourier y la integral de Fourier son usados para señales
y sistemas de tiempo continuo (CT); es decir sistemas en los que una señal característica s(t) , esta definida
en todos los valores de t sobre un continuo –inf.<t<inf. Un conjunto mas recientemente desarrollado de
métodos de Fourier, incluyendo la transformada de fourier de Tiempo Discreto (DTFT) y la Transformada
Discreta de Fourier (DFT ) son extensiones de conceptos básicos de Fourier que se aplican a señales en
tiempo discreto (DT).
Una señal DT característica s[n], esta definida solamente para valores de n donde n es un entero en el rango –
inf<n<inf.
Clases CT y DT de métodos de Fourier
Un énfasis particular sobre la relación entre estas dos clases.
La relación entre los dominios CT y DT esta caracterizada por las operaciones de muestreo y reconstrucción.
Si s*(t), denota una señal s(t) que ha sido uniformemente muestreada cada T segundos, luego la
representación matemática de s*(t) esta dada por:
∞
s*(t)=
∑ s(t )δ (t − nT )
(ec. 1.2.1)
n = −∞
Donde δ(t) es una función impulso CT definida cero para todo t distinto de cero, indefinida en t=0, y teniendo
área unidad al integrar desde t=-inf. a t=+inf.
Dado que los únicos lugares donde el producto dentro de la sumatoria anterior, no es idénticamente igual a
cero, son los instantes de muestreo, s(t) en la ecuación (1) puede ser remplazado con s(nT).
Luego:
∞
s*(t)=
∑ s(nt ) * δ (t − nT )
(ec. 1.2.2)
n = −∞
el modelo de muestreo CT, s*(t) consiste de una secuencia de funciones impulso CT uniformemente
espaciadas a intervalos de T segundos y escalados por los valores de la señal s(t) en los instantes de muestreo.
En el dominio DT, el modelo de muestreo es simplemente la secuencia definida al tomar los valores de s(t)
en los instantes de muestreo:
s[n ] = s (t ) |t =nT
(ec. 1.2.3)
En contraste a s*(t), que no esta defina para los instantes de muestreo, s[n] está bien definida en los instantes
de muestreo.
Así, está ahora claro, que s*(t) y s[n] son modelos diferentes pero equivalentes del proceso de muestreo en
los dominios CT y DT, respectivamente. Sus equivalencias esta establecida por el hecho de que tienen el
mismo espectro en el dominio de Fourier, y la señal CT subyacente a partir de la cual s*(t) y s[n] son
derivadas, puede ser recuperada por cualquiera de las dos representaciones de muestreo, bajo la condición de
una razón de muestreo lo suficientemente grande usada en la operación de muestreo.
XII - 1
Transformada clásica de Fourier para señales de tiempo continuo.
Definición (CTFT):
∞
s(t)= (1 / 2π )
∫ S ( jω )e
jωt
dω
(ec.1.3.1)
−∞
∞
S ( jω ) =
∫ s(t )e
− jωt
dt
(ec. 1.3.2)
−∞
A menudo (ec.1.3.1)es llamada la integral de Fourier y (ec.1.3.2) es simplemente llamada la transformada de
Fourier. Un par de transformación s (t ) ↔ S ( jω ) representa un mapeo (invertible) uno a uno, mientras que
s(t) satisface condiciones que garantizan que la integral de Fourier converge.
El espectro de Fourier del modelo de muestreo de tiempo continúo.
Porque el modelo de muestreo CT s*(t) ,dado en (ec. 1.2.1), es por si mismo una señal CT, es apropiado
aplicar la CTFT para obtener una expresión del espectro de la señal muestreada:
∞
F {s * (t )} = F { ∑ s(t ).δ (t − nT )} =
n = −∞
∞
∑ s(nT )e
− jωTn
(ec. 1.4.1)
n = −∞
Este resultado es comparado más tarde con el resultado de la operación sobre el modelo de muestreo DT,
designado como s[n], de la transformada de Fourier DT para ilustrar que los dos modelos de muestreo tienen
el mismo espectro.
La transformada de Fourier de tiempo discreto.
La transformada de Fourier de tiempo discreto (DTFT) puede ser obtenida mediante el uso del modelo de
muestreo DT y considerando que la relación obtenida en (ec 1.4.1) sea la definición de la DTFT. Sea T=1 de
tal manera que el periodo de muestreo es removido de las ecuaciones y sea Ω=ωT una frecuencia
normalizada, el par DTFT se define:
S (Ω) =
∞
∑ s[n].e
− jΩn
n = −∞
(ec.1.5.1)
π
s[n]=(1/2π)
∫π S (Ω).e
jnΩ
dΩ
(ec. 1.5.2)
−
El espectro S(Ω) es periódico en Ω con periodo 2π.
Comparando (ec. 1.4.1) con (ec 1.5.1), y notando que Ω=ωT, se establece que:
DTFT{s[n]} =F{s*(t)}|ω=Ω/T
Donde s[n]=s(t)|t=nT..Esto demuestra que el espectro de s*(t), como calculado por la transformada de Fourier
CT, es idéntico al espectro de s[n] calculado mediante la DTFT.
XII - 2
Relación entre el espectro de tiempo continuo y discreto.
Debido a que las señales DT a menudo se originan por muestreo de señales CT, es importante desarrollar la
relación entre el espectro original de la señal CT y el espectro de la señal DT que resulta.
En efecto:
Se tiene
F{s*(t)}=F{ s (t )
∞
∞
n = −∞
n = −∞
∑ δ (t − nT ) }= (1 / 2π ) S ( jω ) ⊗ F { ∑ δ (t − nT )}
Expandiendo en series CT de Fourier el tren de impulsos (de periodo T)
∞
S * ( jω ) = F {s * (t )} = (1 / 2π ) S ( jω ) ⊗ F { ∑ (1 / T ).e j ( 2π / T ) nt }
n = −∞
= (1 / 2π )
∞
∑ S ( jω ) ⊗ (2π / T )δ (ω − (2π / T )n)
n = −∞
El resultado es :
∞
∞
n = −∞
n = −∞
S * ( jω ) = (1 / T ) ∑ S ( j (ω − ( 2π / T )n )) = (1 / T ) ∑ S ( j (ω − nωs ))
Donde ωs=(2π/T) es la frecuencia de muestreo expresada en radianes por segundo.
Pero el segundo miembro de la ecuación anterior puede ponerse asì:
(1/T)
∞
∞
n = −∞
n = −∞
∑ S ((Ω / T ) − (2π / T )n) = (1 / T ). ∑ S ((Ω − 2π .n) / T )
Esto es S*(ω)=F{s*(t)} consiste de un numero infinito de replicas del espectro CT S(ω)=F{s(t)} posicionadas
a intervalos de (2π/T) sobre el eje ω o a intervalos de 2π sobre el eje Ω.Note que si S(ω) es de banda limitada
con un ancho de banda ωc, y si T se elije suficientemente pequeño de modo tal que ωs>2 ωc luego el espectro
DT es una copia de S(ω) (escalado por 1/T) en la banda base –π<Ω≤π.
La transformada discreta de Fourier (DFT).
Para obtener la DFT el dominio continuo de frecuencia de la DTFT es muestreado a en N puntos
uniformemente espaciados alrededor del circulo unitario en el plano Z, es decir en los puntos:
ωk=(2πk/N),k=0,1,…,N-1.El resultado es el par DFT definido por las ecuaciones siguientes:
N −1
S[k]=
∑ s[n ]e
− j 2πkn / N
k=0,1…N-1.
n =0
N −1
s[n ] = (1 / N ) ∑ S [k ]e j 2πkn / N
n=0,1,..,N-1
k =0
Materia Integradora.
Análisis de señales y sistemas. Tema: Transformada de Fourier.
XII - 3
Capítulo 13
FFT con MatLab
Introducción.
Para el análisis de espectro se utilizo el programa MatLab 6.5
Por simplicidad se copia el archivo WAVE, en nuestro caso Temp.wav, a la carpeta C:\MATLAB6p5\work
o se selecciona el path donde el adquisidor guarda el archivo..
Para poder comenzar con el análisis de la señal de audio adquirida con el programa “adquisidor.exe”, abrimos
el archivo M-File “procesamiento.m”.
Procesamiento.m
Como primer paso el programa carga el archivo “temp.wav” y devuelve los valores de las muestras en un el
vector Y y la frecuencia de muestreo en la variable Fs.
[Y,Fs]=wavread('temp.wav');
Luego reproduce el archivo de audio adquirido mediante la siguiente sentencia:
wavplay(Y,Fs)
Para poder graficar la señal en tiempo, necesitamos saber el tiempo de duración del archivo. Para ello,
primero obtenemos la cantidad de muestras tomadas y la guardamos en la variable muestras.
muestras=length(Y)
Teniendo la frecuencia de muestreo Fs y la cantidad de muestras , podemos inferir el tiempo de duración
como:
tf=muestras*1/Fs
Una vez obtenido el tiempo de duración, se necesitamos crear un vector de tiempos para poder graficar la
señal.
t=1/Fs:1/Fs:tf;
Teniendo el valor de cada muestra y el tiempo en que fue tomada cada una, graficamos:
figure(1)
plot(t,Y)
title('Señal')
xlabel('Tiempo (Seg)')
ylabel('Amplitud (v)')
grid
Para poder analizar el espectro de la señal tomada, necesitamos aplicar la transformada discreta de fourier
(DFT), ya que la señal no es de tiempo continuo, sino que es una señal muestreada. Para poder calcular la
DFT, usamos el algoritmo de calculo que se denomina FFT (transformada rápida de fourier)..
Para usar la FFT, primero vamos a determinar la cantidad de puntos que vamos a tomar para realizar la FFT.
Si tomamos en cuenta que la frecuencia de muestreo es de 22050 Hz, entonces el periodo de muestreo es de
1/22050=45,35 microsegundos. Si elegimos una cantidad de 8192 muestras, tenemos una ventana de tiempo
de 8192/22050=371ms.
N=8192;
XIII -
1
Calculamos la FFT.
X = fft(Y,N);
Calculamos el vector modulo de los valores de la FFT.
Xmodulo=abs(X);
Para poder graficar el espectro, calculamos el vector de frecuencias.
f=((Fs)*(1:N))/N;
Por último, graficamos:
figure(2)
plot(f,Xmodulo)
title('Espectro')
xlabel('Frecuencia (Hz)')
ylabel('Amplitud (mv)')
grid
Las líneas siguientes muestran la señal y el espectro en una misma figura:
figure(3)
subplot(2,1,1),plot(t,Y)
title('Señal')
xlabel('Tiempo (Seg)')
ylabel('Amplitud (v)')
grid
subplot(2,1,2),plot(f,Xmodulo)
title('Espectro')
xlabel('Frecuencia (Hz)')
ylabel('Amplitud (mv)')
grid
*Nota: el comando plot usa usa los valores discreto del vector de valor absoluto de los puntos de la FFT e
interpola valores para poder graficar. Una forma de visualizar las señales en tiempo discreto es usando el
comando :
figure(4)
stem(t,Y)
title('Señal')
xlabel('Tiempo (Seg)')
ylabel('Amplitud (v)')
grid
figure(5)
stem(f,Xmodulo)
title('Espectro')
xlabel('Frecuencia (Hz)')
ylabel('Amplitud (mv)')
grid
figure(6)
subplot(2,1,1),stem(t,Y)
title('Señal')
xlabel('Tiempo (Seg)')
ylabel('Amplitud (v)')
grid
subplot(2,1,2),stem(f,Xmodulo)
XIII -
2
title('Espectro')
xlabel('Frecuencia (Hz)')
ylabel('Amplitud (mv)')
grid
Para correr el programa solo hay que elegir la opción “Debug+Run”.
A modo de mostrar los resultados usamos una señal de 2,5 segundos de duración, mostrando una
aproximación en tiempo continuo y la real en tiempo discreto, las cuales coinciden.
En tiempo continuo.
XIII -
3
En tiempo discreto.
XIII -
4
Espectro continuo.
Espectro discreto.
Bibliografía:
Apuntes de clase. Técnicas digitales III.
Ayuda de MatLab.
XIII -
5
Apéndice A
Código Fuente del programa
Cabecera ids.h
/* *********** Fichero Cabecera ********** */
/* ****** identificadores de comandos **** */
/*Ctes del menú ADQ*/
#define CM_ADQ 100
#define CM_REP 101
#define CM_SALIR 102
/*Ctes del menú CONFIG*/
#define CM_ARCH 103
#define CM_TIEMPO 104
/*Ctes del menú ESPECTRO*/
#define CM_ESP 112
/*Ctes del menú AYUDA*/
#define CM_AYU 113
/* ****** identificadores de diálogo **** */
/* Cuadro de mensaje */
#define TEXTO 106
#define CM_DIALOGO 107
#define ID_TEXTO 108
#define ID_NUMERO 110
Winmenu.c
/***********************************************************/
/********* FICHEROS DE CABECERA ****************************/
/***********************************************************/
#include <windows.h> //cabecera de window
#include <mmsystem.h> // " multimedia
#include <stdlib.h>
#include <stdio.h>
#include "ids.h"
// cabecera del menu (declaración de ctes)
#pragma comment(lib, "winmm.lib")
/***********************************************************/
/********* DECLARACION DE FUNCIONES*************************/
/***********************************************************/
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);// Declaración del
procedimiento de ventana
/*declaración de la función de grabación y reproducción*/
DWORD playWaveFile(HWND, LPSTR);
//Paso a la función el manipulador de ventana
//y un puntero al archivo wav
DWORD recordWAVEFile(HWND, DWORD); //Paso a la función el manipulador de ventana
//y el tiempo de grabación en ms
/* Funciones de manejo de controles*/
XIII -
6
BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DlgProc3(HWND, UINT, WPARAM, LPARAM); //fc para control edit de daracteres
BOOL CALLBACK DlgProcnum(HWND, UINT, WPARAM, LPARAM);//fc para control edit numerico
/***********************************************************/
/********* VARIABLES GLOBALES ******************************/
/***********************************************************/
char szClassName[ ] = "Adquisidor"; // Nombre de la clase en una variable global
int MilliSeconds;
//tiempo de adquisición en ms
char Nombre[80];
//Nombre del archivo
typedef struct stDatos
{
char Texto[80];
} DATOS;
typedef struct inDatos
{
int Numero;
} INDATOS;
//Estructura de datos nombre del archivo
//Longitud del nombre de arch.
//Estructura de datos tiempo de muestreo
/***********************************************************/
/********* FUNCION MAIN ************************************/
/***********************************************************/
/* función winmain*/
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int
nFunsterStil)
{
/* Declaración: */
HWND hwnd;
/* manipulador para la ventana principal */
MSG messages;
/* variable para manipular los mensajes */
WNDCLASSEX wincl;
/* estructura para registrar la clase de ventana */
/*declaración previa del tiempo de adq*/
MilliSeconds = 1000;
/* Inicialización */
/* Estructura de la ventana */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
/* fc llamada por la ventana */
wincl.style = CS_DBLCLKS;
/* Catch double-clicks */
wincl.cbSize = sizeof(WNDCLASSEX);
/* Usa icono y puntero mouse por defecto */
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0;
/* No extra bytes after the window class */
wincl.cbWndExtra = 0;
/* structure or the window instance */
A-
7
/* Use light-gray as the background of the window */
wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
/* Register the window class, if fail quit the program */
if(!RegisterClassEx(&wincl)) return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx(
0,
/* Extended possibilites for variation */
szClassName,
/* Classname */
"Adquisidor de Datos ",
/* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT,
/* Windows decides the position */
CW_USEDEFAULT,
/* where the window ends up on the screen */
544,
/* The programs width */
375,
/* and height in pixels */
HWND_DESKTOP,
/* The window is a child-window to desktop */
LoadMenu(hThisInstance, "Menu"),/* menu llamado del recurso win003.rc*/
hThisInstance,
/* Program Instance handler */
NULL
/* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow(hwnd, nFunsterStil);
/* Bucle de mensaje */
/* Run the message loop. It will run until GetMessage( ) returns 0 */
while(GetMessage(&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
}
/* The program return-value is 0 - The value that PostQuitMessage( ) gave */
return messages.wParam;
/***********************************************************/
/********* FIN DE LA FUNCION MAIN **************************/
/***********************************************************/
/*---------------------------------------------------------*/
/***********************************************************/
/********* DECLARACION DE FUNCIONES*************************/
/***********************************************************/
/* Esta función es llamada por la función del API DispatchMessage()*/
LRESULT CALLBACK WindowProcedure(
HWND hwnd,
// Manipulador de ventana
UINT message,
// Mensaje
WPARAM wParam, // Parámetro palabra, varía
LPARAM lParam
// Parámetro doble palabra, varía
)
{
// DECLARACION DE VARIABLES
A-
8
char* WAV="c:\tdiii\tmp.wav"; //dirección del archivo wav
static HINSTANCE hInstance; // Variables para diálogo
static DATOS Datos;
//DATOS Datos;
static INDATOS inDatos;
//esturctura de tiempo de adq
//MANIPULADOR DE MENSAJES
switch (message)
/* manipulador del mensaje */
{
case WM_CREATE:
/* Inicialización de los datos de la aplicación */
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
strcpy(Datos.Texto, "c:\\tdiii\\tmp.wav"); //copio el nom de arch a la estructura
strcpy(Nombre,Datos.Texto); //copio de la escructura a la variable Nombre
inDatos.Numero = MilliSeconds; // asigno el valor de MilliSeconds al parametro de la estructura
return 0;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case CM_ADQ:
//*********************************************************
// ** MENU ** --> GRABAR
/* --->> */
/* ******** Rutina de grabación ********* */
DialogBoxParam(hInstance, "Dialogo2", hwnd, DlgProc2, MilliSeconds);
recordWAVEFile(hwnd, MilliSeconds); //llamo a la fc grabar
/* ******** MSN adquisicion terminada******** */
MessageBox(hwnd, "Adquisición terminada", "Adquisidor", MB_OK);
/* <<--- */
//*********************************************************
break;
case CM_REP:
//*********************************************************
// ** MENU ** --> REPRODUCIR
/* --->> */
/* ******** Rutina de REPROPDUCCION ********* */
playWaveFile(hwnd, Nombre);
/* ******** MSN reproducción terminada******** */
MessageBox(hwnd, "Reproducción terminada", "Adquisidor", MB_OK);
/* <<--- */
//*********************************************************
break;
case CM_SALIR: // ** MENU ** --> SALIR
PostQuitMessage(0); /* envía un mensaje WM_QUIT a la cola de mensajes */
break;
case CM_ARCH: // MENU -> config -> arch
DialogBoxParam(hInstance, "Dialogo3", hwnd, DlgProc3, (LPARAM)&Datos);
strcpy(Nombre,Datos.Texto);
A-
9
MessageBox(hwnd, "Esta fc. no esta incluida", "Adquisidor", MB_OK);
break;
case CM_TIEMPO: // MENU -> config -> tiempo
DialogBoxParam(hInstance, "Dialogonum", hwnd, DlgProcnum, (LPARAM)&inDatos);
MilliSeconds = inDatos.Numero; //cargo el entero con el valor de la estructura
break;
case CM_ESP: // MENU -> Espectro -> Obtener
MessageBox(hwnd, "Esta opción no esta disponible", "Adquisidor", MB_OK);
break;
case CM_AYU: // MENU -> AYUDA -> Programa
MessageBox(hwnd, "Realizado por: Benitez, Pablo -- Carranza, Rodrigo -- Curaratti, Nazareno",
"Adquisidor", MB_OK);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
/* envía un mensaje WM_QUIT a la cola de mensajes*/
break;
default:
/* for messages that we don't deal with */
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
/***********************************************************/
/*---------------------------------------------------------*/
/*---------------- FUNCION GRABAR -------------------------*/
/*---------------------------------------------------------*/
DWORD recordWAVEFile(HWND hMainWnd, DWORD dwMilliSeconds)
{
UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;
MCI_RECORD_PARMS mciRecordParms;
MCI_SAVE_PARMS mciSaveParms;
MCI_PLAY_PARMS mciPlayParms;
MessageBox(hMainWnd, "Comienzo de la adqisición", "Adquisidor", MB_OK);
// Abre un dispositivo de audio de forma de onda con un nuevo archivo para grabar.
mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "adq.wav";
if (dwReturn = mciSendCommand(0, MCI_OPEN,
MCI_OPEN_ELEMENT | MCI_OPEN_TYPE,
(DWORD)(LPVOID) &mciOpenParms))
{
// Falla al abrir el dispositivo; devuelve error.
MessageBox(hMainWnd, "ERROR apertura ID", "Adquisidor", MB_OK);
return (dwReturn);
}
A - 10
// El dispositivo abrió con éxito; asigno el ID al dispositivo.
wDeviceID = mciOpenParms.wDeviceID;
//Comiensa la grabación y graba para el número especificado de millisegundos.
mciRecordParms.dwTo = dwMilliSeconds;
if (dwReturn = mciSendCommand(wDeviceID, MCI_RECORD,
MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &mciRecordParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "Adquisición exitosa", "Adquisidor", MB_OK);
return (dwReturn);
}
// Ejecuta la grabación y pregunta para guardar el archivo
MessageBox(hMainWnd, "Ejecuto la adq", "Adquisidor", MB_OK);
mciPlayParms.dwFrom = 0L;
if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY,
MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
return (dwReturn);
}
if (MessageBox(hMainWnd, "Guardar la adq?",
"", MB_YESNO) == IDNO)
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
return (0);
}
// Guardo la adquisición con el nom de arch.
mciSaveParms.lpfilename = "temp.wav";
if (dwReturn = mciSendCommand(wDeviceID, MCI_SAVE,
MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &mciSaveParms))
{
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "ERROR no se Guardo", "Adquisidor", MB_OK);
return (dwReturn);
}
mciSendCommand(wDeviceID, MCI_CLOSE, 0, 0); // cierro el dispositivo antes de salir
return (0);
}
/***********************************************************/
/*---------------------------------------------------------*/
/*---------------- FUNCION REPRODUCIR----------------------*/
/*---------------------------------------------------------*/
DWORD playWaveFile(HWND hMainWnd, LPSTR lpstrNombreFichero)
{
// hWndNotifica es el Handle a la ventana que recibe la notificación
// lpstrNombreFichero es una cadena con el nombre del fichero
UINT wIDDispositivo;
DWORD dwRetorno;
MCI_OPEN_PARMS mciOpenParms;
A - 11
MCI_PLAY_PARMS mciPlayParms;
//Abrimos dispositivo, indicando tipo y fichero
mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "temp.wav";
MessageBox(hMainWnd, "Comienzo de la Reproducción", "Adquisidor", MB_OK);
if (dwRetorno = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID)&mciOpenParms))
{
MessageBox(hMainWnd, "ERROR en apertura", "Adquisidor", MB_OK);
return (dwRetorno); //Error en la apertura
}
//Apertura correcta. Obtenemos el identificador
wIDDispositivo = mciOpenParms.wDeviceID;
MessageBox(hMainWnd, "Apertura OK, ID OK", "Adquisidor", MB_OK);
//Se inicia la reproducción.
mciPlayParms.dwFrom = 0L;
if (dwRetorno = mciSendCommand(wIDDispositivo, MCI_PLAY,
MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms))
{
mciSendCommand(wIDDispositivo, MCI_CLOSE, 0, 0);
MessageBox(hMainWnd, "ERROR reproducción", "Adquisidor", MB_OK);
return (dwRetorno);
}
mciSendCommand(wIDDispositivo, MCI_CLOSE, 0, 0); // cierro el dispositivo antes de salir
return (0);
};
/***********************************************************/
/*---------------------------------------------------------*/
/*---------------- FUNCION DE DIALOGO ---------------------*/
/*---------------------------------------------------------*/
/***********************************************************/
/*---------------------------------------------------------*/
/*---------------- Fc Imprimir diálogo --------------------*/
/*---------------------------------------------------------*/
BOOL CALLBACK DlgProc2(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
char texto[25];
switch (msg) /* manipulador del mensaje */
{
case WM_INITDIALOG:
sprintf(texto, "T. de adq. (ms): %d", lParam);
SetWindowText(GetDlgItem(hDlg, TEXTO), texto);
return TRUE;
case WM_COMMAND:
EndDialog(hDlg, FALSE);
return TRUE;
}
return FALSE;
}
A - 12
/***********************************************************/
/*---------------------------------------------------------*/
/*-------- FUNCION DE DIALOGO NOMBRE DE ARCHIVO -----------*/
/*---------------------------------------------------------*/
BOOL CALLBACK DlgProc3(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static DATOS *Datos;
switch (msg) /* manipulador del mensaje */
{
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, ID_TEXTO, EM_LIMITTEXT, 80, 0L);
Datos = (DATOS *)lParam;
SetDlgItemText(hDlg, ID_TEXTO, Datos->Texto);
SetFocus(GetDlgItem(hDlg, ID_TEXTO));
return FALSE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hDlg, ID_TEXTO, Datos->Texto, 80);
EndDialog(hDlg, FALSE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
return TRUE;
}
return FALSE;
}
/***********************************************************/
/*---------------------------------------------------------*/
/*-------- FUNCION DE DIALOGO tiempo de adq---- -----------*/
/*---------------------------------------------------------*/
BOOL CALLBACK DlgProcnum(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
BOOL NumeroOk;
static INDATOS *datos;
int numero;
switch (msg) /* manipulador del mensaje */
{
case WM_INITDIALOG:
datos = (INDATOS *)lParam; //el dato contenido en el estructura lo paso a dato
SetDlgItemInt(hDlg, ID_NUMERO, (UINT)datos->Numero, FALSE);//cambia el contenido del
control a un control numerico
SetFocus(GetDlgItem(hDlg, ID_NUMERO));
return FALSE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK: numero = GetDlgItemInt(hDlg, ID_NUMERO, &NumeroOk, FALSE);//lee el
contenido del control
if(NumeroOk)
A - 13
{
}
else
datos->Numero = numero;
EndDialog(hDlg, FALSE);
MessageBox(hDlg, "Número no válido", "Error", MB_ICONEXCLAMATION | MB_OK);
break;
case IDCANCEL: EndDialog(hDlg, FALSE);
break;
}
}
return TRUE;
}
return FALSE;
Recurso win003.rc
win003 ICON "c:\\tdiii\\Multimedia.ico"
#include <windows.h>
#include "ids.h"
/*DECLARACION DEL MENU*/
Menu MENU
BEGIN
POPUP "&Adquirir"
BEGIN
MENUITEM "&Adquirir", CM_ADQ
MENUITEM SEPARATOR
MENUITEM "&Reproducir", CM_REP
MENUITEM SEPARATOR
MENUITEM "&Salir", CM_SALIR
END
POPUP "&Configurar"
BEGIN
MENUITEM "&Archivo", CM_ARCH
MENUITEM SEPARATOR
MENUITEM "&Tiempo", CM_TIEMPO
END
POPUP "&Espectro"
BEGIN
MENUITEM "&Obtener espectro", CM_ESP
END
POPUP "&Ayuda"
BEGIN
MENUITEM "&Programa", CM_AYU
END
END
/*******DIALOGO*******/
Dialogo2 DIALOG
0, 0, 118, 48
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION
"Adquisidor"
FONT 8, "Helv"
BEGIN
CONTROL "Tiempo (ms):",
A - 14
TEXTO,
"static",
SS_LEFT | WS_CHILD | WS_VISIBLE,
8, 9, 84, 8
CONTROL "Aceptar",
IDOK,
"button",
BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
56, 26, 50, 14
END
Dialogo3 DIALOG //Nombre de arch "mensaje de guardar"
0, 0, 118, 48
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION
"Adquisidor"
FONT 8, "Helv"
BEGIN
CONTROL "Archivo:",
-1,
"STATIC",
SS_LEFT | WS_CHILD | WS_VISIBLE,
8, 9, 28, 8
CONTROL "",
ID_TEXTO, "EDIT",
ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
36, 9, 76, 12
CONTROL "Aceptar",
IDOK, "BUTTON",
BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
8, 26, 45, 14
CONTROL "Cancelar",
IDCANCEL, "BUTTON",
BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
61, 26, 45, 14
END
Dialogonum DIALOG //tiempo de adq
0, 0, 118, 48
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Adquisidor"
FONT 8, "Helv"
BEGIN
CONTROL "Tiempo (ms):", -1, "STATIC",
SS_LEFT | WS_CHILD | WS_VISIBLE,
8, 9, 28, 8
CONTROL "", ID_NUMERO, "EDIT",
ES_NUMBER | ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
36, 9, 76, 12
CONTROL "Aceptar", IDOK, "BUTTON",
BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
8, 26, 45, 14
CONTROL "Cancelar", IDCANCEL, "BUTTON",
BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
61, 26, 45, 14
END
A - 15
Descargar