Início > DSP, Programação > Clap Detection

Clap Detection

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

Categorias:DSP, Programação
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: