Referencia: Archivos de Audio.wav – Abrir, extraer una porción
Para comparar dos señales de sonido se puede usar la operación de correlación.
Por ejemplo, usando dos archivos.wav, se compara las partes de una canción cantada por diferentes personas. Cada parte se obtiene de los archivos señal01 y señal02 semejantes a las siguientes:
señal01: elaguacate_muestra01.wav
señal02: elaguacate_muestra02.wav
la correlación, destaca las partes en que las señales son semejantes como se muestra en la gráfica.
Tarea: Realice las observaciones y recomendaciones al proceso, realizando el ejercicio con una canción diferente a la mostrada. Use la seleccionada para otras tareas.
Instrucciones en Python
Para el algoritmo, la primera señal de menor duración, la segunda es la señal de mayor duración.
Las señáles se normalizan en el rango [0,1] previo a procesar la correlación.
Para que las gráficas sean proporcionales en el eje de tiempo, a la señal01 se aumenta valores de cero o relleno.
Puede quedar como tarea, convertir el eje x en unidades de tiempo en lugar del número de la muestra.
# analiza correlación entre dos muestras # supone que señal01 es más corta que señal02 # propuesta:edelros@espol.edu.ec import numpy as np import matplotlib.pyplot as plt import scipy.io.wavfile as waves # Un canal en caso de estereo def extraeuncanal(sonido): canales=sonido.shape cuantos=len(canales) canal = 0 if (cuantos==1): # Monofónico uncanal=sonido[:] if (cuantos>=2): # Estéreo uncanal=sonido[:,canal] return(uncanal) # PROGRAMA # INGRESO # archivo01 = input('archivo de sonido 01:' ) # archivo02 = input('archivo de sonido 02:' ) archivo01 = 'elaguacate_muestra01.wav' archivo02 = 'elaguacate_muestra02.wav' muestreo, sonido = waves.read(archivo01) senal01 = extraeuncanal(sonido) muestreo, sonido = waves.read(archivo02) senal02 = extraeuncanal(sonido) # PROCEDIMIENTO tamano01 = len(senal01) tamano02 = len(senal02) # Normaliza las señales amplitud = np.max(senal01) senal01 = senal01/amplitud senal02 = senal02/amplitud # Correlación para comparar correlacion = np.correlate(senal01,senal02, mode='same') # SALIDA # unifica dimensiones de señal01 y señal02 extra = np.abs(tamano01-tamano02) relleno = np.zeros(extra,dtype=float) senal01relleno = np.concatenate((senal01,relleno),axis=0) plt.suptitle('Correlación(señal01,señal02)') plt.subplot(311) plt.plot(senal01relleno,'g', label = 'señal01') plt.legend() plt.subplot(312) plt.plot(senal02,'b', label = 'señal02') plt.legend() plt.subplot(313) plt.plot(correlacion,'m', label = 'correlación') plt.legend() plt.show()
Para extraer una porción de audio de un archivo.wav, revise las instrucciones en el tema:
Referencia: Archivos de Audio.wav – Abrir, extraer una porción