Audio en formato .wav

Lectura de archivo .wav en python

Para procesar un archivo de audio en formato .wav se usarán las instrucciones de la libreria scipy.
La instruccion usa el archivo con ‘nombre.wav’ dado como variable tipo texto y se obtienen dos variables que representan:
fsonido: frecuencia de muestreo del sonido en PCM y
sonido: que es un arreglo con las muestras del sonido.

El archivo de audio debe encontrarse en el mismo directorio que el script de python, por ejemplo, dado el archivo ‘Alarm.wav’ , se puede procesar con las instrucciones mostradas:

Alarm01.wav

import scipy.io.wavfile as waves

# INGRESO
archivo='Alarm01.wav'
fsonido, sonido = waves.read(archivo)

con lo que se obtiene:

>>> fsonido
22050
>>> sonido
array([[0, 0],
       [0, 0],
       [0, 0],
       ..., 
       [0, 0],
       [0, 0],
       [0, 0]], dtype=int16)
>>> np.shape(sonido)
(122868, 2)

En el ejemplo, la frecuencia de muestreo es de 22050 Hz. El sonido es estéreo al tener dos columnas que corresponden a los canales izquierdo y derecho.
Para usar un solo canal, se copian los datos a un nuevo arreglo. Para separar el canal izquierdo por ejemplo, se usan las instrucciones:

