Arquivos

Archive for novembro \29\UTC 2010

Clap Detection

novembro 29, 2010 Deixe um comentário

Ola Pessoal, a um tempo atrás discuti com um amigo sobre como identificar via microfone um grande ruido, como por exemplo o bater de mãos, então pensei vou fazer um detector de palma :-)

Testei vário modelos de análise de onda e espectros sem sucesso, então tive uma idéia mais simples que precisa ser melhor desenvolvida

A idéia consiste apenas em analísar os decibéis corrente com a média dos valores antigos para assim identificar uma grande enérgia do sinal dentro de um período curto caracterizando assim uma grande “batida” podendo perfeitamente ser utilizado para identificar grandes ruídos repentinos como uma palma por exemplo …

Claro que as desvantajens deste método são enormes pois qualquer ruido com um pico elevado de curta duração será caracterizado como uma batida.

Segue source que precisa ser melhor elaborado:

##############################################
##Eng Eder de Souza
##Date: 20/11/2010
##
##############################################

from __future__ import division

import sys
import math
import numpy
import pyaudio
from scipy.fftpack import rfft
from numpy import *

class AudioPowerClass(object):

def GetPowerWavFromMIC(self):

FORMAT = pyaudio.paInt16
pyaud = pyaudio.PyAudio()
teste = pyaud.get_sample_size(FORMAT)

try:

stream = pyaud.open(format = pyaudio.paInt16,
channels = 1,
rate = 44100,
input_device_index = int(pyaud.get_default_input_device_info()["index"]),
input = True)
windowsize = 1000
i = 0
cur_pwr = 0
last_pwr = 0
Frequencia = 0
Clap = 0

Porcent_limit = 3
print “Escrito por Eng Eder de Souza”
print “Dispositivo de Microfone Encontrado pronto para uso”
print””
print””

except:

print “Escrito por Eng Eder de Souza”
print “Falha ao Encontrar Dispositivo”
sys.exit()

while True:

try:

pegaentrada = stream.read(1)

except:

continue

dados = numpy.fromstring(pegaentrada, dtype=numpy.int16)
pwr = round(10*log10(1e-20+abs(rfft(dados))**2))

if i <= windowsize:

cur_pwr=cur_pwr+int(pwr)

i=i+1

if i == windowsize:

i=0

ratio_pwr = float(last_pwr/cur_pwr)

result = (ratio_pwr -1) * 100

#O Result retorna a porcentagem entre a comparação da diferença de decibéis entre o último valor e o corrente Alterando o Porcent_limit você tera um resultado mais refinado para identificar barulhos maiores ou menores

if result > Porcent_limit:

Clap = 1

if Clap == 1:

if last_result < Porcent_limit:

Clap = 0

print “%d Estrondo Detectado” %ratio_pwr

print “%f eder valor” %result

last_pwr = cur_pwr
last_ratio_pwr = ratio_pwr
last_result = result
cur_pwr=0
Clap = 0

CategoriasDSP, Programação
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.