apuntes de clase - max.esimez.ipn.mx · cap´ıtulo 1 elementos el´ectricos 1.1 resistencia. una...
TRANSCRIPT
Apuntes de Clase
Dr. Maximino Pena Guerrero
[libroApuntes.tex], 22.JN.17
Indice general
1. Elementos Electricos 71.1 Resistencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Divisores de voltaje . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3 Divisores de corriente . . . . . . . . . . . . . . . . . . . . . . . . . . 91.4 Fasor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.5 Radian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.6 Capacitancia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.7 Inductancia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.8 Reactancia inductiva. . . . . . . . . . . . . . . . . . . . . . . . . . . 121.9 Reactancia capacitiva. . . . . . . . . . . . . . . . . . . . . . . . . . . 121.10 Valor medio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.11 Valor eficaz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.12 Valor eficaz con senos y cosenos. . . . . . . . . . . . . . . . . . . . . 131.13 Relacion entre valores p, pp, rms, y m. . . . . . . . . . . . . . . . . 14
2. Elementos Acusticos 162.1 Acustica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2 Resistencia acustica. . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.3 Inertancia acustica. . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4 Complianza acustica. . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.5 Impedancia acustica. . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3. Fısica del Sonido 193.1 Velocidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.2 Aceleracion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.3 Analisis de cuerda compuesta . . . . . . . . . . . . . . . . . . . . . . 193.4 Oscilador simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.5 Vibracion armonica simple. . . . . . . . . . . . . . . . . . . . . . . . 203.6 Frecuencia de un oscilador armonico simple. . . . . . . . . . . . . . . 223.7 Condiciones iniciales de un sistema masa-resorte. . . . . . . . . . . . 22
4. Entrada de Audio. 294.1 Estructura de datos hardware de entrada. . . . . . . . . . . . . . . . 294.2 Captura de sonido con MATLAB. . . . . . . . . . . . . . . . . . . . 31
1
INDICE GENERAL 2
5. Salida de Audio. 335.1 Reproduccion de sonido con MATLAB. . . . . . . . . . . . . . . . . 33
6. Archivos WAV. 346.1 Formato de archivos de sonido WAV . . . . . . . . . . . . . . . . . . 346.2 Reproduccion de un archivo WAV con MATLAB. . . . . . . . . . . . 35
7. Prediccion Lineal 377.1 La prediccion lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
8. Filtros Digitales 418.1 Transformada Z. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418.2 Eigenfuncion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418.3 Definicion de Z. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418.4 Ecuacion de diferencias. . . . . . . . . . . . . . . . . . . . . . . . . . 438.5 Ecuacion estandard para DSP. . . . . . . . . . . . . . . . . . . . . . 448.6 Transformacıon Bilineal BLT. . . . . . . . . . . . . . . . . . . . . . . 44
9. Filtros Analogicos 459.1 Filtro pasa alto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.1.1 Funcion de transferencia en funcion de ω. . . . . . . . . . . . 459.1.2 Funcion de transferencia en funcion de s. . . . . . . . . . . . 469.1.3. Factor de calidad Q para un circuito serie RLC. . . . . . . . . 47
10.Escribiendo Textos con LATEX 4910.1 Compilar un proyeto de libro en TEX. . . . . . . . . . . . . . . . . . 4910.2 Crear referencias cruzadas. . . . . . . . . . . . . . . . . . . . . . . . 5010.3 Compilacion del archivo principal LATEX. . . . . . . . . . . . . . . . 5010.4 Impresion de fichas de trabajo. . . . . . . . . . . . . . . . . . . . . 5010.5 Impresion de fichas bibliograficas. . . . . . . . . . . . . . . . . . . . 5110.6 Instalacion MusicTEX en Linux. . . . . . . . . . . . . . . . . . . . . 5110.7 Instalacion MusicTEX Mac OSX. . . . . . . . . . . . . . . . . . . . 5210.8 Instalacion MusixTEX Mac OSX. . . . . . . . . . . . . . . . . . . . 53
11.Programando con Java. 5411.1 instalacion en MS-Windows. . . . . . . . . . . . . . . . . . . . . . . 5411.2 Instalacion en Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . 55
12.Programando Sonido con MatLab. 5612.1 Captura de audio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
13.Programando con SAPI 5813.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5813.2 Ejmplo: holasapi.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . 58
INDICE GENERAL 3
14.Programando con SDL 6014.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
15.Detecion del pitch 6115.1 El Pitch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6115.2 Filtros Latice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
16.Cadenas de Markov 6416.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
17.Redes Neuronales 6517.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
18.Funciones y Macros en C 6618.1 Codigo fuente comun en Win32 (miwin.h). . . . . . . . . . . . . . . 6618.2 Aritmetica compleja. . . . . . . . . . . . . . . . . . . . . . . . . . . 66
18.2.1 Estructura. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6618.2.2 Impresion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6618.2.3 Leectura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6718.2.4 Suma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6718.2.5 Resta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6718.2.6 Producto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6718.2.7 Division. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6718.2.8 Magnitud. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6818.2.9 Operaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . 68
18.3 Convertir hexadecimal a cadena de bits -h2bits(). . . . . . . . . . . 6818.4 Poner bit n de x en cero -setbit0(). . . . . . . . . . . . . . . . . . . 6918.5 Poner bit n de x en uno -setbit1(). . . . . . . . . . . . . . . . . . . 6918.6 Probar bit n de x -getbit(). . . . . . . . . . . . . . . . . . . . . . . . 6918.7 Driver de sonido MIDI Win32 -klsnd(). . . . . . . . . . . . . . . . . 7018.8 Leer un byte de memoria Win32 -peekw(). . . . . . . . . . . . . . . 7118.9 Escribir un byte en memoria Win32 -pokew(). . . . . . . . . . . . . 7218.10 Vaciar memoria (emulacion con un buffer) -dump(). . . . . . . . . 73
19.Programando graficas con OpenGL. 7519.1 Poner un punto OpenGL -gsetpnt(). . . . . . . . . . . . . . . . . . . 7519.2 Manejo del raton OpenGL -graton(). . . . . . . . . . . . . . . . . . 7519.3 Obtener flechas del teclado OpenGL -gflechas(). . . . . . . . . . . . 7519.4 Servicio timer OpenGL -gtimer(). . . . . . . . . . . . . . . . . . . . 7619.5 Graficar spline OpenGL -gspline(). . . . . . . . . . . . . . . . . . . 76
20.Programando con C/C++ 7820.1 Crear un proyecto MFC vacıo en forma manual desde Win32. . . . 7820.2 Editar nuevos archivos dentro de un proyecto MFC vacıo Win32. . . 7920.3 Anexar archivos existentes a un proyecto MFC vacıo Win32. . . . . 7920.4 Anexar un contenedor de dialogo a un proyecto MFC manual Win32. 80
INDICE GENERAL 4
20.5 Crear proyecto MFC vacıo basado en DIALOG con Wizard. . . . . 8120.6 Crear un proyecto esqueleto MFC completo. . . . . . . . . . . . . . 8120.7 Crear boton en contenedor DIALOG. . . . . . . . . . . . . . . . . . 8220.8 Crear variable miembro de boton. . . . . . . . . . . . . . . . . . . . 8220.9 Crear la funcion de un boton. . . . . . . . . . . . . . . . . . . . . . 8220.10 Crear un componente bitmap en DIALOG . . . . . . . . . . . . . 8220.11 Compilar con lınea de comandos una aplicacion DIALOG existente. 8320.12 Enviar un mensaje Win32 . . . . . . . . . . . . . . . . . . . . . . . 8420.13 Enviar mensaje WM PAINT. . . . . . . . . . . . . . . . . . . . . . 84
21.Programando con MIDI 8621.1 ¿Que es una nota? . . . . . . . . . . . . . . . . . . . . . . . . . . . 8621.2 Constante de Bach . . . . . . . . . . . . . . . . . . . . . . . . . . . 8621.3 Octava MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8721.4 Tono MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8821.5 Escala cromatica MIDI . . . . . . . . . . . . . . . . . . . . . . . . . 8821.6 Escala MIDI en modo mayor . . . . . . . . . . . . . . . . . . . . . . 8921.7 Escala MIDI en modo menor. . . . . . . . . . . . . . . . . . . . . . 9021.8 Acorde MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
22.Sistemas Digitales 9222.1 Representacion posicional de un numero. . . . . . . . . . . . . . . . 92
Diccionario de Terminos 96
A. Programas Fuente 98A.1 Protocolo de ventana Win32: mwinh.h . . . . . . . . . . . . . . . . . 98A.2 Graficar archivo con datos de punto flotante MFC: gr.c . . . . . . . 99
A.2.1 Archivo de recursos: gr.rc . . . . . . . . . . . . . . . . . . . 103A.2.2 Archivo de cabecera: resource.h . . . . . . . . . . . . . . . 105A.2.3 Archivo de cabecera: resource.hm . . . . . . . . . . . . . . 106
A.3 Entrada de sonido: entrada.c . . . . . . . . . . . . . . . . . . . . . 106
Indice de figuras
1.1. Circuito con un resistor . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2. Circuito malla con un resistor . . . . . . . . . . . . . . . . . . . . . . 71.3. Circuito con divisor de corriente . . . . . . . . . . . . . . . . . . . . . 91.4. Fasor electrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.5. Fasor de la inductancia . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1. Oscilador simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1. Estructura de datos hardware de sonido . . . . . . . . . . . . . . . . 294.2. Descripcion de WAVEFORMATEX . . . . . . . . . . . . . . . . . . . 294.3. Estructura de datos software de sonido . . . . . . . . . . . . . . . . . 304.4. Descripcion de WAVEFORMATEX . . . . . . . . . . . . . . . . . . . 31
6.1. Formato de encabezado un archivo de sonido WAV . . . . . . . . . . 36
8.1. Cırculo unitariop en el plano-z complejo. . . . . . . . . . . . . . . . . 42
9.1. Filtro pasa alto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459.2. Filtro pasa bajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489.3. Filtro pasa banda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489.4. Red de cruce de tres vias . . . . . . . . . . . . . . . . . . . . . . . . . 48
15.1. Filtro dependiente de sus valores de entrada y salida. . . . . . . . . . 63
21.1. Nombres, sımbolos, variables, y teclas de un piano (octava 4). . . . . 9021.2. Acorde de DO mayor (CM). . . . . . . . . . . . . . . . . . . . . . . . 91
5
Indice de tablas
1.1. Tabla de valores de una onda . . . . . . . . . . . . . . . . . . . . . . 15
6.1. Primeros bytes de encabezado de un archivo de sonido WAV . . . . . 36
21.1. Correspondencia entre: frecuencia (hertz) de nota(i), posicion en oc-tava(j), y tono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
21.2. Relacion n entre octavas(j), notas(i) y tonos(n), dado por n = j(12) + i. 89
6
Capıtulo 1
Elementos Electricos
1.1 Resistencia. Una resistencia es un dispositivo que tiene la propiedad de ope-
nerse al paso de la corriente electrica. La expresion matematica (Exp. 1.1) que rige el
comportamiento de un circuito electrico con una resistencia (Fig. 1.1) se conoce co-
mo Ley de Ohm.
V = I · R
donde R es la resistencia en ohms; V es el voltaje en volts, e I es la corriente en
amperes.
V
IR
Figura 1.1: Circuito con un resistor
1.2 Divisores de voltaje
E
IR1 V1
R2 V2
Figura 1.2: Circuito malla con un resistor
7
CAPITULO 1. ELEMENTOS ELECTRICOS 8
Ejemplo: Calcular el voltaje en V2.
E = V1 + V2
si V1 = IR1 entonces
E = IR1 + V2
pero si I = V2/R2 entonces
E =V2
R2R1 + V2
dividiendo ambos terminos entre V2
E
V2=
V2/
R2
R1
V2/+
V2/
V2/
queda
E
V2=
R1
R2+ 1
pero si hacemos R2/R2 = 1
E
V2=
R1
R2+
R2
R2
simplificamos
E
V2=
R1 +R2
R2
invertimos terminos
V2
E=
R2
R1 +R2
despejamos V2 tenemos finalmente que
V2 =ER2
R1+R2Ejemplo: Calcular el voltaje en VR1 .
E = V1 + V2
si V2 = I · R2 entonces
E = V1 + I ·R2
pero si I = V1/R1 entonces
E = V1 +V1
R1R2
dividiendo ambos terminos entre V1
E
V1=
V1/
V1/+
V1/
R1
R2
V1/
CAPITULO 1. ELEMENTOS ELECTRICOS 9
queda
E
V1= 1 +
R2
R1
pero si hacemos R1/R1 = 1
E
V1=
R1
R1+
R2
R1
simplificamos
E
V1=
R1 +R2
R1
invertimos terminos
V1
E=
R1
R1 +R2
despejamos V1 tenemos finalmente que
V1 =ER1
R1+R2
en general tenemos que
Vn =ERn
R1+R2+...+Rn
1.3 Divisores de corriente De acuerdo con el circuito de la Figura 1.3, calcular la
corriente en I1, la corriente en I2, y la corriente total It.
I
It
I1
V1R1
V
I2
R2 V2
Figura 1.3: Circuito con divisor de corriente
Desarrollo: La corriente total It en el circuito sera
It = I1 + I2
de acuerdo con la ley de Ohm (I = VR ) tenemos que la corriente total It sera
It =V1
R1+
V2
R2
CAPITULO 1. ELEMENTOS ELECTRICOS 10
utilizando el algoritmo para sumar fracciones
a =b
c+
d
e=
( c/ec/ )b + ( ce/e/ )d
ce=
eb+ cd
ce
pero en el circuito el voltaje V es el mismo en ambas resistencias (V = V1 = V2)
It =V
R1+
V
R2=
(R1/R2
R1/)V + (R1R/2
R2/)V
R1R2
It =R2V +R1V
R1R2
It =V (R2 +R1)
R1R2
despejando V
ItV
=V/(R2 +R1)
V/R1R2
1
V=
R2 +R1
It(R1R2)
finalmente
V = It(R1R2)R1+R2
(1.1)
Notese que R1R2R1+R2
es el paralelo de las dos resistenciac R1 y R2 que ve la fuente de corriente I.
Ejemplo: Calcular I1.
sabemos que V1 = I1 ·R1
I1R1 =It(R1R2)
R1 +R2
despejando I1
I1 =It(R1/R2)
R1/(R1 +R2)
finalmente tenemos
I1 =ItR2
R1+R2
Ejemplo: Calcular I2.
Sabemos que V2 = I2 ·R2
I2R2 =It(R1R2)
R1 +R2
despejando I1
I2 =It(R1R2/)
(R1 +R2)R2/
CAPITULO 1. ELEMENTOS ELECTRICOS 11
finalmente tenemos
I2 =ItR1
R1+R2
1.4 Fasor. Si movemos un alambre de cobre cerca del campo megnetico producido
por un iman natural (o un electroiman), entonces se genera una corriente electrica en
dicho conductor. De acuerdo con los experimentos de Miguel Faraday (1837-1901),
podemos medir una cierta cantidad de voltaje en los extremos del alambre. Para fa-
cilitar el analisis matematico de este fenomeno, la ingenierıa electrica ha dado nom-
bre a este concepto, fasor.
AO
X
Fasor
Figura 1.4: Fasor electrico
De esta forma tenemos que un fasor es un vector rotatorio que tiene una mag-
nitud y una velocidad angular constante. Ası, dicho fasor sirve como una representa-
cion simbolica de un conductor que gira dentro de un campo magnetico, como puede
ser la bobina del rotor de un motor electrico [Jac73, 299].
1.5 Radian. Un radian. es aquella distancia angular A X que recorre un fasor cuan-
do su extremo libre X recorre una distancia lineal igual a la longitud OX del fasor
[Jac73, 308]. Ası,
1 rad. =360
2π= 57,3o
1o =2π
360= 0,017 rad.
CAPITULO 1. ELEMENTOS ELECTRICOS 12
1.6 Capacitancia. Otro concepto es la capacitancia. Entonces, la capacitancia es
una constante numerica que representa la capacidad de un capacitor para almacenar
una carga electrica [?, 160]. Pero tambien es la ”... propiedad de un circuito electri-
co que se opone a cualquier cambio en el voltaje en ese circuito.”[?, 162].
1.7 Inductancia. Una inductancia es la ”...propiedad de un circuito electrico que
se opone a cualquier cambio en la corriente que pasa por ese circuito [p:261]. [...] Un
circuito tiene una inductancia de un henrio cuando la corriente que cambia a la ve-
locidad de un ampere por segundo induce una fuerza contraelectromotrız de un volt
en ese circuito”[?, 262].
R
L
wL
XL =√
R2 + jwL
Figura 1.5: Fasor de la inductancia
1.8 Reactancia inductiva. Una reactancia inductiva es aquella ”...oposicion origi-
nada por una inductancia al flujo de una corriente alterna. ... Un circuito de ca tiene
una reactancia inductiva de un ohm cuando una corriente alterna que tiene un valor
efectivo de un ampere y que fluye por la inductancia, produce una caida de voltaje
inductivo con un valor efectivo de un volt en la inductancia”[Jac73, 325-326]. Enton-
ces, la reactancia inductiva esta dada por:
XL = 2πfL
donde XL es la reactancia inductancia en ohms, L es el valor de la inductancia en
henrios, y f es la frecuencia trabajo en hertz donde la inductancia tiene efecto .
1.9 Reactancia capacitiva. Podemos definir la reactancia capacitiva como ”...opo-
CAPITULO 1. ELEMENTOS ELECTRICOS 13
sicion creada por una capacitancia al flujo de la corriente alterna [Jac73, 262]. ... Un
circuito de ca tiene una rectancia capacitiva de un ohm cuando una corriente alterna
con un valor efectivo de un ampere origina una diferencia de potencial alterma con
un valor de un volt en la capacitancia.”, es decir
XC =1
2πfC
donde XC es la reactancia capacitiva en ohms, C es el valor de la capacitancia en
farads, y f es la frecuencia trabajo en hertz adonde dicha capacitancia tiene su efecto.
1.10 Valor medio. De acuerdo con Edminister [Edm70, 16], el valor medio Ym de
una funcion periodica y(t) de periodo T esta dado por la expresion
Ymed =1
T
∫ T
0y(t) dt (1.2)
1.11 Valor eficaz. Cuando circula una corriente de intensidad i(t) por un elemento
resistivo puro de resistencia R, este disipa una potencia p(t) con un valor medio P .
Esta misma potencia P la puede disipar una corriente constante de intensidad I cir-
culando por dicha R. En estas condiciones, diremos que i(t) tiene un valor eficaz Ief
equivalente a la corriente constante I. Lo mismo diriamos respecto de la tension efi-
caz Vef . Matematicamente, dada la funcion y(t) de periodo T , su valor eficaz (rms)
sera por definicion
Yef =
√1
T
∫ T
0y(t)2 dt (1.3)
El valor eficaz de las funciones a sin(ωt) y a cos(ωt) durante un periodo es a√2.
1.12 Valor eficaz con senos y cosenos. Por otro lado, el valor eficaz de una fun-
cion de senos y cosenos, es decir, el valor eficaz de una funcion y(t) = a0+(a1 cosωt+
a2 cos 2ωt+ · · ·) + (b1 sinωt+ b2 sin 2ωt+ · · ·) estara dada por
Yef =
√
a20 +1
2(a21 + a22 + · · ·) + 1
2(b21 + b22 + · · ·) (1.4)
CAPITULO 1. ELEMENTOS ELECTRICOS 14
llamando A al valor eficaz de la funcion a1 cosωt, y de acuerdo con lo anterior,
A1 =a1√2, o bien A2
1 =a212 , por lo tanto
Yef =√a20 + (A2
1 + A22 + · · ·) + (B2
1 +B22 + · · ·) (1.5)
Ejemplo.1 Hallar el valor eficaz de la funcion y = 50 + 30 sinωt.Solucion.
Y 2ef =
1
2π
∫ 2π
0(2500 + 3000 sinωt+ 900 sen2 ωt)d(ωt)
=1
2π[2500 + 0 + 900 sin2 π]
= 2950
Yef = 54,3
otro metodo
Yef =
√(50)2 +
1
2(302)
=√2950
Yef = 54,3
Ejemplo.2 Hallar el valor eficaz de la funcion de tension v = 50 + 141,4 sinωt+ 35,5 sin 3ωtSolucion.
Vef =
√(50)2 +
1
2(141,4)2 +
1
2(35,5)2
Vef = 114,6
1.13 Relacion entre valores p, pp, rms, y m. La siguiente tabla nos da una re-
lacion entre los valores pico, pico-pico, eficaz, y valor medio, de una onda senoidal
[Pen77].
1Problema 2.11 del [Edm70]2Problema 2.12 del [Edm70]
CAPITULO 1. ELEMENTOS ELECTRICOS 15
Para obtener estoPromedio Pico Pico-Pico R.M.S.
Promedio 1.000 1.572 3.144 1.111Multiplicar Pico 1.636 1.000 2.000 0.707por esto Pico-Pico 0.318 0.500 1.000 0.353
R.M.S. 0.849 1.414 1.828 1.000
Tabla 1.1: Tabla de valores de una onda
Capıtulo 2
Elementos Acusticos
2.1 Acustica. Podemos definir la acustica como la ciencia que estudia las vibracio-
nes de los infrasonidos (abajo de 20 Hz.), de los sonidos (20-20 Khz), y los ultraso-
nidos (arriba de 20 Khz.). O bien, de una manera mas formal como ”... la genera-
cion, transmision, y recepcion de la energia en la forma de vibraciones de ondas en la
materia”[Kin67, 1].
2.2 Resistencia acustica. Analoga a la resistencia electrica, la resistencia acusti-
ca es un dispositivo acustico que disipa energıa en forma de calor, debido a la friccion ¿Que esla resis-tenciaacustica?
de las moleculas de un fluido. [Kin67, 191]. En un resonador Helmholtz, la radiacion
de la energıa del sonido sera:
R =ρ0ck2
2π
dondeR = es la resistenica acustica en ohms acusticos.c = 343 m/seg es la velocidad termodinamica del sonido.ρ0c = 428 rails es la impedancia caracterısticarail = pa · k/mρ = 1,21 Kg/seg. constante de densidad acustica.k = es la constante de un resorte.
2.3 Inertancia acustica. Analoga a la inductancia electrica, es la masa M que tie- ¿Que esla iner-tanciaacustica?
ne un elemento acustico y que se opone a qualquier cambio de variacion en el movi-
16
CAPITULO 2. ELEMENTOS ACUSTICOS 17
miento de las partıculas del medio [Kin67, 190]. Entonces la inertancia acustica es:
M =m
S2
sustituyendo m por ρ0l′ de un resonador helmholts,
M =ρ0l′S
S2,
simplificando S,
M =ρ0l′
S.
dondeM = inertancia acustica en ohms acusticos Ωac.m = masa efectiva del elemento acustico en kgs.S = area transversal del orificio en mts2.ρ = 1,21Kg/seg. constante de densidad acustica.l′ = longitud efectiva del cuello en mts
(un poco mayor que la longitud real l).
2.4 Complianza acustica. Analogo a la capacitancia electrica (carga que aparece
en un capacitor por unidad de voltaje aplicado), la complianza (elasticidad) acustica ¿Que esla com-plianzaacustica?
C de un elemento acustico .es el volumen de desplazamiento X que produce la apli-
cacion de una unidad de presion”[Kin67, 191]. Para un volumen V de en un resona-
dor Helmholtz, dicha complianza acustica sera:
C =V
ρ0c2
dondeC = complianza acustica en m4sec2/kg farads acuaticos,V = es el volumen (en mts3) del recinto .m = es la masa del elemento (en kg). .ρ0c = 428 rails es la impedancia caracterısticarail = pa · k/mρ = 1,21 Kg/seg. constante de densidad acustica.
donde C esta en m4sec2/kg unidades (farads acuaticos, V es el volumen (en
mts3) del recinto, y m es la masa del elemento (en kg).
2.5 Impedancia acustica. Las unidades de la impedancia acustica es el ohm acusti-
co definido como:
CAPITULO 2. ELEMENTOS ACUSTICOS 18
presion.
velocidad de volumen.=
newtons/m2
m3/seg=
kg
m4/seg
Capıtulo 3
Fısica del Sonido
3.1 Velocidad. Dada una funcion y = f(x), podemos interpretar se derivada como
el ritmo de cambio de y con respecto a x. De esta forma, la velocidad es el cambio de
la posicion que experimenta un cuerpo con respecto al tiempo 1.
v =dy
dt
3.2 Aceleracion. De la misma forma, si a = f(v), podemos interpretar la derivada
de la velocidad como aceleracion. Entonces, la aceleracion es el ritmo de cambio de
la velocidad que experimenta un cuerpo con respecto el tiempo 2.
con respecto a la velocidad
a =dv
dt
con respecto a la posicion
a =d2y
dt2
3.3 Analisis de cuerda compuesta Estudiar el movimiento ondulatorio y la trans-
mision de energıa en la vibracion transversal de una cuerda compuesta. 3
1Ridnik V. I., ¿Que es la mecanica cuantica?, MIR, 1977, p.1122idem, Rıdnik3Problema 1.20, del [Set78, 22].
19
CAPITULO 3. FISICA DEL SONIDO 20
Solucion:
Para tener en cuenta el cambio de fase y el cambio en la densidad de masa de
la cuerda, utilizaremos la exponencial compleja para representar las ondas progresi-
vas armonicas de la cuerda.
y1(x, t) = Aeiω(t−xa1
) +Beiω(t−xa1
) (3.1)
y2(x, t) = Ceiω(t−xa2
) (3.2)
Donde: a1 =√
S(ρL)1
, a1 =√
S(ρL)1
, S es la tension de la cuerda, y ρL es la masa por
unidad de longitud de la cuerda.
El termino Aeiω(t−xa1
) de la expresion (3.1), es una onda incidente moviendose
en la direccion positiva de x con una velocidad a1.
De de misma expresion (3.1), Beiω(t−xa1
) es la onda reflejada que viaja en una
direccion negativa de x con una velocidad a1. y2(x, t) es la onda en movimiento que
se transmite en direccion positiva de x con velocidad a2.
3.4 Oscilador simple. De acuerdo con la Figura 3.1, un oscilador simple es un dis-
positivo compuesto por una masa m que esta sujeta a un resorte y restringida a mo-
verse de manera paralela a dicho resorte; la masa vibrara si se desplaza ligeramente
de una posicion de equilibrio y se suelta.
L L
Figura 3.1: Oscilador simple.
3.5 Vibracion armonica simple. Una vibracion armonica simple es una funcion
senoidal en el tiempo que resulta del desplazamiento de una particula a partir de su
posicion de equilibrio. Sus caracterısticas son: una fuerza restauradora inversaimen-
te proporcional (Ley de Hooke), no hay atenuacion de movimiento, y la frecuencia de
vibracion es independiente de la ampliatud.
CAPITULO 3. FISICA DEL SONIDO 21
Consideremos un oscilador simple y supongamos que la fuerza f del resorte se
puede expresar por la ecuacion
f = −sx (3.3)
donde x es el desplazamiento da la masa m desde la posicion en reposo, s es la cons-
tante de rigidez del resorte o elsaticidad, y el signo menos (-) indica que la fuerza es
directamente opuesta al desplazamiento.
Sustituyendo (3.3) en la expresion general de movimiento lineal la cual dice que
la “fuerza es igual a la masa por la aceleracion (f = ma)”, tenemos
f = md2x
dt2(3.4)
si igualamos (3.3) y (3.4) tenemos
−sx = md2xdt2
dividiendo ambos miembros entre m
−sxm = m/
m/d2xdt2
reordenando e igualando con cero
0 = smx+ d2x
dt2
finalmente tenemosd2x
dt2+
s
mx = 0 (3.5)
Esta expresion es una ecuacion diferencial lineal de segundo orden cuya solucion
puede obtenerse por varios metodos. El primero de ellos supone una sulucion del tipo
x = A1 cos γt
Diferenciamos y sustituimos en la expresion (3.5) observamos que es similar si
γ la hacemos igual a√
sm tenemos
x = A1γ sin√
s
mt (3.6)
CAPITULO 3. FISICA DEL SONIDO 22
que tambien es una solucion. La solucion general completa es la suma de esas dos so-
luciones, entonces
x = A1γ cos√
s
mt + A2γ sin
√s
mt (3.7)
donde A1 y A2 son constantes arbitrarias; Si sustituimos la relacion√
sm por la fre-
cuencia angular ω0, entonces la ecuacion (3.7) quedara como
x = A1 cosω0t + A2 sinω0t (3.8)
3.6 Frecuencia de un oscilador armonico simple. Recordemos que la frecuen-
cia f0 de vibracion de un oscilador armonico simple estara relacionada con el valor
de la constante de frecuancia angular ω0 mediente la ecuacion ω0 = 2πf0, esto es
f0 =ω02π = 1
2π
√sm
cuyo periodo sera
T = 1f0.
3.7 Condiciones iniciales de un sistema masa-resorte. Una condicion inicial
es la manera con la cual la masa m de un sistema masa-resorte comienza su movi-
miento [Kin67, 4]. Es en este momento cuando se determinaran las constantes A1,
A2. Por ejemplo, si en un tiempo t = 0 la masa m tiene un desplazamiento inicial x0
y una velocidad v0, entonces el movimiento subsecuente de la masa m tambien que-
dara determinado de acuerdo con los valores de A1 y A2 iniciales.
Sustituyendo x = x0 y t = 0 en la expresion (3.8) veremos que A1 = x0. Dife-
renciando esta misma expresion (3.8) y sustitiyendo v0 quedara como
v0 = −ω0A1 sin(0) + ω0A2 cos(0) (3.9)
de manera que v0 tiene que ser igual a ω0A2, por lo tanto A2 =v0ω0, ademas la expre-
sion (3.8) se convertira en
x = x0 cosω0t +v0ω0
sinω0t (3.10)
CAPITULO 3. FISICA DEL SONIDO 23
Por otro lado, es posible obtener de otra manera la expresion (3.8). Esto se lo-
gra haciendo A1 = −A sin θ, donde A y θ son dos nuevas constantes arbitrarias. Sus-
tituyendo A1 por −A sin θ en dicha expresion (3.8), y simplificando tendremos que
x = A cos(ω0t + φ) (3.11)
donde A es la amplitud del movimiento y φ es el angulo de fase inical de dicho mo-
vimiento. Veremos que los valores de A y φ estaran determinados por las condiciones
iniciales usuales, los cuales seran
A =
(
x20 +
v20ω20
) 12
, y φ = tan−1
(−v0ω0x0
)
(3.12)
Ejemplo.4 Dados dos resortes de rigidez s y dos cuerpos de masa m, encontrar las frecuen-
cias de resonancia de las siguientes figuras: Solucion fa = 12π
√2sm ; fb = 1
2π
√s
2m ; fc = 12π
√s
2m ;
fd = 12π
√2sm ;
MMM
M
s
s
s
s
sss
(c) (d)(b)(a)
M
Solucion (a). Sabemos que cuando se encuentran conectados dos resortes en paralelo, la elastanciatotal kt de ambos resortes sera la suma de cada uno de ellos (como capacitores en paralelo) de acuer-do como lo indican las expresiones kt = k1 + k2. Si k1 = k2, entonces kt = 2k. la expresion de equi-librio para este circuito sera
k1
∫µ(t)dt+ k2
∫µ(t)dt+m
dµ(t)
dt= 0
kt
∫µ(t)dt+m
dµ(t)
dt= 0
2k
∫/ d/x(t)
dt/dt+m
d2x(t)
dt2= 0
2kx(t) +md2x(t)
dt2= 0 · · · · · · · · · (a)
4Problema 1.1 del [Kin93] pg. 94 y 577.
CAPITULO 3. FISICA DEL SONIDO 24
tambien sabemos que la sulucion es
x(t) = A cosωt
dx(t)
dt= −Aω sinωt
d2x(t)
dt2= −Aω2 cosωt
sustituyenfo en (a)
2k A cosωt+m(−Aω2 cosωt) = 0
2k A cosωt−mAω2 cosωt = 0
dividiendo ente A cosωt
2k A cosωt
A cosωt− mAω2 cosωt
A cosωt= 0
esto es
2k −mω20 = 0
ω20m = 2k
ω20 =
2k
m
finalmente
ω0 =√
2km rad/seg
la frecuencia de resonancia es
f = 12π
√2km
si k = s
f = 12π
√2sm
Solucion (b). Sabemos que cuando se encuentran conectados dos masas en serie, la masa total mt
de ambos resortes sera la suma de cada uno de ellos (como capacitores en paralelo) de acuredo co-mo lo indican las expresiones mt = m1 +m2. Si m1 = m2, entonces mt = 2m. la expresion de equi-librio para este circuito sera
k
∫µ(t)dt+m1
dµ(t)
dt+m2
dµ(t)
dt= 0
k
∫µ(t)dt +mt
dµ(t)
dt= 0
k
∫µ(t)dt+ 2m
dµ(t)
dt= 0
k
∫/ dx(t)
dt/dt/ + 2m
d2x(t)
dt2= 0
kx(t) + 2md2x(t)
dt2= 0 · · · · · · · · · (b)
CAPITULO 3. FISICA DEL SONIDO 25
sabemos que
x(t) = A cosωt
dx(t)
dt= −Aω sinωt
d2x(t)
dt2= −Aω2 cosωt
sustituyenfo en (b)
kA cosωt+ 2m(−Aω2 cosωt) = 0
kA cosωt− 2mAω2 cosωt = 0
dividiendo ente A cosωt
k A cosωt
A cosωt− 2mAω2 cosωt
A cosωt= 0
esto es
k − 2mω20 = 0
2ω20m = k
ω20 =
k
2m
finalmente
ω0 =√
k2m rad/seg
la frecuencia de resonancia es
f = 12π
√k2m
si k = s finalmente tenemos resuelto el inciso b.
f = 12π
√s
2m hz
Solucion (c). Sabemos que cuando se encuentran conectados dos resortes en serie, la elastancia totalkt de ambos resortes sera menor que el menor valor de uno de ellos (como capacitores en serie) de acu-redo como lo indican las expresiones kt =
11k1
+ 1k2
, o bien 1kt
= 1k1
+ 1k2, pero tambien sera kt =
k1·k2k1+k2
.
Si k1 = k2, entonces
1
kt=
1
k+
1
k1
kt=
1 + 1
k1
kt=
2
kkt1
=k
2
kt = k2
CAPITULO 3. FISICA DEL SONIDO 26
otra forma, si k1 = k2, entonces kt sera
kt =k1 · k2k1 + k2
kt =k · kk + k
kt =k2
2k
kt =k2
Por lo tanto, la expresion de equilibrio del circuito anterior sera :
k1
∫µ(t)dt+ k2
∫µ(t)dt+m
dµ(t)
dt= 0
kt
∫µ(t)dt+m
dµ(t)
dt= 0
k
2
∫d/x(t)
dt/dt+m
d2x(t)
dt2= 0
k
2x(t) +m
d2x(t)
dt2= 0 · · · · · · · · · (c)
sabemos que
x(t) = A cosωt
dx(t)
dt= −Aω sinωt
d2x(t)
dt2= −Aω2 cosωt
sustituyenfo en (c)
k
2A cosωt+m(−Aω2 cosωt) = 0
k
2A cosωt−mAω2 cosωt = 0
dividiendo ente A cosωt
k
2
A cosωt
A cosωt− mAω2 cosωt
A cosωt= 0
esto es
k
2−mω2
0 = 0
mω20 =
k
2
ω20 =
k
2m
finalmente
ω0 =√
k2m rad/seg
CAPITULO 3. FISICA DEL SONIDO 27
la frecuencia de resonancia es
f = 12π
√k2m
si k = s finalmente tenemos resuelto (c)
f = 12π
√s
2m hz
Solucion (d). Al igual que en la sulucion (a), puesto que el circuito es el mismo (los dos resortes seencuentran conectados en el mismo nodo), sabemos que cuando se encuentran conectados dos resor-tes en paralelo, la elastancia total kt de ambos resortes sera la suma de cada uno de ellos (como ca-pacitores en paralelo) de acuredo como lo indican las expresiones kt = k1 + k2. Si k1 = k2, entonceskt = 2k. la expresion de equilibrio para este circuito sera
k1
∫µ(t)dt + k2
∫µ(t)dt+m
dµ(t)
dt= 0
kt
∫µ(t)dt+m
dµ(t)
dt= 0
2k
∫/ d/x(t)
dt/dt+m
d2x(t)
dt2= 0
2kx(t) +md2x(t)
dt2= 0 · · · · · · · · · (d)
tambien sabemos que la sulucion es
x(t) = A cosωt
dx(t)
dt= −Aω sinωt
d2x(t)
dt2= −Aω2 cosωt
sustituyenfo en (d)
2k A cosωt+m(−Aω2 cosωt) = 0
2k A cosωt−mAω2 cosωt = 0
dividiendo ente A cosωt
2k A cosωt
A cosωt− mAω2 cosωt
A cosωt= 0
esto es
2k −mω20 = 0
ω20m = 2k
ω20 =
2k
m
finalmente
ω0 =√
2km rad/seg
CAPITULO 3. FISICA DEL SONIDO 28
la frecuencia de resonancia es
f = 12π
√2km
si k = s
f = 12π
√2sm
Capıtulo 4
Entrada de Audio.
4.1 Estructura de datos hardware de entrada. Antes de capturar el sonido es
necesario llenar la estructura WAVEFORMATEX que muestramos en la Figura (4)
con la informacion del proceso de captura de senales digitales.
typedef struct
WORD wFormatTag; // tipo de formato de sonido.WORD nChannels; // mono o estereoDWORD nSamplesPerSec; // relacion de muestreo.DWORD nAvgBytesPerSec; // Relacion Tx de datosWORD nBlockAlign; // bloques dep. del tipo.WORD wBitsPerSample; // n bits por muestra.WORD cbSize; // informacion extra.
WAVEFORMATEX;
Figura 4.1: Estructura de datos hardware de sonido
CAMPO DESCRIPCIONwFormatTag Tipo de formato de onda.nChannels Numero de canales utilizados (1 o 2).nSamplesPerSec Numero de muestras por segundo.1
nAvgBytesPerSec Relacion de transferencia de datos.2
nBlockAlign Numero de bloques alineados.3
wBitsPerSample Bits por muestra para el formato especificado.4
cbSize Informacion extra cuando el formato no es PCM.5
Figura 4.2: Descripcion de WAVEFORMATEX
29
CAPITULO 4. ENTRADA DE AUDIO. 30
1 Si wFormatTag tiene la bandera WAVE FORMAT PCM, entonces losvalores estandard (en Khz.) de las muestras pueden ser 8, 11.025,22.05, 44.1.
2 Si wFormatTag tiene la bandera WAVE FORMAT PCM, entoncesnAvgBytesPerSec = (nSamplesPerSec)·(nBlockAlign).
3 Es la unidad mınima de datos para el tipo de formato.
4 Si wFormatTag tiene la bandera WAVE FORMAT PCM, entoncesnBlockAlign= (nChannels)·(wBitsPerSample)/8.
5 Si wFormatTag tiene la bandera WAVE FORMAT PCM,wBitsPerSample debe ser igual a 8 o 16; [Pet99].
Otra estructura que se debe llenar es WAVEHDR, la cual se muestra en la Figura
(4) y donde se definen los parametros que identifican un buffer de sonido en memo-
ria RAM.
typedef struct
LPSTR lpData; // direccion del buffer.DWORD dwBufferLength; // tama~no del buffer.DWORD dwBytesRecorded; // n bytes grabados.DWORD dwUser; // datos de usuario.DWORD dwFlags; // banderas de control.DWORD dwLoops; // n repeticiones.struct wavehdr_tag *lpNext. // si estan encoladas.DWORD reserved; // otra informacion.
WAVEHDR;
Figura 4.3: Estructura de datos software de sonido
CAPITULO 4. ENTRADA DE AUDIO. 31
CAMPO DESCRIPCIONlpData Direccion del buffer en RAM.dwBufferLength Numero de bytes del buffer.dwBytesRecorded Numero de datos de entrada.1
dwUser Datos especificados por el usuario.dwFlags Banderas del driver acerca del buffer.2
dwLoops Numero de repeticiones del proceso.struct wavehdr tag *lpNext si hay estructuras encoladas.reserved Reservado para informacion extra.
Figura 4.4: Descripcion de WAVEFORMATEX
1 Se establece cuando la estructura se utiliza como entrada (cuantosbytes llegaron).
2 BANDERAS:
WHDR BEGINLOOP Indica que es el primer buffer en la cola (solo para bufferde salida).
WHDR DONE Indica que ha finalizado el buffer y esta regresando a laaplicacion.
WHDR ENDLOOP Indica que es el ultimo buffer en la cola (solo para bufferde salida).
WHDR INQUEUE Indica que el buffer esta en la cola listo para su reproduc-cion;
WHDR PREPARED Indica que el buffer esta preparado como entrada o salida.
En el anexo se presenta el codigo fuente de un programa llamado entrada.c
que permite realizar la captura de sonido en maquinas MSWindows.
4.2 Captura de sonido con MATLAB. MATLAB contiene varias funciones que
permite procesar sonido utilizando el sistema de audio que vine integrado en una
computadora digital moderna. Asegurese que haya un microfono conectado a la ter-
jeta de sonido, o bien utilizar el microfono integrado. Tambien asegurese que el soni-
do se pueda escuchar en el altavoz de la maquina.
Para la captura de audio utilizaremos la funcion wavrecord(n,s,c,d), donde
n es la cantidad de muestras de audio, s es la frecuencia de muestreo y c es el nume-
ro de canales, y d es el numero de bits por muestra. Ejemplo: capturar y depositar
CAPITULO 4. ENTRADA DE AUDIO. 32
en el vector x 16000 datos, a 8000 muestras por segundo, monocanal, y con datos de
16 bits por muestra [Mcl09, p: 8].
x = wavrecord(16000,8000,1,’double’);
Capıtulo 5
Salida de Audio.
5.1 Reproduccion de sonido con MATLAB. Para reproducir el sonido utilizar
la funcion sound(x, s), donde x es el vector de datos que contiene el sonido, y s es la
frecuencia de muestras por segundo. Ejemplo: reproducir el sonido que se encuentra
en el vector x.
sound(x);
o bien, reproducir x a 8000 muestras por segundo:
sound(x,8000);
Tambien es posible utilizar la funcion wavplay(x, s) para el mismo proposito.
Ejemplo: Ejemplo: reproducir el sonido que se encuentra en el vector x.
wavplay(x);
o bien, reproducir x a 8000 muestras por segundo:
wavplay(x,8000);
Es conveniente, ademas de escuchar el sonido, obtener una grafica del vector x,
lo cual se logra con la funcion plot(x). Ejemplo, graficar el sonido de x:
plot(x);
33
Capıtulo 6
Archivos WAV.
6.1 Formato de archivos de sonido WAV
Este formato, desarrollado por Microsoft a principios de los 90’s, permite alma-
cenar datos sin compactar en un archivo digital. En la Tabla (6.1), se presenta el de-
talle de este tipo de archivos. Consideremos una matriz de m x n donde n (0H-FH)
son las filas, y m (0H-FH) son las columnas. Los elementos de la matriz son numeros
hexadecimales que constituyen cada uno de los campos que definen las caracteristi-
cas de un archivo .wav. A continuacion describimos cada uno de dichos campos.
El primer campo de la matriz ocupa los elementos 00, 01, 02 y 03. En ellos se en-
cuentran los cuatro numeros que identifican a un archivo de sonido WAV. Agrupando-
los en cuatro bytes corresponderan a una cadena de caracteres ASCII que contienen
la palabra RIFF”la cual es conocida como ”numero magico”. Dichos numeros en he-
xadecimal son: 52H, 49H, 46H, y 46H.
El siguiente campo corresponde al tamno del archivo que contiene el sonido
WAV. Estos numeros corresponden a la secuencia B0, B1, B2, y B3, los cuales ocu-
pan los elementos de la matriz 04, 05, 06, 07. Notese que primero se lee el byte me-
nos significativo, y hasta el ultimo se lee el byte mas significativo.
Continuando con nuestra descripcion, el siguiente campo numerado con los ele-
mentos 08,09,0A y 0B de la matriz contienen una cadena de caracteres ASCII que co-
rresponde a la palabra ”WAVEcuya secuencia de numeros en hexadecimal son 57H,
34
CAPITULO 6. ARCHIVOS WAV. 35
41H, 56H, y 45H.
En cuanto al siguente campo numerado con 0CH,0DH,0EH y 0FH, contiene una
secuencia de cracteres ASCII que corresponden a la palabra ”fmt ”. Notese que dicha
palabra termina con un espacio en blanco. Entonces, su secuencia de numeros hxa-
decimales seran 66, 6D, 74 y 20. Este ultimo corresponde al caracter espacio (20H).
Ahora bien, el campo que sigue se encuentra en las posiciones 10,11, 12 y 13 de
la matriz. En ellas se encuantra un numero entero de 4 bytes que nos especifica el ta-
mano del bloque. Este numero contiene la secuancia B0, B1, B2, y B3 semejante en
orden a como se ha descrito en el campo Tamano del Archivo. Es evidente que su va-
lor variara de acuerdo con un archivo.wav determinado.
Por otra parte, el siguiente campo (elementos 14 y 15) contienen un numero en-
tero formado por 2 bytes (B0 y B1) para indicar el tipo de formato. Si este numero
es igual a cero, entonces indica que el archivo se ha grabado de manera monoaural
(un solo microfono). Pero si dicho entero es igual a uno, entonces el sonido se graba-
do con dos microfonos, es decir, en estereofonıa.
Campo 7: bytes 16 y 17 contiene nuevamente un numero entero de 2 bytes, des-
criben el numero de canales; Campo 8: bytes 18, 19, 1A y 1B contiene un numero en-
tero de 4 bytes que nos indica la frecuencia de muestreo. Puede valer 11,025, 22,050
o 44,100 Hz; Campo 9: bytes 1C, 1D, 1E y 1F numero entero de 4 bytes que nos in-
dica el numero de bytes por segundo que debemos intercambiar con la tarjeta de so-
nido para una grabacion o reproduccion; Campo 10: bytes 20 y 21 numero de 2 by-
tes que nos muestra los Bytes por muestra. Pueden ser 1=8 bits mono, 2=8 bits es-
tero o 16 mono o 4=16 bits estereo; Campo 11: bytes 22 y 23 numero de 2 bytes pa-
ra representar los bits por muestra. Pueden ser 8 o 16. Campo 12: bytes 24, 25, 26 y
27 contiene la palabra data en codigo ASCII; Por ultimo el campo 13: bytes 28, 29,
2A y 2B contiene un numero entero de 4 bytes que representa la cantidad de datos
wav que tenemos en nuestro archivo. Finalizando este campo, los demas son ocupa-
dos por los datos de audio correspondientes.
CAPITULO 6. ARCHIVOS WAV. 36
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 52 49 46 46 B0 B1 B2 B3 57 41 56 45 66 62 74 201 B0 B1 B2 B3 B0 B1 B0 B1 B0 B1 B2 B3 B0 B1 B2 B3
2 B0 B1 B0 B1 64 61 76 61 B0 B1 B2 B3 d0 d0 d1 d23 d3 d4 d5 d6 d7 d8 d9 d10 d12 d13 d14 d15 d16 d17 d18 d194
Tabla 6.1: Primeros bytes de encabezado de un archivo de sonido WAV
0 4 bytes [52][49][46][46] Identificador de archivo [RIFF]1 4 bytes [B0][B1][B2][B3] Tamano del archivo2 4 bytes [57][41][56][45] Tipo de archivo [WAVE]3 4 bytes [66][62][74][20] Bloque [Fmt ]4 4 bytes [B0][B1][B2][B3] Tamano bloque encabezado5 2 bytes [B0][B1] Tipo de fotrmato (0=monaural, 1=estereo)6 2 bytes [B0][B1] Numero de canales7 4 bytes [B0][B1][B2][B3] Relacion de muestreo8 4 bytes [B0][B1][B2][B3] Bytes por segundo9 2 bytes [B0][B1] Bytes por muestra (1=8 bits mono, 2=8 bits estereo.
o 16 mono, 4=16 bits estereo)10 2 bytes [B0][B1] Bits por muestra11 4 bytes [64][61][74][61] Bloque [data]12 4 bytes [B0][B1][B2][B3] Numero de datos...
...n x data
Figura 6.1: Formato de encabezado un archivo de sonido WAV
6.2 Reproduccion de un archivo WAV con MATLAB. Por otro lado, para
leer un archivo.wav utilizar la funcion wavread(file), donde file es el nombre del ar-
chivo. Ejemplo: leer el archivo max.wav y depositar los datos en el vector x.
x = wavread(’file.wav’);
Capıtulo 7
Prediccion Lineal
7.1 La prediccion lineal
LPC (Linear Prediction Code) tiene las siguientes ventajas: 1) Proporciona un
modelo edecuado para las senales de voz humana (senales estacionarias vs. sonidos
sordos). 2) Permite obtener los parametros que muestran un espectro suavizado de
la senal de voz. 3) Es un metodo preciso, rapido, y adecuado para implementarse en
sistemas computacionales.
Funciona buscando el mınimo error que se produce al extrapolar el valor de una
muestra de voz x(n) partiendo de la informacion que proporcionan las k muestras an-
teriores x(n − 1), x(n − 2), . . ., x(n − k), para esto se utilizan los metodos lineales.
[Ber00, 144].
x(n) =k∑
i=1
ai · x(n− i) (7.1)
donde:
Para calculan los coeficientes ai minimizando el error, se aplica mınimos cua-
drados. Primero se forma el error cuadratico medio L dentro de un intervalo n que se
desea considerar (de un maximo de N muestras).
L =∑
n
e2(n) = x(n)−k∑
i=1
ai · x(n− i) (7.2)
37
CAPITULO 7. PREDICCION LINEAL 38
0 ≤ n ≤ N − 1
donde:
x(n) muestra actualx(n) muestra predicha
n intervalo de muestrasi ındice de una muestra anteriork maximo de muestras anterioresai coeficiente de una muestraN tamano de un conjunto de muestrasL mınimo valor cuadratico medio
Para calcular el valor mınimo de L se deriva con respecto a cada una de las va-
riables aj | 1 ≤ j ≤ k
∂L
∂aj= 0 1 ≤ j ≤ k (7.3)
derivando la ecuacion [7.2]
∂L
∂aj=
∂
∂aj
∑
n
(
x(n)−k∑
i=1
ai · x(n− i)
)2
= 0
ordenando∑
n
∂L
∂aj=∑
n
∂
∂aj
(
x(n)−k∑
i=1
ai · x(n− i)
︸ ︷︷ ︸v
)2
= 0
notese que:
dcdx = 0 dvn
dx = n · vn−1 dvdx
∂
∂aj(v) =
∂
∂aj
(x(n) −
k∑
x=1
ai · x(n− i)
)
=∂
∂aj
(x(n)
)− ∂
∂aj
( k∑
i=0
ai · x(n− i)
)
=∂
∂aj
(x(n)
)−
k∑
i=1
∂
∂aj
(ai · x(n− i)
)
=
0︷ ︸︸ ︷∂x(n)
∂aj−(
1︷ ︸︸ ︷k∑
i=1
∂ai∂aj
)x(n− i)
︸ ︷︷ ︸si aj = ai
CAPITULO 7. PREDICCION LINEAL 39
∂
∂aj(v) = x(n− j)
∂L
∂aj=∑
n
(2)∂
∂aj
(
x(n)−k∑
i=1
ai · x(n− i)
)2−1
·(
x(n)−k∑
i=1
ai · x(n− i)
)
= 0
∂L
∂aj= −2
∑
n
x(n− j)
(
x(n)−k∑
i=1
ai · x(n− i)
)
= −2∑
n
x(n− j) · e(n) = 0
∂L
∂aj=
∑
n
x(n− j) · e(n) = 0 1 ≤ j ≤ k
Esta expresion anterior tambien se puede desarrollar como:
∑
n
x(n− j) ·(
x(n)−k∑
i=1
ai · x(n− i)
)
=∑
n
x(n− j) · x(n)−k∑
i=1
ai ·∑
n
·x(n− j) · x(n− i)
=
∣∣∣∣∣ Cj0 −k∑
j=1
ai · Cji
donde :
Cji =∑
n
x(n− j) · x(n− i)
1
Una forma de limitar el valor de n en la sumatoria es anular las muestras que
no esten en el intervalo 0 ≤ n ≤ N − 1. Esto es equivalente a colocar una ventana
rectangular en dicho intervalo. Por lo tanto, si Cij = Cji = r|i−j|, entonces los valo-
res de r|i−j| son los coeficientes de una matrız de autocorrelacion cuya propiedad son
la simetrıa. Esto quiere decir que los elementos de la diagonal son iguales (matrız
1[Val77]Val77 Valkenburg M.E. Van, Analisis de Redes, Limusa, 1977. 636 pgs.
CAPITULO 7. PREDICCION LINEAL 40
Toeplitz). Para resolverla se pueden utilizar tanto el metodo de descomposicion Cho-
lesky o bien el algoritmo de Levinson-Durbin. A esto se conoce como el metodo de au-
tocorrelacion, de esta manera,
k∑
i=1
rn(|j − i|) · ai = rn(j) 1 ≤ j ≤ k
o de manera matricial,
⎡
⎢⎢⎢⎢⎢⎢⎢⎣
rn(0) rn(1) rn(2) . . . rnk − 1rn(1) rn(0) rn(1) . . . rn(k − 2)rn(2) rn(1) rn(0) . . . rn(k − 3)...
......
. . ....
rn(k − 1) rn(k − 2) rn(k − 3) . . . rn(0)
⎤
⎥⎥⎥⎥⎥⎥⎥⎦
⎡
⎢⎢⎢⎢⎢⎢⎢⎣
a1a2a3...ak
⎤
⎥⎥⎥⎥⎥⎥⎥⎦
=
⎡
⎢⎢⎢⎢⎢⎢⎢⎣
rn(1)rn(2)rn(3)...
rn(k)
⎤
⎥⎥⎥⎥⎥⎥⎥⎦
(7.4)
Ejemplo. Desarrollar la ecuacion [7.1] para k=5:
x(n) =5∑
i=1
ai · x(n− i)
x(0) = a1x(0 − 1) + a2x(0 − 2) + a3x(0 − 3) + a4x(0 − 4) + a5x(0− 5)
= a1x(−1) + a2x(−2) + a3x(−3) + a4x(−4) + a5x(−5)x(1) = a1x(1 − 1) + a2x(1 − 2) + a3x(1 − 3) + a4x(1 − 4) + a5x(1− 5)
= a1x(0) + a2x(−1) + a3x(−2) + a4x(−3) + a5x(−4)x(2) = a1x(2 − 1) + a2x(2 − 2) + a3x(2 − 3) + a4x(2 − 4) + a5x(2− 5)
= a1x(1) + a2x(0) + a3x(−1) + a4x(−2) + a5x(−3)x(3) = a1x(3 − 1) + a2x(3 − 2) + a3x(3 − 3) + a4x(3 − 4) + a5x(3− 5)
= a1x(2) + a2x(1) + a3x(0) + a4x(−1) + a5x(−2)x(4) = a1x(4 − 1) + a2x(4 − 2) + a3x(4 − 3) + a4x(4 − 4) + a5x(4− 5)
= a1x(3) + a2x(2) + a3x(1) + a4x(0) + a5x(−1)x(5) = a1x(5 − 1) + a2x(5 − 2) + a3x(5 − 3) + a4x(5 − 4) + a5x(5− 5)
= a1x(4) + a2x(3) + a3x(2) + a4x(1) + a5x(0)
Capıtulo 8
Filtros Digitales
8.1 Transformada Z. La transformada Z es un metodo matematico desarrollado
para el analisis de senales en el tiempo discreto y de sistemas. Es una genarlizacion
de la Transformada de Fourier Discreta en el tiempo (DTFT, Discrete-Time Fou-
rier Transform). Es la contraparte de la transformada de Laplace para el analisis de
senales en el tiempo contınuo y de sistemas. Se utiliza para resolver: (1) los coeficien-
tes constantes de una ecuacion de diferencias, (2) calcular la respuesta de un sistema
lineal inavariante en el tiempo a una entrada de dato, y (3) en el diseno de filtros li-
neales [Hay99, 142].
8.2 Eigenfuncion. Es una palabra alemana (eigenfunciton) que quiere decir fun-
cion caracterıstica, funcion propia, o funcion natural [Ham89, 25]. Son las raices ca-
racterısticas y los valores propios de una matrız. Kurosh apunta que “... las rai-
ces caracterısticas desempenan un gran papel en el estudio de las transformaciones
lineales”[Kur75, 210]. En muchos problemas de filtros, las funciones trigonometricas,
senos y cosenos, son la base de la representacion de las senales. Hamming dice: “...
son eigenfunciones para (1) la invarianza bajo la traduccion por una cantidad arbi-
traria, (2) los sistemas lineales, (3) los systemas de muestreo igualmente espaciados”.
Con respecto a la transformada Z anade que “... es una simple notacion convencio-
nal y no contibuye en nada a la teorıa [de los filtros digitale]”[Ham89, 34-35].
41
CAPITULO 8. FILTROS DIGITALES 42
8.3 Definicion de Z. La transformada-z de una senal x(n) discreta en el tiempo
se define como
X(z) =∞∑
n=−∞x(n)z−n
donde z = rejω es una variable compleja. Los valores de z donde la suma converge
definen la ROC (Region of Convergence). Es decir, la ROC es una una region en el
plano-z donde la suma converge. Si x(n) tiene transformada-z X(z) podemos escribir
x(n)Z←→ X(z)
Es posible ver la transformada-z como la transformada DTFT de una secuencia pon-
derada de manera exponencial. Es decir, si z = rejω,
X(z) =∞∑
n=−∞x(n)z−n =
∞∑
n=−∞[r−nx(n)]e−jnω
se puede observar que X(z) es la transformada de Fourier discreta en el tiempo de la
secuencia r−nx(n)
Debido a que ls transformada-z es una funcion de variable compleja, conviene
expresarla utilizando el plano-z complejo, ası:
z = Re(z) + jIm(z) = rejω
%%Re(z)
Im(z)
ω
Figura 8.1: Cırculo unitariop en el plano-z complejo.
Muchas de las senales de interes en el procesamiendo de senales digitales que
tienen transformada-z son funcionas racionales de la forma
X(z) =B(z)
A(z)=
∑qk=0 b(k)z
−k
∑pk=0 a(k)z
−k
CAPITULO 8. FILTROS DIGITALES 43
Factorizando los polinomios del numerador y el denominador es posible expresar la
transformada-z como la razon de productos
X(z) =
∏qk=1(1− βkz−1)
∏pk=1(1− αkz−1)
donde las raices del poinomio del numerador βk son los ceros de X(z), y las raices
del polinomio denominador αk son los polos de X(z).
8.4 Ecuacion de diferencias. Un filtro digital esta representado por una ecuacion
de diferencias de la misma forma como un filtro analogico esta representado por una
ecuacion diferencial. Para resolver una ecuacion de diferencia necesitamos encontrar
la transformada-z de las expresiones tales como x(n − k), la cual corresponde a la
kesima derivada dk x(t)dt de una senal analogica x(t). El orden de la ecuacion de dife-
rencia esta determinada por el mayor valor de k. Por ejemplo, k = 2 representa una
derivada de segundo orden [Cha99, 95-96].
X(z) =∞∑
n=0
x(n)z−n
= x(0) + x(1)z−1 + x(2)z−2 + . . .
Entonces la transformada-z de x(n− 1), la cual corresponde a un derivada de primer
orden dxdt sera
ZTx(n− 1) =∞∑
n=0
x(n− 1)z−n
= x(−1) + x(0)z−1 + x(1)z−2 + x(2)z−3 + . . .
= x(−1) + z−1 x(0)z−1 + x(1)z−2 + x(2)z−3 + . . .︸ ︷︷ ︸
X(z)
= x(−1) + z−1X(z)
donde x(n− 1) representa las condiciones iniciales asociadas con una ecuacion de di-
ferencia de primer orden. De la misma forma ZT de x(n− 2) equivalente a la segun-
da derivada de d2x(t)dt2
ZTx(n− 2) =∞∑
n=0
x(n− 2)z−n
CAPITULO 8. FILTROS DIGITALES 44
= x(−2) + x(−1)z−1 + x(0)z−2 + x(1)z−3 + . . .
= x(−2) + x(−1)z−1 + z−2 x(0) + x(1)z−1 + . . .︸ ︷︷ ︸
X(z)
= x(−2) + x(−1)z−1 + z−2X(z)
donde x(−2) y (x− 1) representan las dos condiciones iniciales requeridas para resol-
ver una ecuacion de diferencia de segundo orden. En general
ZTx(n− k) = z−kk∑
m=1
x(−m)z−m + z−kX(z)
si las condiciones iniciales son todas cero, entonces x(−m) = 0 para m = 1, 2, . . . , k.
Esta se reduce a
ZTx(n− k) = z−kX(z)
8.5 Ecuacion estandard para DSP. Es posible tener una ecuacion programable
estandard que facilite su inmplementacion en los procesadores de senales digitales,
como puede ser la siguiente ecuacion de diferencias [Whi00, 5],
y = (b−1y−1 + · · ·+ b−my−m) + (ax+ a−1x−1 + · · ·+ (a−nx−n)
con lo cual, a partir de la anterior y con pequenas variantes, podemos escribir la si-
guiente ecuacion modificada [Whi00, 56].
y(n) = b1y(n− 1) + b2y(n− 2) + · · ·+ bMy(n−M)
+a0x(n) + a1x(n− 1) + a2x(n− 2) + · · ·+ aNx(n−M)
8.6 Transformacıon Bilineal BLT. Una forma de obtener un filtro digital IIR a
partir del diseno de un filtro analogico es utilizando el metodo de transformacion bi-
lineal (BLT, Bilinear Transform Method) [Whi00, 94].
T
2
z + 1
z − 1=
1
s
s =2
T
z − 1
z + 1
Capıtulo 9
Filtros Analogicos
9.1 Filtro pasa alto
Recordando que un capacitor se comporta en corto circuito para las frecuencias
altas, entonces: 1
vi
C
R vo
Figura 9.1: Filtro pasa alto
9.1.1 Funcion de transferencia en funcion de ω.
por divisor de tension,
v0 =viR
1jωC +R
despejando vi,
v0vi
=R
1jωC +R
multiplicando por jωC
vovi
=RjωC
1(jω/C)(jω/C) +R(jωC)
1Ver pg. 605, Kalechman Misza, Practical Matlab Applications for Engineers, CRC Press, 2009.686 pgs.
45
CAPITULO 9. FILTROS ANALOGICOS 46
tenemos que,
v0vi
=jωRC
1 + jωRC
dividiendo entre RC,
v0vi
=jωRC
RC1
RC + jωRCRC
se tiene
H(ω) =jω
1RC + jω
reordenando,
H(ω) =jω
jω + 1RC
(9.1)
la magnitud |H(w)| debera ser,
|H(w)| =
√√√√ (jω)2
(jω)2 + ( 1RC )
2
simplificando,
|H(w)| =
√(jω)2
√(jω)2 +
√( 1RC )
2
tenemos que,
|H(w)| =ω
ω2 + ( 1RC )
2(9.2)
Podemos graficar la expresion (9.2) para valores de 0 > ω < 2π, o bien,
9.1.2 Funcion de transferencia en funcion de s.
De la expresion (9.1) s = jω se tiene,
H(s) =s
s+ 1RC
(9.3)
dividiendo entre s,
H(s) =1
1 + 1sRC
(9.4)
Utilizando la funcion freqs() de matlab graficamos (respuesta en frecuencia en el
dominio de laplace) la expresion (9.4) para valores de R = 8Ω y C = 3,97 µF
CAPITULO 9. FILTROS ANALOGICOS 47
>> s=2*pi;>> R=8;>> C=0.00000397;>> A=1/(s*R*C);>> W=0:1000:3*A;>> H=freqs([1 0],[1 A],W);>> plot(W,abs(H));
0 5000 10000 150000
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
9.1.3. Factor de calidad Q para un circuito serie RLC.
Sean las siguientes expresiones para analizar el factor de calidad de un circuito
electrico resonante RLC en serie.
Frecuencia de resonancia f0 en hertz,
f0 =
√1
LC;
frecuencia de resonancia ω0 en rads/seg.,
W0 = 2πf0;
factor de calidad Q0 en funcion de la inductancia,
Q0 =ω0L
R;
factor de calidad Q0 en funcion del capacitancia,
Q0 =1
ω0RC;
frecuencia ω1 de limite inferior,
ω1 = ω0
(
− 1
2Q0+
√1
4Q20
+ 1
)
;
frecuencia ω2 de limite superior,
ω2 = ω0
(1
2Q0+
√1
4Q20
+ 1
)
;
ancho de banda ∆ω en funcion de la inductancia,
∆ω =R
L;
ancho de banda ∆ω en funcion de ω0 y Q0,
∆ω =ωo
Q0.
CAPITULO 9. FILTROS ANALOGICOS 48
vi
L
R vo
Figura 9.2: Filtro pasa bajo
vi
L C
R vo
Figura 9.3: Filtro pasa banda
Lbaja = 3,3mH
8ΩLmedia = 27µH
Cmedia = 47µF
8Ω
Cmedia = 3,9µF
8Ω
Figura 9.4: Red de cruce de tres vias
Capıtulo 10
Escribiendo Textos con LATEX
10.1 Compilar un proyeto de libro en TEX. Uno de los problemas con los que
se enfrenta un escritor es que no encuentra la forma de organizar los elementos logicos
de un documento escrito como pueden ser: la portada, resumenes, capıtulos, anexos,
grıficas y figuras, bibliografıa, entre otros. Por ejemplo surge la pregunta ¿en donde
y como colocar cada una de las carpetas que contiene cada capitulo?. Hechemos un
vistazo a como esta organizado el presente documento.
El archivo de control que tiene mayor jerarquia dentro de la topologıa de un
arbol gerarquico es mlib.tex, el cual contiene las siguientes instrucciones en LATEX.
\input macros/macros.tex\input macros/silabas.tex\makeindex\documentclass[oneside]book\usepackagemakeidx\inputmacros/mpaquets.tex\inputmacros/espanol.tex\begindocument\pagenumberingroman\thispagestyleempty\inputportada/portada.tex\pagenumberingarabic\def\tablenameTabla\def\listtablenameındice de tablas\tableofcontents\listoffigures\listoftables\inputcapi01/capi01.tex\inputcapi02/capi02.tex\inputcapi03/capi03.tex\inputBibliografia/bibliografia.tex
49
CAPITULO 10. ESCRIBIENDO TEXTOS CON LATEX 50
\appendix\inputanexo01/anexo01.tex\inputanexo02/anexo02.tex\printindex\enddocument
10.2 Crear referencias cruzadas. Una referencia cruzada es un listado alfabetico,
normalmente al final del documento que permite localizar un tema de acuerdo con
una lista de palabras clave. Utilize el siguiente comando para crear dicha lista de re-
ferencias.
makeindex mlib.idx
10.3 Compilacion del archivo principal LATEX. Sea el archivo principal
mlib.tex que contiene las instrucciones con la estructura comentada, compilar como
sigue.
latex mlib.tex
10.4 Impresion de fichas de trabajo. Nuestro trabajo de investigacion normal-
mente lo escribimos en fichas de trabajo. Una ficha de trabajo es una cartulina que
tienen un tamano de 5 x 8 pulgadas. El tamano esta definido por:
\setlength\texthigth4.5in -- altura del texto
\setlength\textwidth7.5in -- anchura del texto
\setlength\voffset0.25in -- desplazamiento margen vertical.
\setlength\hoffset1.5in -- desplazamiento margen horizontal.
Ejemplo:
Compilar: latex file.texConvertir a PDF: dvipdfm -l file[.dvi]
Imprimir con: Acrobat.Impresora: HP LaserJet 1015/1022.
Orientacion del papel: Horizontal.Tipo de papel Carta.
CAPITULO 10. ESCRIBIENDO TEXTOS CON LATEX 51
10.5 Impresion de fichas bibliograficas. Es recomendable que la investigacion
bibliografica quede escrita en fichas bibliograficas. Una ficha bibliografica es una car-
tulina que tienen un tamano de 3 x 5 pulgadas.
\setlength\texthigth2.75in -- altura del texto
\setlength\textwidth4.5in -- anchura del texto
\setlength\voffset1in -- desplazamiento margen vertical.
\setlength\hoffset4.75in -- desplazamiento margen horizontal.
Ejemplo:
Compilar: latex file.texConvertir a PDF: dvipdf -l file[.dvi]
Imprimir con: Acrobat.Impresora: HP LaserJet 1015/1022.
Orientacion del papel: Horizontal.Tipo de papel carta.
10.6 Instalacion MusicTEX en Linux. Descargar la ultima version musictex.zip
desde algun sitio disponible, colocarlo en una carpeta de usuario, y descomprimirlo.
Ejemplo: maquina Intel con Fedora 3.
1.- Verificar que exista el siguiente directorio, si no, es necesario crearlo.
/usr/local/share/texmf
2.- Copiar todos los archivos TEX al directorio ( si no existe, crearlo).
/usr/local/share/texmf/tex/musictex/
3.- Copiar todos los archivos DOC (*.doc) al directorio ( si no existe, crearlo).
/usr/local/share/texmf/doc/musictex/ -- en mi caso no hay
4.- Copiar todos los archivos mf al directorio ( si no existe, crearlo).
/usr/local/share/texmf/fonts/source/musictex/
CAPITULO 10. ESCRIBIENDO TEXTOS CON LATEX 52
5.- Copiar todos los archivos tfm al directorio ( si no existe, crearlo).
/usr/local/share/texmf/fonts/tfm/musictex/
6.- Despues de colocar los macros y los fonts en los directorios apropiados , ejecutar
los siguientes comandos (como root) para actualizar el medio ambiente TEX.
#mktexlsr
#mktexlsr /usr/local/share/texmf
10.7 Instalacion MusicTEX Mac OSX. Los siguientes pasos son para una iMac
con macOS Sierra Version 10.12.2 (mayo 2012)
1.- Verificar que exista el siguiente directorio.
/usr/local/texlive/2016/texmf-dist
Si no existe, vea en donde se encuentra con
$kpswhich -var-value TEXMFLOCAL
2.- Copiar todos los archivos TEX al directorio ( si no existe, crearlo).
/usr/local/texlive/2016/texmf-dist/tex/musictex
3.- Copiar todos los archivos DOC (*.doc) al directorio ( si no existe, crearlo).
/usr/local/texlive/2016/texmf-dist/doc/musictex
4.- Copiar todos los archivos mf al directorio ( si no existe, crearlo).
/usr/local/texlive/2016/texmf-dist/fonts/source/musictex
5.- Copiar todos los archivos tfm al directorio ( si no existe, crearlo).
/usr/local/texlive/2016/texmf-dist/fonts/tfm/musictex
CAPITULO 10. ESCRIBIENDO TEXTOS CON LATEX 53
6.- Despues de colocar los macros y los fonts en los directorios apropiados , ejecutar
los siguientes comandos (como root) para actualizar el medio ambiente TEX.
$sudo mktexlsr
$sudo mktexlsr /usr/local/texlive/2016/texmf-dist
Podemos comprobar el funcionamiento recompilando uno de los archivos que
acompanan al sistema, por ejemplo compilando y visualizando el manual musicdoc.tex
con la siguiente secuencia de comandos.
Compilando musicdoc.doc
$latex musicdoc
esto genera el archivo musicdoc.dvi y visualizaremos con el comando xdvi:
$xdvi musicdoc
10.8 Instalacion MusixTEX Mac OSX. Descargar la ultima version musixtex des-
de algun sitio disponible, colocarlo en una carpeta de usuario, y descomprimirlo. Los
siguientes pasos son para una iMac con macOS Sierra Version 10.12.2 (mayo 2012)
(1) ¿Donde esta texmf. Preguntar con
$kpswhich -var-value TEXMFLOCAL
/usr/local/texlive/2016/texmf-dist
Capıtulo 11
Programando con Java.
11.1 instalacion en MS-Windows. Hay dos maneras de hacer la instalacion en
una computadora con MS Windows. La primera es instalar Java directamente desde
la red conectandose directamente a sun.java.com. Esto se conoce como instalacion
en linea. La segunda es descargar todo el paquete, grabarlo en un CD, y realizar des-
de este CD la instalacion misma. Se recomienda esto ultimo, pues ya no es necesario
conectarse a la red en caso de que esta se vuelva lenta. A continuacion sigamos los si-
guientes pasos de dicha instalacion.
1.- Descargar la version mas actual, hasta agosto del 2007:
jdk-6u2-windows-i586-p.exe
2.- Ejecutar para descomprimir, quedando JDK en
C:\>Archivos de Programa/Java/jdk1.6.0_02
jre1.6.0_02
3.- Es necesario establecer la variable PATH para que Win32 conozca los comandos
ejecutables. Esto se puede hacer directamente en la consola, o lo mas practico y re-
comendable: crear un archivo por lotes.
desde consola:
C:\>set PATH=%PATH%;C:\Archivos de Programa\Java\jdk1.6.0_02\bin;
54
CAPITULO 11. PROGRAMANDO CON JAVA. 55
editar archivo por lotes setjava6002.bat con la siguiente secuencia:
set PATH=%PATH%;C:\Archivos de Programa\java\jdk1.6.0_02\bin;
ejecutando:
c:\>setjava6002
4.- Listos para trabajar con java.
C:\>javac archivo.java --compilar
C:\>java archivo --ejecutar
11.2 Instalacion en Linux. En linux, no es necesario instalar, Java ya viene con
este sistema operativo.
$javac archivo.java --compilar
$java archivo --ejecutar
Capıtulo 12
Programando Sonido con MatLab.
12.1 Captura de audio. MatLab contiene varias funciones que permite procesar
sonido utilizando el sistema de audio que vine integrado en una computadora digital
moderna. Asegurese que haya un microfono conectado a la terjeta de sonido, o bien
utilizar el microfono integrado. Tambien asegurese que el sonido se pueda escuchar
en el altavoz de la maquina.
Para la captura de audio utilizaremos la funcion wavrecord(n, s, c, d), donde n
es la cantidad de muestras de audio, s es la frecuencia de muestreo y c es el numero
de canales, y d es el numero de bits por muestra. Ejemplo: capturar y depositar en
el vector x 16000 datos, a 8000 muestras por segundo, monocanal, y con datos de 16
bits por muestra [Mcl09, p: 8].
x = wavrecord(16000,8000,1,’double’);
Por otro lado, para leer un archivo.wav utilizar la funcion wavread(file), don-
de file es el nombre del archivo. Ejemplo: leer el archivo max.wav y depositar los
datos en el vector x.
x = wavread(’file.wav’);
Para reproducir el sonido utilizar la funcion sound(x, s), donde x es el vector
de datos que contiene el sonido, y s es la frecuencia de muestras por segundo. Ejem-
plo: reproducir el sonido que se encuentra en el vector x.
56
CAPITULO 12. PROGRAMANDO SONIDO CON MATLAB. 57
sound(x);
o bien, reproducir x a 8000 muestras por segundo:
sound(x,8000);
Tambien es posible utilizar la funcion wavplay(x, s) para el mismo proposito.
Ejemplo: Ejemplo: reproducir el sonido que se encuentra en el vector x.
wavplay(x);
o bien, reproducir x a 8000 muestras por segundo:
wavplay(x,8000);
Es conveniente, ademas de escuchar el sonido, obtener una grafica del vector x,
lo cual se logra con la funcion plot(x). Ejemplo, graficar el sonido de x:
plot(x);
Capıtulo 13
Programando con SAPI
¿Que es SAPI?, ¿como funciona?, ¿como programarlo?, ¿quien la invento?, ¿en
donde empezo?,
13.1 Introduccion
SAPI (Speech Application Program Interface) es una interfase de reconocimien-
to y sıntesis de voz con base en las versiones de Microsoft Windows. Tiene 4 sub-
interfases para aplicaciones bien definidas: 1) reconocimiento de comandos, 2) texto
hablado, 3) dictado, y 4) telefonıa . Estas interfases a su vez se dividen en dos partes:
a) alto nivel, y b) bajo nivel 1 .
Las interfases de alto nivel son faciles de implementar, pero se pierde control en
la aplicacion, se dividen en 4 bloques: 1) voice command, reconoce comandos habla-
dos; 2) voice dictation, reconocedor de habla contınua; 3) voice text es un sintetiza-
dior que transforma un texto escrito a voz; y 4) voice telephony reconoce la de voz a
traves de lıneas telefonicas.
Por otro lado, las interfases de bajo nivel son mas difıciles de implementar, pe-
ro dan mas control en la aplicacion, se dividen en dos bloques: 1) Direct Speech Reco-
nigtion, reconocedor de voz a bajo nivel; y 2) Direct Text to Speech, sintetiza la voz
a bajo nivel.
13.2 Ejmplo: holasapi.cpp
1Manual (help), Microsoft Speech SDK (SAPI 5.1), Chap. 4
58
CAPITULO 13. PROGRAMANDO CON SAPI 59
cl holasapi.cpp /I "C:\Archivos de programa\Microsoft Speech SDK 5.1\Include" holasapi.cpp ole32.lib
//-----------------------------------// holasapi.cpp -probar texto a voz.//-----------------------------------#include <sapi.h>
int main(int argc, char* argv[])
ISpVoice *pVoice = NULL;
if (FAILED(::CoInitialize(NULL)))return FALSE;
HRESULT hr = CoCreateInstance(
CLSID_SpVoice,NULL,
CLSCTX_ALL,IID_ISpVoice,
(void **)&pVoice);
if(SUCCEEDED(hr))
hr = pVoice->Speak(L"Hello ANGELICA", 0, NULL);pVoice->Release();pVoice = NULL;
::CoUninitialize();return TRUE;
Capıtulo 14
Programando con SDL
¿Que es SDL?, ¿como funciona?, ¿como programarlo?, ¿quien la invento?, ¿en
donde empezo?.
14.1 Introduccion
60
Capıtulo 15
Detecion del pitch
¿Que es el pitch?, ¿para que sirve?, ¿cuantas formas existen para obtener el
pitch?,
15.1 El Pitch. Se define como el periodo que existe entre los ciclos abierto y cerra-
do que producen las cuerdas vocales. La frecuencia fundamental f0 de la voz puede
variar entre 30 a 350 hz (33 - 2.8 ms.). Dicha frecuencia se define como la cantidad ¿Que esel pitch?
de pulsos de volumen glotal que se plican al conducto vocal en un segundo. El inver-
so de dicha frecuencia es el tono de la voz o pitch [Men89, 37].
Hoy en dia existen varios algoritmos que permiten la deteccion del pitch: 1) Metodosde detec-cion delpitch
SIFT (Simplified Inverse Filter Tracking); 2) AMDF (Average Magnitude Diference
Function). Veremos con mas amplitud el metodo SIFT.
15.2 Filtros Latice. Un filtro latice es una cascada de redes de dos puertos. Una
red de dos puertos se define por el valor de sus coeficientes de reflexion [Hay99, 298].
Esta estructura se utiliza en al analisis y sıntesis de voz debido a que se requieren po- ¿Que esun filtrolatice?cos coeficientes, con los cuales es posible modelar muchos formantes en tiempo real.
Una latice todo-cero representa un filtro FIR para un filtro latice. Una latice escale-
ra (ladder) representa un filtro IIR[Ing07, 212].
En [Hay99, p:299] se definen los coeficientes de reflexion kn como una funcion
61
CAPITULO 15. DETECION DEL PITCH 62
recursiva:
Ak−1(z) =1
1− Γ2k
[Ak(z)− Γkz−k · Ak(z
−1)]
para k = p, p− 1, p− 2 . . . 1
En terminos de los coeficientes ai sera:
ak−1(i) =1
1− Γ2k
[ak(i)− Γkz−k · Ak(z
−1)]
para k = p, p− 1, p− 2 . . . 1
ak−1(k − 1) = Γk−1
El polinomio Ak(z) define los coeficientes igualando Γk = ak(z).
x[n]
×
1
+y[n]
z−1
Retardo ×
a
y[n] = 1 · x[n] + a · x[n− 1]
Y (z) = 1 ·X(z) + a ·X(z) · z−1
Y (z) = X(z)[1 + a · z−1]
Y (z)
X(z)= 1 + a · z−1
y[n] = x[n] + a y[n− 1] (15.1)
CAPITULO 15. DETECION DEL PITCH 63
x[n]+
y[n]
z−1
Retardo×a
Figura 15.1: Filtro dependiente de sus valores de entrada y salida.
Capıtulo 16
Cadenas de Markov
¿Que son las cadenas de Markov?, ¿como funcionan?, ¿como programarlas?,
¿quien las invento?, ¿en donde empezo?.
16.1 Introduccion
64
Capıtulo 17
Redes Neuronales
¿Que es una neurona?, ¿como funciona?, ¿como programarla?, ¿quien la inven-
to?, ¿en donde empezo?,
17.1 Introduccion
65
Capıtulo 18
Funciones y Macros en C
18.1 Codigo fuente comun en Win32 (miwin.h). Cuando programamos grafi-
cos con el sistema operativo windows de microsoft (Win32), existe codigo que siem-
pre se repite. Por esta razon escribiremos aquı un archivo de encabezado escrito en
C (anexo B) y que llamaremos miwin.h . De esta manera, cuando escribamos algun
codigo en C que lo requiera solamente lo incluiremos al principio de nuestros progra-
mas que queremos mostrar.
18.2 Aritmetica compleja.
18.2.1 Estructura.
#include<stdio.h>#include<math.h>
typedef struct
float real;float imag;
COMPLEX;
COMPLEX NUM,DEN;COMPLEX A[11],B[11];
18.2.2 Impresion.
COMPLEX wcomplex(COMPLEX numero)
printf("[%10.6f + j%10.6f]",numero.real,numero.imag);return(numero);
66
CAPITULO 18. FUNCIONES Y MACROS EN C 67
18.2.3 Leectura.
COMPLEX rcomplex(float a, float b)
COMPLEX numero;numero.real=a;numero.imag=b;return(numero);
18.2.4 Suma.
COMPLEX cadd(COMPLEX a, COMPLEX b)
COMPLEX numero;numero.real = a.real + b.real;numero.imag = a.imag + b.imag;return(numero);
18.2.5 Resta.
COMPLEX csub(COMPLEX a, COMPLEX b)
COMPLEX numero;numero.real = a.real - b.real;numero.imag = a.imag - b.imag;return(numero);
18.2.6 Producto.
COMPLEX cmul(COMPLEX a, COMPLEX b)
COMPLEX numero;numero.real = (a.real * b.real) - (a.imag * b.imag);numero.imag = (a.real * b.imag) + (a.imag * b.real);return(numero);
18.2.7 Division.
CAPITULO 18. FUNCIONES Y MACROS EN C 68
COMPLEX cdiv(COMPLEX a, COMPLEX b)
COMPLEX numero;numero.real = ((a.real * b.real) + (a.imag * b.imag))/
((b.real*b.real)+(b.imag*b.imag));numero.imag = ((a.imag * b.real) - (a.real * b.imag))/
((b.real*b.real)+(b.imag*b.imag));return(numero);
18.2.8 Magnitud.
float norm(COMPLEX a)
return(sqrt(pow(a.real,2) + pow(a.imag,2)));
18.2.9 Operaciones.
main()
double x;COMPLEX A,B,C,D;
A=rcomplex(0.5,0.7);B=rcomplex(0.3,0.8);printf(" A = ");wcomplex(A); printf("\n");printf(" B = ");wcomplex(B); printf("\n");printf(" A+B = ");C=cadd(A,B); // C=A+Bwcomplex(C); printf("\n");printf(" A-B = ");C=csub(A,B); // C=A-Bwcomplex(C); printf("\n");printf(" A*B = ");C=cmul(A,B); // C=A*Bwcomplex(C); printf("\n");printf(" A/B = ");C=cdiv(A,B); // C=A/Bwcomplex(C); printf("\n");D=A; // D=Aprintf(" D=A ");wcomplex(D); printf("\n");x=norm(A); // x=abs(A)printf(" norm(A) = [%f]\n",x);
18.3 Convertir hexadecimal a cadena de bits -h2bits().
CAPITULO 18. FUNCIONES Y MACROS EN C 69
/*=========================================================** h2bits(x,s) -convierte byte x a cadena de bits ASCII.** Regresa: s=cadena de bits.** char s[8];** h2bits(0x55,s);** printf("%s",s);** 01010101;**=========================================================*/h2bits(char x, char *s)
int i;for(i=0;i<8;i++)
if (x<0) *s++=’1’;else *s++=’0’;x=x<<1;*s=’\0’;
return(1);
/*=========================================================
18.4 Poner bit n de x en cero -setbit0().
/*=========================================================** setbit0(x,n) -poner en 0 el bit n del byte x.** Regresa: Byte x con el nuevo valor.**=========================================================*/setbit0(char x, *n)
return(*x=*x&~(1<<n));
18.5 Poner bit n de x en uno -setbit1().
/*=========================================================** setbit1(x,n) -poner en 1 el bit n del byte x.** Regresa: Byte x con el nuevo valor.**=========================================================*/setbit1(char *x, int n)
return(*x=*x|1<<n);
18.6 Probar bit n de x -getbit().
/*=========================================================** getbit(x,n) -regresa el valor del bit n del byte x.** Regresa: 1 si ON, 0 si OFF.
CAPITULO 18. FUNCIONES Y MACROS EN C 70
**=========================================================*/getbit(char *x, int n)
return((*x&(1<<n))?1:0);
18.7 Driver de sonido MIDI Win32 -klsnd().
//-----------------------------------------------------------// NAME:// klsnd.c -driver MIDI para Win32.// REM:// Driver de sonido MIDI para MS-Windows.// Compilado con:// CL Visiual Studio 6.0// GCC MinGW.// Dr. Maximino Pe~na Guerrero. Febrero 10, 2007.// ----------------------------------------------------------#include<windows.h>#include<mmsystem.h>HMIDIOUT handle;//-----------------------------------------------------------// klopnm() -abrir diispositivo MIDI.// ----------------------------------------------------------int klopnm()
// printf("abre sonido\n");if (midiOutOpen(&handle,(UINT)-1,0,0,CALLBACK_NULL))
printf("midiOutOpen(): error\n");return(0);
return(1);
//-----------------------------------------------------------// klclsm() -cerrar diispositivo MIDI.//-----------------------------------------------------------int klclsm()
midiOutClose(handle);return(1);
//-----------------------------------------------------------// klnton() -tocar una nota.//-----------------------------------------------------------int klnton(char nota)
static union DWORD dwData; UCHAR bData[4];u;//printf("Toca nota\n");u.bData[0] = 0x90;u.bData[1] = nota;u.bData[2] = 127;u.bData[3] = 0;
CAPITULO 18. FUNCIONES Y MACROS EN C 71
if (midiOutShortMsg(handle, u.dwData))
printf("Error: midiOutShortMsg()\n");midiOutClose(handle);exit(1);
Sleep(300);return(1);
//-----------------------------------------------------------// klnton() -apagar una nota.//-----------------------------------------------------------int klntof(char nota)
static union DWORD dwData; UCHAR bData[4];u;//printf("Apaga nota\n");u.bData[0] = 0x80;u.bData[1] = nota;u.bData[2] = 0;u.bData[3] = 0;if (midiOutShortMsg(handle, u.dwData))
printf("Error: midiOutShortMsg()\n");midiOutClose(handle);exit(1);
return(1);
18.8 Leer un byte de memoria Win32 -peekw(). Esta funcion (peekw()) lee un
byte de la memoria y lo regresa en el valor de la funcion. Fue probada en sistemas
con Windows NT.
/*==============================================================*//* NAME *//* peekw() -leer un byte de memoria. *//* SINOPSIS *//* char peekw(seg,offs); *//* EXAMPLE *//* char x; *//* x=peekw(0xb800,0x0000); *//* DATE *//* Maximino Pe~na Guerrero, noviembre 26, 2001. *//*==============================================================*/char peekw(int unsigned seg,unsigned int offs)
char far *ptr;unsigned long tmp=seg;(long) ptr=0x00000000;(long) ptr=tmp<<16;
CAPITULO 18. FUNCIONES Y MACROS EN C 72
return(*(ptr+offs));
El siguiente codigo lee un bytes de la memoria de video y lo muestra.
main()
printf("[%x]\n",peekw(0xb800,800));return(1);
18.9 Escribir un byte en memoria Win32 -pokew(). Pokew() escribe un by-
te en la memoria controlada por MS-Windows. Fue probada en sistemas con NT.
Utilıcese con cuidado bajo la ventana de DOS, porque escribe en memoria de video.
/*==============================================================*//* NAME *//* pokew() -escribir un byte en memoria. *//* SINOPSIS *//* char pokew(seg,offs,byte); *//* EXAMPLE *//* pokew(0xb800,0x0000,0x41); //escribir ’A’ en video *//* DATE *//* Maximino Pe~na Guerrero, noviembre 26, 2001. *//*==============================================================*/char pokew(int unsigned seg,unsigned int offs,unsigned char byte)
char far *ptr;unsigned long tmp=seg;(long) ptr=0x00000000;(long) ptr=tmp<<16;*(ptr+offs)=byte;return(byte);
El siguiente codigo escribe el caracter ’A’ en la pantalla con fondo de color ama-
rillo.
main()
int i,j=0;for (i=0;i<80;i++)pokew(0xb800,800+j,0x41);pokew(0xb800,800+j+1,0x9C);j=j+2;
return(1);
CAPITULO 18. FUNCIONES Y MACROS EN C 73
18.10 Vaciar memoria (emulacion con un buffer) -dump().
/*==============================================================*//* NAME *//* dump() -vaciar memoria. *//* SINOPSIS *//* int dump(seg,offs,nbytes); *//* USO *//* dump(0xB800,0,260); *//* *//* *//* SSSS:OOOO XX XX XX XX XX XX XX XX .................. *//* SSSS:OOOO XX XX XX XX XX XX XX XX AAAAAAAAAAAAAAAAAAA *//* DATE *//* Maximino Pena Guerrero, noviembre 24, 2001. *//*==============================================================*/int dump(int segment, int offset, int nbytes)
int i,j,n;char hascii[8];
for(i=0;i<300;i++) memory[i]=0x3E;
n=nbytes;
printf("segment:%x\n",segment);
for(i=0; i<n/16;i++)
printf("%4d:",i*15+offset++);
for(j=0;j<16;j++)
itoa(memory[i*16+j],hascii,16);printf("%s ",hascii);
for(j=0;j<16;j++)
if(isprint(memory[i*16+j])) printf("%c",memory[i*16+j]);else printf(".");
putchar(’\n’);if (i % 8 == 0 && i>0) printf("segment:%x\n",segment);
return(n);
El siguiente codigo muestra el contenido de un buffer de memoria a partir de la
direccion segmento 2, offset 200, y 260 bytes.
# include <stdio.h>
CAPITULO 18. FUNCIONES Y MACROS EN C 74
char memory[3000];main()
dump(2,200,260);
Capıtulo 19
Programando graficas con OpenGL.
19.1 Poner un punto OpenGL -gsetpnt(). Gsetpnt() es un aprimitiva disenada
para colocar un punto en pantalla utilizando la primitiva glVertex2i() de OpenGL.
Es evidente que a partir de dicha funcion es posible programar funciones mas com-
plicadas como la recta, cırculo, entre otras.
void gsetpnt(GLint x, GLint y)
glBegin(GL_POINTS);glVertex2i(x,y);
glEnd();
19.2 Manejo del raton OpenGL -graton().
void graton(GLint button, GLint action, GLint xMouse, GLint yMouse)
if (button==GLUT_LEFT_BUTTON && action== GLUT_DOWN)
mx1=xMouse;my1=winHeight-yMouse;Click=TRUE;
else
if (button==GLUT_RIGHT_BUTTON && action== GLUT_DOWN)
mx2=xMouse;my2=winHeight-yMouse;Click=FALSE;
if (action==GLUT_DOWN) displayFnc();
19.3 Obtener flechas del teclado OpenGL -gflechas().
75
CAPITULO 19. PROGRAMANDO GRAFICAS CON OPENGL. 76
void gflechas(GLint flecha, GLint xMouse, GLint yMouse)
switch(flecha)case GLUT_KEY_LEFT:
if (Click==TRUE) mx1--; elseif (Click==FALSE) mx2--; break;
case GLUT_KEY_RIGHT:if (Click==TRUE) mx1++; else;if (Click==FALSE) mx2++; break;
case GLUT_KEY_UP:if (Click==TRUE) my1++; else;if (Click==FALSE) my2++; break;
case GLUT_KEY_DOWN:if (Click==TRUE) my1--; else;if (Click==FALSE) my2--; break;
default: break;displayFnc();
19.4 Servicio timer OpenGL -gtimer().
void gtimer(int value)
if (Dibujar==TRUE)
DibujarLinea(0,0,xx,100);glutPostRedisplay();xx=(xx+10)%200;
glutTimerFunc(33,gtimer,1);
19.5 Graficar spline OpenGL -gspline(). DrawSpline grafica un spline utilizan-
do cuatro puntos, un punto inicial de coordenadas (x1, y1), otro punto final de coor-
denadas (x4, y4), primer punto de control de coordenadas (x2, y2), segundo punto de
control de coordenadas (x3, y3), y por ultimo un factor de escala z con valores entre
cero y uno ( 0 ¡z ¡1).
void gspline(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2,GLfloat x3,GLfloat y3,GLfloat x4,GLfloat y4,GLfloat z)
GLint i;GLint j;
CAPITULO 19. PROGRAMANDO GRAFICAS CON OPENGL. 77
GLfloat t;GLfloat x;GLfloat y;
for(t=0.0;t<1;t+=0.001)
x = pow((1.0-t),3.0)*(x1*z) + 3.0*t*pow((1.0-t),2.0)*(x2*z)+ 3*pow(t,2.0)*(1.0-t)*(x3*z)+ pow(t,3.0)*(x4*z) ;
y = pow((1.0-t),3.0)*(y1*z) + 3.0*t*pow((1.0-t),2.0)*(y2*z)+ 3*pow(t,2.0)*(1.0-t)*(y3*z)+ pow(t,3.0)*(y4*z);
plotPoint(x,y);
Capıtulo 20
Programando con C/C++
Existen varias versiones de Microsoft Visual Studio con las cuales es posible
desarrollar programas utilizando el medio ambiente de desarrollo, o bien utilizando la
linea de comandos. Hemos probado todas las versiones (incluso MinGW, compilador
de Software Libre GNU): Visual Studio 6.0, Visual Studio .NET 2001, Visual Studio
.NET 2003, Visual Studio .NET Express 2008, y Visual Studio .NET 2008 Standard.
Haremos un apartado para cada una de ellas.
20.1 Crear un proyecto MFC vacıo en forma manual desde Win32. MFC
Microsoft Fundation Class es una biblioteca de clases creada por Microsoft para faci-
litar y optimizar los recursos fısicos y de software de una maquina. Vamos a crear el
siguiente proyecto sin emplear el ayudante (Wizard). 1 [p.3]
(1) Iniciar Visual C++ 6.0 para crear un proyecto nuevo. En la barra Menu se-
lecionar File enseguida new.
(2) En la ventana de dialogo New seleccionar Win32 Application, Project na-
me: prueba.
(3) En la ventana de dialogo Win32 Aplication Step 1 of 1 seleccionar el cırcu-
lo An empty Project, Next, New Project Information, OK para terminar.
(4) Establecer las propiedades del proyecto. En la barra Menu seleccionar
Project. Luego seleccionar settings para establecer las caracterısticas de nuestra apli-
1[Sal05] Salleh Shaharuddin, et., Numerical simulations and case studies using Visual C++.NET,Wiley & Sons, 2005.
78
CAPITULO 20. PROGRAMANDO CON C/C++ 79
cacion.
(5) En la ventana de dialogo Project Settings seleccionar la pestana General.
En el cuadro dialogo de entrada Microsoft Fundation Classes: Use MFC in a Shared
DLL. Esto incluira MFC para generar un archivo ejecutable.exe.
20.2 Editar nuevos archivos dentro de un proyecto MFC vacıo Win32. En
esta seccion suponemos que existe un proyecto MFC vacıo creado de manera manual
del tipo Win32 An empty Project.
(1) Editar un archivo de encabezado del proyecto file.h. En la barraMenu, se-
leeccionar Project, despues seleccionar Add to project, luego New. Aparecera la ven-
tana de dialogo New. En la pestana Files seleccionar C/C++ Header File. En el cua-
dro de entrada File name colocar el nombre del archivo file.h, para iniciar su edicion.
(2) Editar un archivo.c/cpp file.c/cpp. En la barra Menu, seleeccionar
Project, despues seleccionar Add to project, luego New. Aparecera la ventana de
dialogo New. En la pestana Files seleccionar C++ Source File. En el cuadro de en-
trada File name colocar el nombre del archivo file.cpp, para iniciar su edicion.
20.3 Anexar archivos existentes a un proyecto MFC vacıo Win32. Si no
queremos editar nuevos arcivos y queremos aprovechar los que ya se hallan escrito en
otras aplicaciones, e aquı como anexar dichos archivos a un proyecto vacıo. En esta
seccion suponemos que existe un proyecto MFC vacıo creado de manera manual del
tipo Win32 An empty Project.
Anexar fuente file.c/cpp existente.
(1) Copiar archivo file.c/cpp al nuevo proyecto.
(2) En la ventana del explorador seleccionar Source Files, luego en la barra
Menu, seleeccionar Project, Add to project, y Files.
(3) Seleccionar la ventana de dialogo Insert Files into Project, y en el cuadro de
entrada Nombre escribir el nombre del archivo file.c/cpp, dar OK para terminar.
Anexar archivo de encabezado file.h.
CAPITULO 20. PROGRAMANDO CON C/C++ 80
(1) Copiar el archivo a la nueva carpeta que se ha creado.
(2) En la ventana del explorador seleccionar Header Files, luego en la barra
Menu, seleeccionar Project, Add to project, y Files.
(3) Seleccionar la ventana de dialogo Insert Files into Project, y en el cuadro de
entrada Nombre escribir el nombre del archivo file.h, dar OK para terminar.
Anexar el archivo de recursos file.rc.
(1) Copiar el archivo a la nueva carpeta que se ha creado.
(2) En la ventana del explorador seleccionar Header Files, luego en la barra
Menu, seleeccionar Project, Add to project, y Files.
(3) En la ventana de dialogo Insert Files into Project. En el cuadro de entrada
Nombre escribir el nombre del archivo file.rc y dar OK para terminar.
Anexar los archivos de biblioteca user32.lib y gdi32.lib.
(1) En la ventana de dialogo Project Settings seleccionar la pestana Link.
(2) En el cuadro dialogo de entrada dar Category: Input.
(3) En el cuadro dialogo de entrada dar Object/Library modules: user32.lib
gdi32.lib y OK para establecer la API Windows.
Compilamos y verificamos que no hallan errores de compilacion. Al correr la
aplicacion veremos que sale un mensaje en la ventanita de error IDC ERROR de
Windows que dice error: NO AFXRES.H. Copiar afxres.h (o resourse.rc) para so-
lucionarlo. Si al enlazar dice: INK : fatal error LNK1104: cannot open file “De-
bug/testRelacion.exe”, salir de Visual y volver a entrar con el proyecto.
20.4 Anexar un contenedor de dialogo a un proyecto MFC manual Win32.
Una ventana de dialogo es un contenedor que permite acomodar controles como bo-
tones, barras, imagenes, entre otros. Ahora vamos a crear un contenedor de dialogo
a partir de una aplicacion simple. 2
En la ventana Worspace seleccionar la pestana FileV iew y marcar Resource
2 ıdem [p: 41]
CAPITULO 20. PROGRAMANDO CON C/C++ 81
Files. Con el boton derecho del raton seleccionar Add Files to Folder. En la venta-
na Insert Files Into Project que aparece escribir el archivo de recursos file.rc; pulsar
OK para crear el archivo file.rc. Abrir el archivo file.rc con el boton derecho del ra-
ton seleccionando la opcion Open.
Ahora, en la pestana ResourceV iew de la ventana Workspace seleccionar Fi-
le Resources, luego seleccionar la opcion Insert. En la ventana Insert Resource que
aparece seleccionar el tipo de recurso Resource type: Dialog. Presionar New para in-
sertar el recurso y activar el editor de recursos.
20.5 Crear proyecto MFC vacıo basado en DIALOG con Wizard. Ahora
vamos a crear, de una manera automatica, un proyecto vacıo llamado prueba con ba-
se en un contenedor de dialogo utilizando el ayudante Wizard. La diferencia con la
creacion de un proyecto MFC vacıo con base solamente en un proyecto Win32 Project
(An empty Project), es que en esta seccion el proyecto se crea de manera automati-
ca utilizando las herramientas de ayuda que proporciona Visual Studio, como son los
editores y el Wizard.
Iniciar Visual C++ 6.0, en la barra Menu selecionar File, y enseguida new. En
la ventana de dialogo New seleecionar MFC AppWizard(exe), Project name: prue-
ba. En la ventana de dialogo MFC AppWizard Step 1 seleccionar el cırculo Dialog ba-
sed, luego pulsar Next. En MFC AppWizard Step 2 of 4 dejar solamente marcado el
cırculo 3D controls, luego pulsar Next. Luego en MFC AppWizard Step 3 of 4 selec-
cionar MFC Standard y No, thank you, luego Next. Y por ultimo en MFC AppWi-
zard Step 4 of 4 seleccionar la clase CPruebaApp, despues pulsar Finish.
A continuacion compilar la aplicacion, la cual generara cuatro archivos fuente:
File.cpp, Prueba.rc, PruebaDlg.cpp, StdAfx.cpp; y cuatro archivos de cabecera: File.h,
PruebaDlg.h, Resource.rc, StdAfx.h.
20.6 Crear un proyecto esqueleto MFC completo. Hagamos un proyecto lla-
mado prueba para investigar todo lo relacionado con la graficacion, colocacion de va-
CAPITULO 20. PROGRAMANDO CON C/C++ 82
rables globales, caja de entrada de texto, caja de presentacion de texto, entre otros ob-
jetos que se requieren. A continuacion se creara un proyecto vacıo utilizando Wizard.
Iniciar Visual C++ 6.0, en la barra Menu selecionar File, y enseguida new. En
la ventana de dialogo New seleecionar MFC AppWizard(exe), Project name: prueba.
En la ventana de dialogo MFC AppWizard Step 1 seleccionar el cırculo Single docu-
ment, luego pulsar Next. En MFC AppWizard Step 2 of 4: Next; MFC AppWizard
Step 3 of 6: next; En MFC AppWizard Step 4 of 6 desactivar las casillas Docking Tool-
bar, Initial Status Bar y Printing and Print dejando solo 3D Controls. MFC AppWi-
zard Step 5 of 6: next; En MFC AppWizard Step 5 of 6 y de la ventana Base Class
seleccionar la opcion CFormView para tener el formulario como vista principal. Fi-
nalizar con Finish, compilar y correr el proyecto.
20.7 Crear boton en contenedor DIALOG. Arrastrar el boton al contenedor.
En Propiedades cambiar a ID: IDC CALCULAR y Caption: Calcular.
20.8 Crear variable miembro de boton. Invocar Class Wizard con Ctrl-W. De la
pestana Member Variable en el cuadro Proyect: Prueba. Class Name: CPruebaView,
picar Add Variable: m Calcular.
20.9 Crear la funcion de un boton. Picar ClassV iew en el WorkSpace donde
se despliega el menu Prueba Clases. Picar PruebaV iew (despliega otro menu), picar
Add Member Function. Activar Function Tipe: void, Function Declaration: graficar,
Access: public. Editar la funcion graficar().
20.10 Crear un componente bitmap en DIALOG Ahora vamos a crear una fo-
tografia bitmap de una (o un ıcono) dentro de una aplicacion con base en cuadro de
dialogo MFC. Es de suponer que antes ya se ha generado un archivo bitmap de una
formula matematica hecha en LATEX, o un ıcono generado con el editor de bitmaps de
VC++ 6.0.
Primero Seleccionar Insert y luego Resource. En el dialogo Insert Resource se-
CAPITULO 20. PROGRAMANDO CON C/C++ 83
leccionar Resource type: Bitmap. En este mismo dialogo seleecionar el boton Import
para selecionar al archivo.bmp que se va a insertar. Del cuadro de controles Con-
trol tool box seleccionar el control Picture y colocarlo en el dialogo principal. En es-
te mismo control, con el boton derecho del raton selecionar Propertiese. En el dialo-
go Picture Propierties cambiar el tipo de control a Type: Bitmap y tambien Image:
IDB BITMAP1. 3
20.11 Compilar con lınea de comandos una aplicacion DIALOG existente.
Es posible compilar, con el GCC de MinGW, una aplicacion con base en DIALOG,
la cual haya sido creada con VC++6.0 y su editor de recursos. Normalmente Visual
C++ 2008 Express o Standard (.NET), no vienen con su propio editor de recursos,
pero si es posible compilar dicha aplicacion utilizando la linea de comandos estandar
dentro de una ventana de comandos (MS-DOS).
Para lograr lo anterior, primero utilizaremos las versiones de compiladores Mi-
crosoft Visual Studio C++ 6.0, C++2008 Express o Standard. Ahora, abrir una ven-
tana de comandos para crear una nueva carpeta con C:\>mkdir carpeta. Esta nue-
va carpeta debe estar de preferencia cerca de la raiz del directorio principal C:\>.
Copiar los archivos archivo.c, archivo.rc, resourse.h, resourse.hm desde su
carpeta con C:\carpeta\>copy C:\path\archivo.c. Enseguida compilar el archivo
de recursos.rc con C:\>rc archivo.rc. Con esto se genera el nuevo archivo de re-
cursos archivo.RES necesario para la compilacion. Finalmente generar el archivo eje-
cutable archivo.exe de la nueva aplicacion con:
C\:>cl archivo.c user32.lib gdi32.lib archivo.res
Utilizando el compilador GCC de MinGW realizar lo siguiente para generar el archi-
vo ejecutable. Primero generar el archivo de recursos archivo.res con
C:\carpeta\>windres -o archivo.o archivo.rc
3funte: www.functionx.com/visualc/applications/displaybitmap.htm
CAPITULO 20. PROGRAMANDO CON C/C++ 84
Finalmente generar archivo.exe
C:\carpeta\>gcc -o archivo archivo.c -luser32 -lgdi32 archivo.o
Cabe mencionar que para quitar, poner mas botones, o bien modificar los recursos
existentes es necesario hacerlo con el editor de recursos con los que fueron creados
(en este caso VC++6.0). Es necesario, entonces, volver a repetir los pasos anteriores
para actualizar nuestra nueva aplicacion. Cabe tambien senalar que con esta moda-
lidad de compilacion, las modificaciones al archivo fuente archivo.c se pueden hacer
con cualquier editor de texto (gvim, notepad, edit, entre otros).
20.12 Enviar un mensaje Win32 Cada vez que se produce un evento se debe en-
viar y procesar un mensaje. PostMessage() coloca dicho mensaje en la cola de men-
sajes asociada a la ventana y regresa sin esparear notificacion. Su estructura es la si-
guiente:
BOOL PostMessage
HWND hWnd, // handle de la ventana destino
UINT Msg, // mensaje
WPARAM wParam, // primer parametro del mensaje.
LPARAM lParam // segundo parametro del mensaje.
Ejemplo: Repintar los objetos de una ventana enviendo el mensaje WM PAINT.
PostMessage(hwnd, WM PAINT, 0, 0L);
Ejemplo: Envier el mensaje SC CLOSE para cerrar la aplicacion y salir al sistema
operativo.
PostMessage(hwnd, WM SYSCOMMAND, SC CLOSE, 0L);
20.13 Enviar mensaje WM PAINT. Este mensaje sirve para pintar una
ventana completa o una parte de la misma. Si el codigo de graficacion se
encuentra entre las funciones BeginPaint(hwnd,&ps) y EndPaint(hwnd,&ps),
CAPITULO 20. PROGRAMANDO CON C/C++ 85
utilizar la funcion InvalidateRect(hwnd,NULL, TRUE) para generar el men-
saje. Por otra parte, si dicho codigo de graficacion se encuentra entre las
funciones GetDC(hwnd) y ReleaseDC(hwnd, hdc) entonces utilizar la funcion
PostMessage(hwnd,WM PAINT, 0, 0L) para enviar dicho mensaje.
Cabe mensionar que con esto ultimo, es posible refrescar porciones de la venta-
na creando varios rectangulos de graficacion, ası;
HDC hdc1,hdc2;
HWND hwnd;
hdc1=GetDC(hwnd);
hdc2=GetDC(hwnd);
Rectangle(hdc1,x1,y1,x2,y2);
Rectangle(hdc2,x11,y11,x22,y22);
//Codigo de graficacion;
ReleaceDC(hwnd,hdc1);
ReleaceDC(hwnd,hdc2);
Capıtulo 21
Programando con MIDI
21.1 ¿Que es una nota? Podemos definir una nota musical por la funcion N(f, r,m)
donde f es la frecuencia (tono) de la nota, r es el tiempo de duracion de dicha nota
(ritmo) y m es la melodıa asociada a la frecuencia de la nota, de tal forma que es po-
sible tocar varias notas en paralelo.
El nombre de cada nota en version latina es la siguiente. Con sostenidos: do,
do♯, re, re♯, mi, fa, fa♯, sol, sol♯, la, la♯ y si. Con bemoles: do, re, re, mi, mi, fa,
sol, sol, la, la, si y do; En la version anglosajona es la que sigue. Con sostenidos:
C, C♯, D, D♯, E, F , F ♯, G, G♯, A♯ y B. Con bemoles: C, D, D, E, E, F , G, G,
A, A, B, B y C.
21.2 Constante de Bach Los tonos de 2 notas estan separadas por la constante
12√2 = 2
112 = 1,059463094 . . ., que aquı llamaremos la constante de Bach. En general,
la frecuencia fn de una nota musical esta dada por la expresion 21.1
fn = 2n12 fref Hz. (21.1)
donde, fref es la frecuencia de referencia, y n es el numero de semitonos a partir de
dicha referencia [?][?].
Ejemplo 1. ¿Cual es la frecuencia fn de do5♯ (o reb), si la frecuencia de referancia de la4 es fref =440? Resultado: Si la posiscion de do♯ se encuantra cuatro semitonos arriba de la frecuencia de re-ferencia (la4), entonces
fn = 2n12 fref
86
CAPITULO 21. PROGRAMANDO CON MIDI 87
= 2412 · 440
f4 = 554,365 Hz.
Ejemplo 2. ¿Cual sera la frecuencia de la nota do4 a partir dela nota la4? Resultado: Si la notado4 se encuentra 9 semitonos hacia abajo (es decir, -9 semitonos), entonces
fn = 2n12 fref
= 2−912 · 440
f−9 = 251,625 Hz.
Cabe senalar que por acuerdo internacional, la frecuencia de audio de 440 Hz
esta asociada a la nota LA4 (A4) situada en la octava cuatro (subındice) de un piano de
referencia [?]. La Tabla 21.1 muestra la frecuencia de cada tono, la nota, y su octava.
Tabla 21.1: Correspondencia entre: frecuencia (hertz) de nota(i), posicion en octa-va(j), y tono.
C D D E E F G G A A B BC C♯ D D♯ E F F♯ G G♯ A A♯ BDO RE RE MI MI FA SOL SOL LA LA SI SIDO DO♯ RE RE♯ MI FA FA♯ SOL SOL♯ LA LA♯ SI
(i)(j) 0 1 2 3 4 5 6 7 8 9 10 11
0 16.35 17.32 18.35 19.44 20.60 21.82 23.12 24.49 25.95 27.50 29.13 30.861 32.70 34.64 36.70 38.89 41.20 43.65 46.24 48.99 51.91 55.00 58.27 61.732 65.40 69.29 73.41 77.78 82.40 87.30 92.49 97.99 103.82 110.00 116.54 123.473 130.81 138.59 146.83 155.56 164.81 174.61 184.99 195.99 207.65 220.00 233.08 246.944 261.62 277.18 293.66 311.12 329.62 349.22 369.99 391.99 415.30 440.00 466..16 493.885 523.25 554.36 587.32 622.25 659.25 698.45 739.98 783.99 830.60 879.99 932.32 987.766 1046.50 1108.73 1174.65 1244.50 1318.51 1396.91 1479.97 1567.98 1661.21 1759.99 1864.65 1975.537 2093.00 2217.46 2349.31 2489.01 2637.02 2793.82 2959.95 3135.96 3322.43 3519.99 3729.31 3951.06
21.3 Octava MIDI Una octava MIDI, denotada por O u O′, es un conjunto de do-
ce notas asociadas a una seccion del teclado de un sintetizador; con sostenidos (♯),
expresion 21.2:
O = C,C♯, D,D♯, E, F, F ♯, G,G♯, A, A♯, B, (21.2)
o bien con bemoles (), expresion 21.3:
O′ = C,D, D, E, E, F,G, G, A, A, B, B. (21.3)
El teclado de un sintetizador, denotado por P , es un conjunto de octavas On
CAPITULO 21. PROGRAMANDO CON MIDI 88
concatenadas dentro del espacio del teclado, expresion 21.4,
P = O0, O1, O2, . . . , On, (21.4)
para un sintetizador MIDI de concierto con ocho octavas, n = 7; donde n es el nume-
ro de octava. Los tonos de la notas de O7 (octava siete) tienen el doble de frecuencia
de los tonos de las notas que pertenecen a O6 (octava seis); asimismo, las de O5 tie-
nen el doble de O4, y ası sucesivamente.
21.4 Tono MIDI Un tono MIDI es el elemento Xij de la matriz X cuyo numero en-
tero n = Xij es asignado a cada tecla de un sintetizador MIDI o piano electronico. Los
elementos de la matriz estan agrupados por notas y octavas; donde: i = 0, 1, 2, . . . , 11
es la nota de la escala musical; j = 0, 1, 2, . . . , 7 es la octava que contiene la nota; y
n = 0, 1, 2, . . . , 95 es el tono Xij de la nota, tal como se muestra en la expresion (21.5),
X =
⎡
⎢⎢⎢⎢⎣
X0,0 X1,0 . . . X11,0
X0,1 X1,1 . . . X11,1...
... Xi,j...
X0,7 . . . . . . X11,7
⎤
⎥⎥⎥⎥⎦; (21.5)
con base en octavas y notas, la notacion Xij permite a los sistemas MIDI transmitir
y recibir tonos y notas sin importar la octava [?]. Aplicando el teorema del residuo,
y dado que 0 ≤ n ≤ 95, se obtiene que, el tono n de la nota de una octava esta da-
da por la expresion (21.6)
n = j(12) + i, (21.6)
donde n es el tono, el cociente es la octava (j), y el residuo es la nota (i). La Tabla
21.2 y la Figura 21.1, muestran esta relacion.
21.5 Escala cromatica MIDI De acuerdo con la Figura 21.1, y teniendo en cuen-
ta la notacion que corresponde a cada una de las teclas (blancas y negras) de un seg-
mento del teclado de piano, considerese lo siguiente:
Una escala cromatica MIDI esta definida por el conjunto Ec cuyos elementos
son tonos consecutivos n, n+1, n+2, . . ., n+12, tal que n es llamado tono raız don-
CAPITULO 21. PROGRAMANDO CON MIDI 89
Tabla 21.2: Relacion n entre octavas(j), notas(i) y tonos(n), dado por n = j(12) + i.
C D D E E F G G A A B BC C♯ D D♯ E F F♯ G G♯ A A♯ BDO RE RE MI MI FA SOL SOL LA LA SI SIDO DO♯ RE RE♯ MI FA FA♯ SOL SOL♯ LA LA♯ SI
Nota(i)Octava(j) 0 1 2 3 4 5 6 7 8 9 10 11
0 0 1 2 3 4 5 6 7 8 9 10 111 12 13 14 15 16 17 18 19 20 21 22 232 24 25 26 27 28 29 30 31 32 33 34 353 36 37 38 39 40 41 42 43 44 45 46 474 48 49 50 51 52 53 54 55 56 57 58 595 60 61 62 63 64 65 66 67 68 69 70 716 72 73 74 75 76 77 78 79 80 81 82 837 84 85 86 87 88 89 90 91 92 93 94 95
de comienza la escala (Expresion 21.7),
Ec = n, n+1, n+2, n+3, n+4, n+5, n+6, n+7, n+8, n+9, n+10, n+11, n+12,
(21.7)
por ejemplo, para el caso especıfico del segmento de teclado mostrado en la Figura
21.1; si i = 0, j = 4, entonces el tono raız es n = i+ j(12) = 48, por lo que, la escala
comienza con la nota C4 (DO4) de la octava 4. Es decir, con sostenidos: C4, C4♯, D4,
D4♯, E4, F4, F4♯,G4,G4♯, A4, A4♯, B4, C5. Con bemoles: C4,D4,D4, E4, E4, F4,G4,
G4, A4, A4, B4, B4, C5. Los tonos Xij de la matriz son: 48, 49, 50, 51, 52, 53, 54 55,
56, 57, 58, 59, y 60. Para este caso se consideran todas las teclas (blancas y negras).
21.6 Escala MIDI en modo mayor Asimismo, una escala MIDI en modo mayor
esta definida por el conjunto EM cuyos elementos son tonos consecutivos n, n + 2,
n + 4, n + 5, n + 7 n + 9, n + 11, y n + 12, tal que n es el primer elemento llamado
tono raız donde comienza la escala (expresion 21.8),
EM = n+ 0, n+ 2, n+ 4, n+ 5, n+ 7, n+ 9, n+ 11, n+ 12, (21.8)
por ejemplo, si i = 0, j = 4, el tono raız es n = i+ j(12) = 48 entonces, la escala em-
pieza con la nota C4 (DO4). Es decir, C4, D4, E4, F4, G4, A4, B4, C5. Los tonos Xij
CAPITULO 21. PROGRAMANDO CON MIDI 90
DO RE MI FA SOL LA SIC D E F G A B48 50 52 53 55 57 59
Xn+0 Xn+2 Xn+4 Xn+5 Xn+7 Xn+9 Xn+11
DO♯REC♯D49
Xn+1
RE♯MID♯E51
Xn+3
FA♯SOLF♯G54
Xn+6
SOL♯LAG♯A56
Xn+8
LA♯SIA♯B58
Xn+10
Figura 21.1: Nombres, sımbolos, variables, y teclas de un piano (octava 4).
de la matriz son: 48, 50, 52, 53, 55, 57, 59 y 60. Las teclas negras la Figura 21.1 no
estan consideradas para este caso.
21.7 Escala MIDI en modo menor. Una escala MIDI en modo menor esta definida
por el conjunto Em cuyos elementos n, n+2, n+3, n+5, n+7, n+8, n+10, y n+12 son
tonos consecutivos, tal que n es el tono raız donde comienza la escala (expresion 21.9),
Em = n + 0, n+ 2, n+ 3, n+ 5, n+ 7, n+ 8, n+ 10, n+ 12, (21.9)
Ejemplo. ¿Cuales seran las notas de la escala menor si la primera nota raiz esta dada por los ındi-ces i = 0 y j = 4?
Solucion.
De la matriz X04, el tono raız sera
n = j(12) + i
n = 4 · 12 + 0
n = 48
entonces, la escala comienza con la nota do4 (C4) localizada en la octava 4.
Em = (48 + 0), (48 + 2), (48 + 3), (48 + 5), (48 + 7), (48 + 8), (48 + 10), (48 + 12)
CAPITULO 21. PROGRAMANDO CON MIDI 91
Em = 48, 50, 51, 53, 55, 56, 58, 60
con sostenidos,
Em = re4, re4♯, fa4, sol4, sol4♯, la4♯, do5Em = D4, D4♯, F4, G4, G4♯, A4♯, C5
con bemoles
Em = do4, re4,mi4, fa4, sol4, la4Em = C4, D4, E4, F4, G4, A4
21.8 Acorde MIDI Si dos o mas notas se tocan al mismo tiempo, entonces se pue-
de construir una estructura de acorde. Ası, un acorde mayor esta definido como:
AM = n+ 0, n+ 4, n+ 7 (21.10)
donde: n es el tono raız del acorde. Por ejemplo, si n=48, el acorde de DO mayor
(CM) tendra las notas DO, MI, y SOL (C,E,G) y los numeros MIDI 48H , 52H, y 55H ;
en la Figura 21.2 se muestra la notacion musical para esta estructura.
Figura 21.2: Acorde de DO mayor (CM ).
Capıtulo 22
Sistemas Digitales
22.1 Representacion posicional de un numero. Cualquier numero se puede re-
presentar por la suma del producto de cada dıgito y su base elevada a la potencia de
su posicion (expresion 22.1),
x =n∑
i=0
xi · bi +−m∑
j=−1
xj · bj (22.1)
donde x es un numero entero del sistema representado, b es el dıgito de la base del
sistema o coeficiente, i es la posicion de la parte entera, j es la posicion de la parte
fracionaria, n es el numero total de dıgitos, y m es el numero de dıgitos fracionales.
Expandiendo la expresion (22.1) tenemos la expresion (22.2).
x = xn−1bn−1 + xn−2b
n−2 + · · ·x0b0 + x−1b
−1 + x−2b−2 + · · ·+ x−mb
−m (22.2)
Ejemplo. Sea, x = 1983, b = 10, n = 4, m = 0
x = (1983)10
= (1 · 103) + (9 · 102) + (8 · 101) + (3 · 100)= 1000 + 900 + 80 + 3
= 1983
Ejemplo. Sea, x = 353,56, b = 10, m = 2, n = 3
x = (353,56)10
= (3 · 102) + (5 · 101) + (3 · 100) +(5 · 10−1) + (6 · 10−2)
92
CAPITULO 22. SISTEMAS DIGITALES 93
x = 300 + 50 + 30 +
0,5 + 0,06
= 353,56
Ejemplo. Sea, x = 1011, b = 2, m = 0, n = 4
x = (1011)2
= (1 · 23) + (0 · 22) + (1 · 21) + (1 · 20)= 8 + 0 + 2 + 1
= 1110
= BH
Ejemplo. Sea, x = 0111,0111, b = 2,m = 4, n = 4
x = (0111,0111)2
= (0 · 23) + (1 · 22) + (1 · 21) + (1 · 20) +(0 · 2−1) + (1 · 2−2) + (1 · 2−3) + (1 · 2−4)
= 0 + 4 + 2 + 1 + 0,0 + 0,25 + 0,125 + 0,069
= 7 + 0,444
= 7,44410
Bibliografıa
[Amb02] Ambardar Ashok, Procesamiento de senales analogicas y digitales, 2nd. ed.
Thomson, 2002. 811 pgs. Michigan Technological University.
[Amm07] Ammeraal Leen, Kang Shang, Computer Graphics for Java Programmers,
2nd. ed. Wiley, 2007. 376 pgs.
[Cas87] Casacubierta Francisco, Enrique Vidal, Reconocimiento Automatico del Ha-
bla, Marcombo, 1987. 205 pgs.
[Cha99] Chassing Rulph, Digital Signal Processing: Laboratory Experiments Using C
and the TMS320C31DSK, John Wiley & Sons, USA 1999. 305 pgs.
[Ham89] Hamming R. W., Digital Filters, 3rd. ed., Dover, 1989. 284 pgs. Bell Labo-
ratories.
[Hay99] Hayes H. Monson., Theory and Problems of Digital Signal Processing,
Schaum’s McGraw-Hill, 1999. 432 pgs.
[Ing07] Ingle Vinay K., John G. Proakis., Digital Signal Processing using MATLAB,
2nd. ed., CENEAGE Learning Bookware Companion Series, 2007. 605 pgs.
[Kur75] Kurosch A. G., Curso de Algebra Superior, MIR, 1975. 442 pgs.
[Edm70] Edminister Joseph A., Circuitos Electricos: Teorıa y 50 Problemas Resuel-
tos, Schaum, McGraw-Hill, 1970. 289 pgs. Org. Electric Circuits: Theory and
Problems 1969.
94
BIBLIOGRAFIA 95
[Mcl09] McLoughlin Ian, Applied Spech and Audio Processing: With Matlab Exam-
ples, Cambrifge, 2009. 206 pgs.
[Kin67] Kinsler, Lawrence E., Austin R. Frey, Fundamentals of Acoustics, John Wi-
ley & Sons, USA, 1950-1967. 524 pgs.
[Kin93] Kinsler, Lawrence E., Austin R. Frey, Alan B. Coppens, James V. Sanders,
Fundamentos de Acustica, Limusa Noriega Editores, Mex. 1a. ed. 1990, 3a. re-
impresion 1993. 592 pgs.
[Kru01] Krutsch Kenneth F., David S. Cargo, Virginia Howlett, Componentes Java
para el desarrollo de interfases de usuarios, Wrox Anaya Multimedia, Madrid
2001. 511 pgs.
[Men89] Meneses Gonzalez Salvador Ricardo, “Sistema de comunicacion utilizando
codificacion lineal predictiva (LPC)”, Tesis de Maestrıa, CINVESTAV I.P.N., Fe-
brero 1989, Mexico. 129 pgs.
[Nau97] Naughton Patrick, Herbert Schildt, Java: Manual de Referencia, Osborne,
McGraw-Hill, 1997. 764 pgs.
[Pen77] Pena-Guerrero M., “Apuntes de Metrologıa”, coleccion privada, ESIME-IPN,
1977.
[Pet91] Petzold Charles, “Exploring Wave Form Audio Generating Sine Waves in
Software”, PC Magazine, November 26, 1991, pp 505-510.
[Pet99] Petzold Charles, Programing Windows, Microsoft Press, 1999, 1479 pgs.
[Rab78] Rabiner L. R., R. W. Schafer, Digital Processing of Speech Signals, Prenti-
ce, Hall, 1978.
[Rab83] Rabiner L. Juang, Fundamentals of Speech Recognition, Prentice Hall, 1993.
BIBLIOGRAFIA 96
[Sal05] Salleh Shaharuddin, Albert Y. Zomaya, Stephan Alariu, and Bahrom Sanugi,
Numerical simulations and case studies using Visual C++.NET, Wiley & Sons,
2005. 359 pgs.
[Set78] Seto, William W., Acustica, Schaum Mc GrawHill. 1978. 195 pgs.
[Jac73] Jackson, Herber W., Introduccion a los Circuitos Electricos, Diana, Mexico,
1973, 725 pgs.
[Whi00] White Steve, Digital Signal Processing, Delmar Thomson Learning, 2000,
234 pgs.
Diccionario de Terminos
Velocidad. Cambio de la posicion que experimenta un cuerpo con el tiempo [Rıdnik,
p. 112].
Aceleracion. Cambio de la velocidad que experimenta un cuerpo con el tiempo
[Rıdnik, p: 112].
Ecuacion de Schodinger. Ecuacion diferencial en derivadas parciales de segundo
orden, las cuales definen magnitudes que varian en el espacio y en el tiempo [Rıdnik,
p. 138].
97
Apendice A
Programas Fuente
A.1 Protocolo de ventana Win32: mwinh.h
//------------------------------------------------------------------------
// NAME
// miwin.h -protocolo comun para Win32
// REM
// Dr. Maximino Pe~na Guerrero. 090806
// Marzo 10, 2010
// -----------------------------------------------------------------------
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
static TCHAR AppName[]=TEXT("AplicacionWindows") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = AppName ;
if (!RegisterClass (&wndclass))
MessageBox
(
NULL,TEXT("RegisterClass(): error"),
AppName, MB_ICONERROR
98
APENDICE A. PROGRAMAS FUENTE 99
);
return 0 ;
hwnd = CreateWindow
(
AppName,
TEXT(QUEHACE),
WS_OVERLAPPEDWINDOW,
XWIN,
YWIN,
ANCHOWIN,
ALTOWIN,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return(msg.wParam);
A.2 Graficar archivo con datos de punto flotante MFC: gr.c
//---------------------------------------------------------------------
// NAME
// gr.c -graficar un archivo -1+1
// COMPILAR:
// VISUAL STUDIO
// C:\>rc gr.rc --archivo de recursos
// C\:>cl gr.c user32.lib gdi32.lib gr.res
// MINGW
// C:\>windres -o gr.o gr.rc --archivo de recursos
// C\:>cl gr.c -luser32 -lgdi32 gr.o
// COMPILADO CON
// VC++6.0, VC++9.0 (express), VC++9.0 (standard), GCC.
// REM:
// Generar recursos DIALOG con Visual C++ 6.0
// con el editor de recursos.
// Despues ya se puede compilar con linea de comandos.
// DATE:
// Dr. Maximino pe~na Guerrero, 03/12/08
//---------------------------------------------------------------------
//
APENDICE A. PROGRAMAS FUENTE 100
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "resource.h"
BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;
TCHAR szAppName[]=TEXT("IDC_DLG1") ;
int graficarRectangulo(HDC);
int iniciarValores();
int graficarFloat(HDC);
int colocarCoordenadas(HDC);
int graficarMain(HWND);
char str1[20];
char str2[20]="gen3cos.dat";
HPEN pen1;
HPEN pen2;
HPEN pen3;
FILE *fp;
int origenX;
int origenY;
int xa1,ya1,xa2,ya2;
int ancho,alto;
int graficarMain(HWND hwnd)
HDC hdc;
hdc=GetDC(hwnd);
graficarRectangulo(hdc);
colocarCoordenadas(hdc);
graficarFloat(hdc);
ReleaseDC(hwnd,hdc);
return(0);
int graficarRectangulo(HDC hdc)
SelectObject(hdc,pen1);
Rectangle(hdc,xa1,ya1,xa2,ya2);
return(0);
int graficarFloat(HDC hdc)
int i;
APENDICE A. PROGRAMAS FUENTE 101
int x,y;
double aux=0.0;
double nmuestras;
char strdata[20];
if ((fp=fopen(str2,"rb"))==NULL)
TextOut(hdc,400,50,"Error: no existe archivo de datos",33);
return(0);
SelectObject(hdc,pen2);
nmuestras=atoi(str1);
MoveToEx(hdc,origenX,origenY,NULL);
for (i=0; i<nmuestras;i++)
fscanf(fp,"%s",strdata);
aux = atof(strdata);
y = (int)(origenY-(aux * (alto/2)));
x = (int)(origenX+((ancho/nmuestras)*i));
LineTo(hdc,x,y);
// Sleep(25);
fclose(fp);
return(0);
int iniciarValores()
pen1=CreatePen(PS_SOLID,4,RGB(175,175,175));
pen2=CreatePen(PS_SOLID,1,RGB(0,0,255));
pen3=CreatePen(PS_SOLID,1,RGB(100,100,100));
xa1=40; ya1=20; xa2=620; ya2=300;
ancho = xa2-xa1;
alto = ya2-ya1;
origenX = xa1;
origenY = ((ya2-ya1)/2)+ya1;
return(0);
int colocarCoordenadas(HDC hdc)
SelectObject(hdc,pen3);
MoveToEx(hdc,origenX,origenY,NULL);
LineTo(hdc,xa2,((ya2-ya1)/2)+ya1);
MoveToEx(hdc,((xa2-xa1)/2)+xa1,ya1,NULL);
LineTo(hdc,((xa2-xa1)/2)+xa1,ya2);
APENDICE A. PROGRAMAS FUENTE 102
TextOut(hdc,origenX-25,ya1-5,"+1.0",4);
TextOut(hdc,origenX-25,origenY-10,"0.0",3);
TextOut(hdc,origenX-25,ya2-10,"-1.0",4);
return(0);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
if (DialogBox(hInstance, szAppName, NULL, DlgProc)==-1)
MessageBox (NULL, TEXT("Error: no AFXRES.H"), szAppName, MB_ICONERROR);
return 0 ;
BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_INITDIALOG:
SetDlgItemText(hwnd,IDC_EDIT1,TEXT("256"));
SetDlgItemText(hwnd,IDC_EDIT2,str2);
SetDlgItemText(hwnd, IDC_BOTON1, TEXT ("Graficar"));
SetDlgItemText(hwnd, IDC_BOTON2, TEXT ("Salir"));
iniciarValores();
break;
case WM_COMMAND:
switch (LOWORD(wParam))
case IDC_BOTON1:
graficarMain(hwnd);
return(TRUE);
case IDC_BOTON2:
EndDialog(hwnd,0);
return(TRUE);
case IDC_EDIT1:
GetDlgItemText(hwnd,IDC_EDIT1,str1,20);
return(TRUE);
case IDC_EDIT2:
GetDlgItemText(hwnd,IDC_EDIT2,str2,20);
return(TRUE);
break;
case WM_PAINT:
graficarMain(hwnd);
APENDICE A. PROGRAMAS FUENTE 103
break;
case WM_SYSCOMMAND:
switch (wParam)
case SC_CLOSE:
EndDialog (hwnd, 0);
return TRUE ;
break ;
return FALSE ;
A.2.1 Archivo de recursos: gr.rcEste archivo fue generado con el editor de recursos Visual C++ 6.0
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
// Generated Help ID header file
#define APSTUDIO_HIDDEN_SYMBOLS
#include "resource.hm"
#undef APSTUDIO_HIDDEN_SYMBOLS
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE MOVEABLE PURE
APENDICE A. PROGRAMAS FUENTE 104
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE MOVEABLE PURE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE MOVEABLE PURE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Spanish (Mexican) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESM)
#ifdef _WIN32
LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MEXICAN
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDC_DLG1 DIALOGEX 100, 100, 443, 178
STYLE WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "gr.c -graficar [-1 +1]"
FONT 10, "Arial"
BEGIN
PUSHBUTTON "Boton1",IDC_BOTON1,385,125,49,14
EDITTEXT IDC_EDIT1,375,20,56,12,ES_AUTOHSCROLL,0,HIDC_EDIT1
PUSHBUTTON "Button2",IDC_BOTON2,385,155,50,10
EDITTEXT IDC_EDIT2,375,45,56,12,ES_AUTOHSCROLL,0,HIDC_EDIT2
LTEXT "Archivo:",IDC_STATIC,375,35,27,8
LTEXT "Numero de datos:",IDC_STATIC,375,10,60,8
END
/////////////////////////////////////////////////////////////////////////////
//
APENDICE A. PROGRAMAS FUENTE 105
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
"IDC_DLG1", DIALOG
BEGIN
BOTTOMMARGIN, 170
END
END
#endif // APSTUDIO_INVOKED
#endif // Spanish (Mexican) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
A.2.2 Archivo de cabecera: resource.hArchivo generado con Visual C++ 6.0
//NO_DEPENDENCIES
// Microsoft Developer Studio generated include file.
// Used by gr.rc
//
#define IDC_SCROLL 1000
#define IDC_TEXT 1001
#define IDC_ONOFF 1002
#define IDC_BOTON1 1002
#define IDC_EDIT1 1003
#define IDC_BOTON2 1004
#define IDC_EDIT2 1005
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 106
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1006
#define _APS_NEXT_SYMED_VALUE 101
APENDICE A. PROGRAMAS FUENTE 106
#endif
#endif
A.2.3 Archivo de cabecera: resource.hmArchivo generado con Visual C++ 6.0
// Microsoft Developer Studio generated Help ID include file.
// Used by gr.rc
//
#define HIDC_EDIT1 0xffff03eb // "IDC_DLG1" [Spanish (Mexican)]
#define HIDC_EDIT2 0xffff03ed // "IDC_DLG1" [Spanish (Mexican)]
A.3 Entrada de sonido: entrada.c
//---------------------------------------
// entrada.c -capturar entrada de audio.
//
// gcc entrada.c -lwinmm
// cl entrada.c winmm.lib
//---------------------------------------
#include<windows.h>
#include<mmsystem.h>
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define MAXBUF 5000
#define SAMPLE_RATE 44100
VOID PrintBufferIn(LPBYTE);
HWAVEIN fdin;
WAVEFORMATEX wf;
WAVEHDR wh1;
LPBYTE buf1;
int main()
int j;
buf1=(char *)malloc(MAXBUF);
// Inicializar el WAVEFORMATTEX.
for (j=0;j<MAXBUF;j++) *(buf1+j)=0;
wf.wFormatTag=WAVE_FORMAT_PCM;
wf.nChannels=2;
wf.nSamplesPerSec=SAMPLE_RATE;
wf.wBitsPerSample=16;
wf.nBlockAlign=wf.nChannels * (wf.wBitsPerSample/wf.wBitsPerSample);
wf.nAvgBytesPerSec=wf.nSamplesPerSec * wf.nBlockAlign;
APENDICE A. PROGRAMAS FUENTE 107
wf.cbSize=0;
if (waveInOpen(&fdin,WAVE_MAPPER,&wf,0,0,CALLBACK_NULL))
printf("waveInOpen(): error\n");
return(0);
wh1.lpData = buf1;
wh1.dwBufferLength = MAXBUF;
wh1.dwBytesRecorded = 0;
wh1.dwUser = 0;
wh1.dwFlags = 0;
wh1.dwLoops = 1;
wh1.lpNext = NULL;
wh1.reserved = 0;
waveInPrepareHeader(fdin,&wh1,sizeof(WAVEHDR));
waveInAddBuffer(fdin,&wh1,sizeof(WAVEHDR));
waveInStart(fdin);
Sleep(1000);//getchar();
//for(;;)if ((wh1.dwFlags & WHDR_DONE)==1)break;
waveInReset(fdin);
waveInUnprepareHeader(fdin,&wh1,sizeof(WAVEHDR));
waveInClose(fdin);
PrintBufferIn(buf1);
return 0;
VOID PrintBufferIn(LPBYTE buffer)
int i;
for(i=0;i<MAXBUF;i++)
printf("buffer[%d] = [%u]\n",i,buf1[i]);