Pergunta

Atualizar Esta questão foi previamente intitulado como " Dê-me o nome de um algoritmo simples para o sinal (som) padrão de detecção "

  1. O meu objectivo é detectar a presença de um determinado padrão em um sinal ruidoso. Eu quero detectar a presença de uma espécie de inseto gravando os sons com um microfone. Eu tenho gravado anteriormente o som do inseto em um formato digital.
  2. Eu não estou tentando fazer reconhecimento de voz.
  3. Eu já estou usando convolução entre o sinal de entrada e o padrão para determinar seu nível de similaridade. Mas eu acho que esta técnica é mais adequado para tempo discreto (comunicações digitais ou seja, onde os sinais ocorre em intervalos fixos) e para distinguir um sinal de entrada entre 2 padrões dados (eu tenho apenas um padrão).
  4. eu tenho medo de usar redes neurais, porque eu nunca os usou, e eu não sei se eu poderia incorporar esse código.

Você poderia por favor me aponte algumas outras abordagens, ou tentar me convencer de que minha abordagem atual ainda é uma boa idéia ou que as redes neurais podem ser uma maneira viável?

Atualizar Já temos 2 boas respostas, mas outro seria bem-vinda, e até mesmo recompensado.

Foi útil?

Solução

Um passo acima de convolução é deformação tempo dinâmica que pode ser pensado como um operador de convolução que estica e encolhe um sinal para otimizar a coincidir com o outro.

Talvez uma abordagem mais simples seria fazer uma FFT da amostra e determinar se o seu inseto quaisquer freqüências específicas que podem ser filtrados por diante.

No lado mais complexo, mas não é bem uma rede neural, são toolkits SVM como LIBSVM e svmlight que você pode jogar seus dados a.

Independentemente do caminho que você tentar, eu iria gastar tempo a explorar a natureza do som que o inseto faz usando ferramentas como FFT. Afinal, será mais fácil ensinar um computador a classificar o som se você pode fazê-lo sozinho.

Outras dicas

Som como um um problema de classificação classe típica ou seja, você deseja pesquisar uma coisa em um grande conjunto de outras coisas que você não se preocupam.

O que você quer fazer é encontrar um conjunto de características ou descritores que você pode calcular para cada pequeno pedaço de sua gravação crua que você pode, em seguida, o jogo contra o apresenta a sua gravação limpa produz. Eu não acho que convolução é neccessarily ruim, embora seja bastante sensível ao ruído por isso pode não ser o ideal para o seu caso. O que pode realmente funcionar no seu caso é padrão de correspondência em um binned transformada de Fourier. Você toma a transformada de Fourier do sinal, o que lhe dá um poder vs gráfico de frequências (em vez de um poder vs gráfico de tempo), então você dividir a frequência em bandas e você toma a potência média para cada banda como uma característica. Se os dados contém ruído de maioria branca da patern que você começa de um som inseto crua de comprimento semelhante irá corresponder muito de perto o padrão de seu som de referência. Este último truque tem sido usado com sucesso (com algumas janelas) de crack áudio captcha de como usado pelo Google et al para make seus sites acessíveis aos cegos.

A propósito, porque o seu sinal de áudio cru é digital (caso contrário, o processamento com um computador não vai funcionar ;-)) convolução é apropriado. Você deve executar a convolução entre o sinal de referência e uma amostra de igual comprimento da entrada bruta a partir de cada amostra. Assim, se o sinal de referência tem um comprimento N, e a sua amostra em bruto tem um comprimento M, em que M> = N, em seguida, é necessário executar H-N convoluções + 1 = P entre o sinal de referência e as amostras de P a partir de sua entrada em bruto a partir de 1 .. P. A melhor possibilidade para a localização do som de referência na amostra crua é a amostra com a maior pontuação convolução. Note-se que isso se torna tempo insanamente consumindo muito rapidamente.

transformada de Fourier correspondente base como explicado acima utilizando 50% de sobreposição de amostras a partir dos dados brutos de duas vezes o comprimento de sua amostra de referência que, pelo menos, ser mais rápido (embora não neccessarily melhor)

Alguns são necessárias mais informações.

Quando você diz sinal ruidoso que é o ruído de fundo? É, em uma primeira aproximação, estacionária (no sentido estatístico, ou seja constante) ou é não-estacionária (ou seja susceptível de conter outros sons, como outras chamadas animal etc?)

Se o ruído de fundo é não-estacionário, em seguida, sua melhor aposta seria usar algo chamado Independent Análise de Componentes que as tentativas para separar uma determinada mistura de som em suas fontes de componente, você não precisa mesmo a gravação original do próprio inseto. Lotes de software ICA está ligada a partir da página da Wikipedia.

(Edit: ICA é um caso de Cego Fonte Separação ( BSS), existem muitas outras maneiras de fazer BSS e que poderia ajudar a procurar as também.)

Se, no entanto, o ruído de fundo está parado, então o problema é muito mais fácil (embora ainda muito difícil):

