Por lo tanto, para nuestro proyecto podemos decir que si por ejemplo estamos reproduciendo una canción en una habitación y en determinado momento entra gente a platicar o hay algún ruido externo inesperado, el volumen del dispositivo que está emitiendo el sonido de la canción va aumentando paulatinamente para que se continue escuchando la canción.
Podemos decir que la importancia de nuestro proyecto es por ejemplo en sistemas en automóviles, en donde el volumen de la música dentro del auto aumenta cuando el motor emite mucho ruido, en cambio cuando este está detenido, el volumen baja, cuando las personas en alguna empresa tienen audifonos en donde se les transmiten comandos a realizar, pero el sonido de la planta es muy fuerte, se controla el volumen de lo que se emite.
Diagrama de bloques.
En donde tenemos como entrada y salida:
- Salidas:
- El audio de la canción o video reproduciendo actualmente a un volumen ajustado automáticamente por el programa.
- Entradas:
- El ruido del ambiente y en base a esto se hace un cambio en el volumen.
En donde generamos la función de tranferencia:
Usamos Python como lenguaje de programación, haciendo uso de las siguientes librerias.
- Alsaaudio:
- Sirve para controlar el nivel del volumen.
- Audioop:
- Regresa el valor máximo absoluto de un tramo de datos captado como sonido.
- Time:
- Usamos esta librería para controlar el tiempo de ejecución en la recepción del ruido.
En el siguiente diagrama vemos la arquitectura de sistema lógico en donde podemos ver la secuencia que realiza el sistema y cómo va cambiando el volumen.
Diapositivas.
Código.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import alsaaudio, time, audioop | |
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE,alsaaudio.PCM_NONBLOCK) | |
inp.setchannels(1) | |
inp.setrate(8000) | |
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) | |
inp.setperiodsize(160) | |
start_vol = 40 | |
delay = 40 | |
change = 5 | |
vol_actual = start_vol | |
def getSound(): | |
"""Obtenemos el ruido obtenido por el microfono | |
predeterminado, el dato necesario se guarda en | |
la variable 'data' y extraemos el valor numerico. | |
""" | |
l, data = inp.read() | |
sound = audioop.max(data, 2) | |
return sound | |
def getVolume(): | |
"""Obtenemos el volumen actual de las bocinas | |
de la computadora | |
""" | |
m = alsaaudio.Mixer() | |
vol = m.getvolume() | |
return int(vol[0]) | |
def setVolume(vol): | |
"""Establecemos un valor especifico en el volumen, | |
y necesita ser un valor entre 0 y 100, de lo | |
contrario se produce un error. | |
""" | |
m = alsaaudio.Mixer() | |
if vol < 0: | |
vol = 0 | |
if vol > 100: | |
vol = 100 | |
m.setvolume(vol) | |
def amortiguamiento(prom): | |
"""Funcion para evitar que el volumen se cambie | |
drasticamente. | |
""" | |
dif = vol_actual - prom | |
print 'dif', dif | |
if dif < -change: | |
prom - change | |
if dif > change: | |
prom + change | |
return prom | |
def main(): | |
list_noise = [] | |
noise_max = 5000 | |
"""Proceso en un ciclo infinito. | |
""" | |
while True: | |
noise = getSound() | |
if noise != 0: | |
if noise > noise_max: | |
noise_max = noise | |
multi = (noise*100)/noise_max | |
list_noise.append(multi) | |
if len(list_noise) == delay: | |
prom = int(sum(list_noise) / delay) | |
if prom < start_vol: | |
prom = start_vol | |
print 'Prom >', prom | |
prom = amortiguamiento(prom) | |
setVolume(prom) | |
print 'Prom >', prom | |
list_noise = [] | |
time.sleep(0.001) | |
if __name__ == '__main__': | |
main() |
Demo
Le falta etiqueta a la entrada. Me hubiera gustado tener la validación experimental de la función de transferencia y algo sobre la estabilidad del control que se obtiene con el sistema. Van 13 pts por el reporte.
ResponderEliminar