>>> izquierdo=sonido[:,0].copy()
>>> izquierdo
array([0, 0, 0, ..., 0, 0, 0], dtype=int16

Con lo que se tienen los datos listos para ser procesados.

Guardar un archivo de audio .wav

Luego de procesar los datos de audio, y guardar el resultado en un archivo con ‘nombre.wav’ se usa la instruccion waves.write() de la libreria scipy, que requiere:
archivo: el nombre del archivo resultante, con extension.wav
fsonido: la frecuencia de muestreo del sonido (entero)
sonido: el arreglo de la señal de audio como entero de 16 bits (dtype=’int16′).

Recuerde haber invocado a las librerias numpy y scipy que se presentan como referencia en el script.

import numpy as np
import scipy.io.wavfile as waves

# PROCEDIMIENTO
# Arreglos para datos con k muestras
sonidofinal=np.zeros(k, dtype='int16')

# Salida
archivo='audiofinal.wav'
waves.write(archivo, int(fsonido),sonidofinal)

El archivo de audio resultante se escucharà usando un programa como «windows media player»

Notas:
Se puede añadir al nombre la ruta de ubicación del archivo en el disco duro. Ejemplo para windows: ‘C:\Users\mis documentos\archivo.wav

Gráfica de un canal de audio

Para mostrar en un gráfico un canal de audio se usa la libreria matplotlib. Para muestra, usando los datos del ejemplo anterior:

import matplotlib.pyplot as plt

izquierdo=sonido[:,0].copy()

# Salida a gràfico
plt.plot(izquierdo)
plt.show()

con lo que se obtiene la siguiente gráfica:

Con lo que se puede revisar la forma de la señal de audio

Sistemas – Invarianza en el tiempo

Referencia: Oppenheim 1.6.5 p50/pdf78, Lathi 1.7-2 pdf76, Schaum/Hsu p18

Si el comportamiento de un sistema y las características del mismo están fijos en el tiempo, se los llama invariantes en el tiempo.

Por ejemplo, para un circuito RC, los valores de la resistencia y capacitor fijos no varian si se realiza un experimento o medición hoy o mañana.

Expresando lo mismo como:
Un sistema es invariante en el tiempo si aun corrimiento de tiempo en la señal de entrada ocasiona un corrimiento en el tiempo en la señal de salida.

y(t) = x(t)
y(t-t0) = x(t-t0)

Ejemplo 1

Referencia: Oppenheim 1.14 p51/pdf78

Para muestra de lo indicado, considere un sistema definido como:

y(t) = \sin(x(t)) \text{, siendo x(t)=t} y(t-t_0) = \sin(x(t - t_0))

Por otro lado, si la respuesta de la señal se modifica en el tiempo, el sistema será VARIANTE en el tiempo:

Ejemplo 2

Referencia: Oppenheim 1.14 p51/pdf78. Schaum ejercicio 1.39 p48

Considere el sistema:

y(t) = x(2t)

que tiene escalamiento en el tiempo. y(t) es una versión comprimida de x(t). Los corrimientos/desplazamientos en el tiempo también serán comprimidos por un factor de 2, por lo que por ésta razón el sistema no es invariante en el tiempo.

Siguiendo las indicaciones en el problema presentado en Schaum, donde T se conoce como el «operador lineal«:

El sistema tiene una relación de entrada-salida dada por:

y(t) = T{x(t)} = x(2t)

y t0 es un desplazamiento en el tiempo.

Sea y2(t) la respuesta a x2(t) = x(t-t0) entonces:

y2(t) = T{x2(t)} = x2(2t) = x(2t-t0)

y(t-t0) = x(2(t-t0))

y(t-t0) ≠ y2(t), por lo que el sistema no es invariante en el tiempo. 
El sistema x(2t) se conoce como compresor, pues crea una secuencia de salida cada 2 valores de la secuencia de entrada.

Ejemplo 2

Referencia: Schaum/HSU ejercicio 1.38 p47

Desarrollar semejante al ejercicio anterior, en forma analítica y usando Python.

x(t) = t^2 y(t) = t x(t)

sist_invariatiempo02


Desarrollo en Python

Ejemplo 01

# Sistemas – Invariantes en el tiempo
# Oppenheim 1.14 p51/pdf78
import numpy as np

# INGRESO
a = 0; b = 2*np.pi ; dt=0.1
t0 = 1

xt = lambda t: t
yt = lambda t: np.sin(xt(t))

# PROCEDIMIENTO
t = np.arange(a,b,dt)

x1 = xt(t)
y1 = yt(t)


# Corrimiento en la entrada
t2x = t + t0
x2 = x1
# efecto en salida
t2y = t + t0
y2 = y1

# evaluación de tiempos desplazados
y3 = yt(t-t0)

# SALIDA - GRAFICA
import matplotlib.pyplot as plt
plt.figure(1)

plt.plot(t,y1, label='y1(t)')
plt.plot(t2y,y2, 'm.', label='y2(t)')
plt.plot(t,y3, label='y1(t-t0)')

plt.xlabel('t')
plt.legend()
plt.show()

Ejemplo 02

# Sistemas – Invariantes en el tiempo
# Oppenheim 1.16 p52/pdf80
import numpy as np

# INGRESO
a = -5; b = 5 ; dt=0.1
t0 = 2

u = lambda t: np.piecewise(t,t>=0,[1,0])
xt = lambda t: u(t+2)-u(t-2)
yt = lambda t: xt(2*t)

# PROCEDIMIENTO
t = np.arange(a,b,dt)

x1 = xt(t)
y1 = yt(t)

# Corrimiento en la entrada
t2x = t + t0
x2 = x1
# efecto compresor en salida
t2y = t + t0/2
y2 = y1

# evaluación de tiempos desplazados
x3 = xt(t-t0)
y3 = yt(t-t0)

# SALIDA - GRAFICA
import matplotlib.pyplot as plt
plt.figure(1)
plt.subplot(311)
plt.xlim([min(t),max(t)])
plt.plot(t,x1, label='x1(t)')
plt.plot(t,y1, label='y1(t)')
plt.legend()

plt.subplot(312)
plt.xlim([min(t),max(t)])
plt.plot(t2x,x2, label='x2(t)=x1(t-t0)')
plt.plot(t2y,y2, label='y2(t)')
plt.legend()

plt.subplot(313)
plt.xlim([min(t),max(t)])
plt.plot(t,y3,color ='orange', label='y1(t-t0)')
plt.xlabel('t')
plt.legend()
plt.show()

Sistemas – con o sin memoria

Referencia: Oppenheim 1.6.1 p44/pdf71 , Lathi 1.7-3 pdf/p.76, Schaum/Hsu 1.5.C p17

Si la salida de un sistema depende solo del valor aplicado en la entrada para un tiempo cualquiera, se dice que el sistema es sin memoria. Resistor01
El ejemplo más común es un sistema con un resistor:

y(t) = Rx(t)

Por otra parte, si el sistema depende de los valores anteriores de la entrada, se lo considera con memoriacapacitor01

Tal es el caso de un capacitor, cuyo valor de salida depende de lo acumulado desde el tiempo -∞ hasta t.

y(t) =\frac{1}{C} \int_{-\infty}^{t} x(\tau) d\tau

Los sistemas sin memoria también se conocen como instantaneos, que son un caso particular de los sistemas dinámicos (con memoria).

Un sistema  cuya respuesta en t está determinada por los anteriores T segundos, es decir el intervalo (tT), se lo conoce como «sistema con memoria finita»

 

Sistemas – Causalidad

Referencia: Lathi 1.7-4 pdf/p.77, Oppenheim 1.6.3 p46/pdf74, Schaum/Hsu 1.5.D p17

Un sistema es CAUSAL (no-anticipativo o físico) si la salida y(t) en un valor arbitrario de tiempo t=t0 depende solo de la entrada x(t) para t ≤ t0 , es decir depende solo de los valores presentes y/o pasados de la entrada; no depende de valores futuros.

No es posible obtener una salida antes que se aplique la entrada.

Ejemplos:

y(t) = x(t - 1)

si t es en segundos, la salida depende de los valores de x hace un segundo o (t-1)


En el caso contrario, los sistemas NO CAUSALES muestran una salida anticipada a la señal de entrada:

y(t) = x(t + 1)

si t es en segundos, la salida depende de los valores que x tendría un segundo después o (t+1).  Si t es en días, la situación se vuelve complicada de realizar, es como decir: para determinar el valor de la variable y(t) HOY, necesitamos conocer el valor de x(t+1) que es MAÑANA.

https://www.elcomercio.com/guaifai/volver-futuro-tecnologia-futurologia.html

Los sistemas no-casuales por tener variable independiente referenciada a tiempo futuro, no se pueden implementar en tiempo real. Sin embargo si los sistemas no causales se realizan con variables diferentes al tiempo, por ejemplo espacio se podrían implementar.

Aunque si considera que los datos de tiempo registrado para un evento, el análisis se puede realizar en un rango donde los no-causales aún se podrían analizar o procesar aunque no en tiempo real.

Considere los eventos de interés mundial como que se transmiten con un retardo de segundos para corregir «fallos» o por seguridad, se puede aún editar lo que el los observadores en televisión pueden observar, en tiempo «casi real»

Por ejemplo:

» La cadena de televisión NBC transmitirá la ceremonia de apertura de los Juegos Olímpicos de Río de Janeiro 2016 con una hora de retraso …  eso permitirá a los productores «curar» la cobertura para proporcionar un contexto adecuado.» 12-Julio-2016

http://www.hoylosangeles.com/deportes/rio2016/hoyla-rio2016-nbc-transmitira-inauguracion-demora-story.html

«In radio and television, broadcast delay is an intentional delay when broadcasting live material. Such a delay may be short (often seven seconds) to prevent mistakes or unacceptable content from being broadcast.»

https://en.wikipedia.org/wiki/Broadcast_delay

 

Sistemas Interconexiones

Los sistemas pueden crearse a partir de subsistemas más sencillos. La interconexion entre los sistemas permite resolver problemas de mayor complejidad.

La interconexión de dos sistemas puede ser realizada de tres maneras:

  1. Interconexión en serie (cascada)
  2. Interconexión en paralelo
  3. Interconexión en serie-paralelo
  4. Interconexión con retroalimentación.

Para ilustrar las formas de interconexión de forma gráfica se usan los diagramas de bloques, al interconectar las salidas y entradas entre bloques.

Inteconexión en serie

sistema serie

Los subsistemas se conectan secuencialmente usando la salida a una entrada.

Ejemplo: la salida de video de la computadora hacia la entrada de video del proyector en el aula de clases, usada para proyectar el contenido del curso.

Inteconexión en Paralelo

fiec05058Sistema04

La señal de entrada se aplica simultaneamente o en paralelo a dos los subsistemas, el símbolo ‘+’ expresa que el resultado es la suma de los resultados de los sistemas 1 y 2.

Interconexión serie-paralelo

fiec05058Sistema05

Interconexión con retroalimentación

fiec05058Sistema06

Los sistemas retroalimentados permiten «regular» la salida «observando una parte de la misma

Referencia: Oppenheim 1.5.2 pdf/p.69, Schaum/Hsu pdf/p.30

Sistemas – contínuos y discretos

Referencia: Oppenheim 1.5 pdf/p.66, Schaum/Hsu pdf/p.28, Lathi 1.7-5 pdf/p.78

Sistemas contínuos

En un sistema contínuo las señales contínuas de entrada son transformadas en señales  contínuas de salida.

x(t) → y(t)

fiec05058Sistema01

Sistema Discreto

Cuando las entradas de tiempo discreto se transforman en en salidas de tiempo discreto, al sistema se denomina «sistema discreto».

Simbólicamente se representa como:

x[n] → y[n]

fiec05058Sistema02


Sistemas Analógicos y Digitales

Referencia: Lathi 1.7-6 pdf79, 1.3-2 pdf61

Un sistema con señales de entradas y salidas son analógicas es un sistema analógico.

De forma semejante, un sistema cuyas entradas y salidas son digitales es un sistema digital, como una computadora, aunque tambi;en se conoce como un sistema discreto en el tiempol

3.3 Respuesta a impulso – LTIC

Referencia: Lathi Ejemplo 2.4 pdf123, Oppenheim problema 2.2.2 p97/pdf122

A la entrada x(t) de un sistema se aplica un impulso unitario δ(t) semejante a un destello en un tiempo muy pequeño.

El impulso es semejante a tomar una foto con flash en una habitación obscura, con todo tranquilo, sin movimientos. Luego del flash, a pesar que ya no exista más la luz, todos las personas o seres vivos reaccionan al destello de luz durante un tiempo. Es la respuesta al impulso del sistema.

La respuesta del sistema se puede entonces comprender como la suma de una señal contínua enviada por una secuencia de impulsos cuando el tiempo entre impulsos tiende a cero.

Para un sistema de orden 2 parte de la expresión:

Q(D)y(t)=P(D) x(t) (a_0 D^2+a_1 D + a_2)y(t)=(b_0 D^2 + b_1 D + b_2) x (t)

para disminuir la cantidad de variables, a0=0, es decir dividimos la ecuación para a0, como aún son variables desconocidas, se mantiene la nomenclatura.

(D^2+a_1 D + a_2)h(t)=(b_0 D^2 + b_1 D + b_2) \delta (t)

La respuesta de un sistema al impulso unitario δ(t) aplicada en t=0, con todas las condiciones iniciales en cero en t=0-, se conoce como h(t).

Para el análisis se consideran dos intervalos:

Para t≥0+ donde x(t)=0, cuya respuesta es conocida como los términos de modos característicos

(D^2+a_1 D + a_2)h(t)=0, t \ge 0

h(t) = términos de modos característicos

Para t=0 donde existe x(t)=δ(t), que suma a lo anterior una constante A0 por un impulso.

h(t) = A0 δ(t) + términos de modos característicos

que al insertar esta ecuación en la expresión original tenemos:

(D^2+a_1 D + a_2)(A_0 \delta(t) + \text{términos modos característicos}) = =(b_0 D^2 + b_1 D + b_2) \delta (t)

que al multiplicar la parte de la izquierda, y comparando términos de ambos lados se determina que A0 = b0

que es como expresar

h(t) = b_0 \delta (t) + \text{modos característicos}

y si el orden del lado derecho es menor que el del izquierdo, b0=0.

Revisar Lathi 2.8 pdf 156 para una descripción más detallada del método.

Método simplificado al emparejar términos

El método permite reducir el procedimiento para determinar h(t) de un sistema LTIC.

h(t) = b_0 \delta (t) + [P(D) y_n(t)] \mu (t)

donde yn(t) es una combinación de modos característicos del sistema sujeto a las condiciones iniciales siguientes:

y_n(0) = y'_n(0) = y''_n(0) = y_n^{(N-2)}(0) = 0 y_n^{(N-1)}(0) = 1

donde y(k)n(0) es el valor de la k-ésima derivada de yn(t) para t=0.

Si orden de P(D) es menor que el orden de Q(D) entonces b0=0 y el término del impulso b0δ(t) en h(t) es cero.

N = 1 yn(0) = 1
N = 2 yn(0) = 0, y’n(0) = 1
N = 3 yn(0) = 0, y’n(0) = 0, y»n(0) = 1
N = 4

Ejemplo

Para el problema del sistema modelo que tiene la ecuación mostrada, se pide determinar la respuesta al impulso unitario h(t).

( D^2 + 3D +2 ) y(t) = Dx(t) ( D^2 + 3D +2 ) y(t) = (D+0)x(t)

Desarrollo Analítico

Es problema tiene un sistema se segundo orden con polinomio característico:

λ2 + 3 λ + 2 = (λ+1)(λ+2)
Raíces características Modos característicos
λ1 = -1 e-t
λ2 = -2 e-2t

con lo que la respuesta tienen la forma:

y_0 (t) = c_1 e^{-t} + c_2 e^{-2t} y'_0 (t) = -c_1 e^{-t} -2c_2 e^{-2t}

se toman las condiciones iniciales  de la tabla del método simplificado para emparejar impulsos para N=2, por ser un sistema de segundo orden

y(0) = 0
y'(0) =1

para obtner las ecuaciones al sustituir los valores en las expresiones anteriores:

0 =  c1 + c2 
1 = -c1 - 2c2 

c1 = 1 
c2 = -1

dando como resultado que:

y_n (t) = 1 e^{-t} - 1e^{-2t}

de las ecuaciones iniciales del problema P(D)=D, entonces:

P(D)y_n (t) = Dy_n (t) = y'_n (t) = -e^{-t} + 2e^{-2t}

y para el caso b0=0, el término de segundo orden no se encuentra en P(D), entonces:

h(t)=[P(D)y_n (t)] \mu (t) = (-e^{-t} + 2e^{-2t})\mu (t)

Sistemas – Linealidad

Referencia: Oppenheim 1.6.6 p53/pdf81, Lathi 1.7-1 pdf73, Schaum/Hsu 1.5.E p18

En un sistema lineal tiene salida proporcional a su entrada.

Un sistema lineal tiene la propiedad de aditividad, es decir, la respuesta a una suma de señales  en la entrada es igual a la suma de las entradas individuales.

  1. La respuesta a:   x1(t) + x2(t) = y1(t) + y2(t)
  2. La respuesta a:  αx1(t)  es αy1(t), donde α es una constante real o compleja cualquiera.

El numeral 2 se conoce como la propiedad de escalamiento u homogeneidad.

cantante03

La propiedad de superposición se plantea como una combinación de las propiedades anteriores:

en tiempo contínuo: 
     αx1(t) + βx2(t) → αy1(t) + βy2(t)
en tiempo discreto:  
     αx1[n] + βx2[n] → αy1[n] + βy2[n]