Neste caso, a abordagem que eu usaria é a seguinte. Analisar o espectro de amplitude de um pouco de barulho e do espectro de amplitude da sua chamada de insetos. Se você tiver sorte a chamada inseto pode, em geral, estar em uma faixa de freqüência diferente para o ruído. Se assim realizar uma filtragem do sinal de entrada com alto adequada, de baixo, ou do filtro passa-banda.

Você pode então tentar comparar seções de seu sinal filtrado que contêm "mais energia" do que a média com o seu (filtrado) chamada de insetos. Possivelmente usando os algoritmos de imagem de similaridade sugeridas por A. Rex.

Editar : Desde o seu background-ruído é não-estacionária, então eu só posso sugerir que a procura de cego fonte Separação de fontes não-gaussianas podem levar você a mais alguns algoritmos. Receio que a resposta é que não existe simples não algoritmo que vai fazer o que quiser.

Se eu fosse você iria começar a ler um pouco sobre funções da janela como a janela Hamming, este é um bom ponto de reconhecimento de som inicial. (Isto é, é claro, combinado com Transformação de Fourier )

Você pode tentar um filtro casado. Embora eu nunca tenha realmente usado um, eu ouvi coisas boas.

Além disso, embora não seja simples, eu acho que um Modelo Oculto de Markov (HMM, eu sei que você disse que não o reconhecimento de voz, mas me ouça!) Iria fornecer os melhores resultados para você. Mais uma vez, eu nunca realmente usado um, mas existem implementações de código aberto disponível em todo o lugar. Você só precisa treiná-lo usando seu exisiting gravação inseto "limpa". Aqui é uma implementação open source:. Geral Hidden Markov Modelo Biblioteca

É certo que este não é minha área de especialização, mas meu primeiro pensamento é um filtro recursivo de mínimos quadrados - ele executa autocorrelação. É semelhante ao filtro de convolução você está usando agora, mas um pouco mais avançado. Filtragem de Kalman é uma extensão disso - ele é usado para regenerar um sinal a partir de múltiplas medições ruidosos por isso provavelmente não é útil neste caso. Eu não iria rejeitar improviso redes neurais - eles são muito úteis neste tipo de coisa (desde que você treiná-los adequadamente).

Thinking mais sobre isso em profundidade eu provavelmente recomendaria usar uma FFT. As possibilidades são o sinal de que você está procurando é muito limitado em banda, e você provavelmente teria mais sorte usando um filtro de banda dos dados, em seguida, uma FFT e, finalmente, através do seu filtro de convolução simples em que os dados em vez dos dados no domínio do tempo pontos. Ou fazer as duas coisas e ter o dobro da de dados. Eu não sou pesado em matemática, pois não podem' dizer se você vai obter resultados significativos (não linearmente dependentes) que utilizam este método, mas a única coisa que você está perdendo é o tempo.

Você pode estar interessado em um MA Toolbox , implementação de uma Matlab de medida de similaridade (s).

Eu pessoalmente achei este papel, classificação som geral e semelhança em MPEG-7 , interessante. No entanto, pode ser atrás de um paywall (Eu não sei) e ele pode não ser tão útil na prática.

O quadro GPL-ed Marsyas tem uma ferramenta para a classificação de aprendizagem de máquina, chamada kea. Meu palpite é que isso provavelmente não faz o que você quer ou é muito esforço para ligar para.

A minha única ideia de outra forma é tomar transformadas de Fourier, transformando efetivamente os seus sons em imagens em tons de cinza. Em seguida, use um dos muitos algoritmos de imagem de similaridade .

A Naive Bayes Classificador pode ser útil aqui, classificando amostras de som para aqueles que contêm o seu espécies de interesse e aqueles que não o fazem. Ele funciona muito bem para fenômenos complexos; Eu usei uma vez para decidir se um dado de ondas milimétricas conjunto de dados RADAR continha um obstáculo, como escova, uma armadilha tanque, etc. Quanto à forma de quebrar seus dados contínuos em pedaços discretos para o classificador Bayesian, você pode simplesmente deslizar ao longo o conjunto de dados contínua e quebra off pedaços iguais em comprimento com sua amostra de insetos. Por exemplo, se a amostra que você está comparando contra é de 2 segundos de duração, você pode alimentar o discriminador 0-2s, 0.5-2.5s, 1-3s, etc. Você vai precisar de treinar o discriminador, mas que é comum exigência de qualquer solução baseada na aprendizagem de máquina.

Esses tipos de abordagens são a única maneira de ir se suas espécies de insetos não tem um único som, relativamente distinta que você está procurando. Correlação cruzada / convolução são de utilidade limitada se você está procurando algo mais complexo do que um único som que pode ser a volume maior ou menor.

Existem ingênuos implementações classificador Bayes para vários idiomas, como NBC .

Você pode querer um href="http://en.wikipedia.org/wiki/Wiener_filter" rel="nofollow noreferrer"> Wiener abordagem filtro

Google: algoritmo FastICA. Alguns ICA uso e Separação Cega-fonte de sinal alternadamente. O autor do algoritmo escreveu um livro fantástico sobre ICA que é de cerca de $ 40- $ 60 usado na Amazon.

Goertzel - Você pode usá-lo tanto para detecção de padrões simples, e para separação de frequências complicado. Você pode ver a amostra de minha implementação em C #

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top