Referencia: Leon W Couch apéndice B p675, «El Aguacate», pasillo introducción, Archivos de Audio.wav – Abrir, extraer una porción
De forma semejante al análisis para una señal triangular, se obtiene barriendo una ventana estrecha de Δx voltios de ancho, verticalmente a lo largo de las formas de onda y después midiendo la frecuencia relativa de la ocurrencia de voltajes en la ventana Δx.
El eje de tiempo se divide en n intervalos y la forma de onda aparece nΔx veces dentro de estos intervalos en la ventana Δx.
Se inicia abriendo el archivo 'muestra01_ElAguacateIntro.wav'
, seleccionando un canal en caso de ser estéreo. Para los cálculos se convierte a números reales ‘float’ de tipo estándar de python y para la gráfica se determina el rango de tiempo 't'
.
# pmf de un sonido # entrada es arcchivo01 # propuesta:edelros@espol.edu.ec import numpy as np import matplotlib.pyplot as plt import scipy.io.wavfile as waves import scipy.stats as stats # INGRESO # archivo01 = input('archivo de sonido 01:' ) archivo01 = 'muestra01_ElAguacateIntro.wav' # PROCEDIMIENTO muestreo, sonido01 = waves.read(archivo01) # Extrae un canal en caso de estéreo canales=np.shape(sonido01) cuantos=len(canales) canal = 0 if (cuantos==1): # Monofónico uncanal=sonido01[:] if (cuantos>=2): # Estéreo uncanal=sonido01[:,canal] senal=uncanal.astype(float) dt=1/muestreo n=len(senal) t=np.arange(0,n*dt,dt)
Se grafica la señal en observación de uncanal:
# SALIDA GRAFICA plt.plot(t,senal) plt.title(' Sonido') plt.xlabel('t') plt.ylabel('señal') plt.plot() plt.show()
Aplicando luego el mismo algoritmo usado para señales triangulares y senoidales, manteniendo la forma discreta.
# Función de Probabilidad de Masa, PMF m=40 # intervalos eje vertical #PROCEDIMIENTO relativa = stats.relfreq(senal, numbins = m ) deltax=relativa.binsize # Eje de frecuencias, por cada deltax senalmin=np.min(senal) senalmax=np.max(senal) senalrango=np.linspace(senalmin,senalmax,m) # SALIDA print('frecuencia relativa:') print(relativa.frequency) print('Rango de Señal') print(senalrango)
frecuencia relativa: [ 0.00023583 0.00073469 0.00089796 0.00053515 0.00084354 0.00179592 0.00245805 0.00306576 0.0039093 0.00504308 0.0066576 0.0099229 0.01693424 0.02671202 0.03568254 0.05160998 0.06758277 0.07323356 0.08575057 0.09217234 0.11898413 0.08494331 0.07535601 0.06454422 0.05382313 0.03821315 0.02429932 0.01573696 0.01075737 0.00767347 0.00576871 0.00365533 0.00245805 0.00176871 0.00145125 0.00103401 0.0008254 0.00106122 0.00137868 0.0004898 ] Rango de Señal [-32768. -31087.61538462 -29407.23076923 -27726.84615385 -26046.46153846 -24366.07692308 -22685.69230769 -21005.30769231 -19324.92307692 -17644.53846154 -15964.15384615 -14283.76923077 -12603.38461538 -10923. -9242.61538462 -7562.23076923 -5881.84615385 -4201.46153846 -2521.07692308 -840.69230769 839.69230769 2520.07692308 4200.46153846 5880.84615385 7561.23076923 9241.61538462 10922. 12602.38461538 14282.76923077 15963.15384615 17643.53846154 19323.92307692 21004.30769231 22684.69230769 24365.07692308 26045.46153846 27725.84615385 29406.23076923 31086.61538462 32767. ]
# SALIDA Grafico de PMF plt.bar(senalrango,relativa.frequency, width=deltax*0.8) plt.xlabel('Amplitud de señal') plt.ylabel('PMF') plt.show()
# Función distribución acumulada acumulada=np.cumsum(relativa.frequency) # SALIDA CDF plt.step(senalrango,relativa.frequency,label='pmf', where='post') plt.step(senalrango,acumulada,label='cdf', where='post') plt.xlabel('Amplitud de señal') plt.title(' Función de distribuión acumulada , CDF') plt.legend() plt.show()
Para grabar los archivos puede usar np.savetxt(‘nombrearchivo.txt’, arreglodata )