Question

Mise à jour : cette question était précédemment intitulée " Donnez-moi le nom d'un algorithme simple pour la détection de formes de signal (son) "

  1. Mon objectif est de détecter la présence d'un motif donné dans un signal bruyant. Je veux détecter la présence d'une espèce d'insecte enregistrant les sons avec un microphone. J'ai précédemment enregistré le son de l'insecte au format numérique.
  2. Je n'essaie pas de faire de la reconnaissance vocale.
  3. J'utilise déjà la convolution entre le signal d'entrée et le motif pour déterminer leur niveau de similarité. Mais je pense que cette technique est plus adaptée au temps discret (c'est-à-dire aux communications numériques, où les signaux se produisent à des intervalles fixes) et à la distinction d'un signal d'entrée entre 2 modèles donnés (je n'ai qu'un seul modèle).
  4. J'ai peur d'utiliser les réseaux de neurones, car je ne les ai jamais utilisés et je ne sais pas si je pourrais intégrer ce code.

Pourriez-vous me suggérer d'autres approches, ou essayer de me convaincre que mon approche actuelle reste une bonne idée ou que les réseaux de neurones peuvent constituer un moyen réalisable?

Mise à jour J'ai déjà 2 bonnes réponses, mais une autre serait la bienvenue et même récompensée.

Était-ce utile?

La solution

La distorsion temporelle dynamique peut être considérée comme un opérateur de convolution. qui étire et réduit un signal pour en faire correspondre un autre.

Une approche plus simple consisterait peut-être à effectuer une FFT de l’échantillon et à déterminer si votre insecte peut filtrer des fréquences particulières.

Du côté plus complexe, mais pas vraiment un réseau de neurones, les toolkits SVM comme libsvm et svmlight dans lesquels vous pouvez envoyer vos données.

Quel que soit le chemin que vous tentez, je passerais du temps à explorer la nature du son que fait votre insecte en utilisant des outils tels que FFT. Après tout, il sera plus facile d'apprendre à un ordinateur à classer le son si vous pouvez le faire vous-même.

Autres conseils

Cela ressemble à un problème de classification d'une classe typique vouloir rechercher une chose dans une vaste réserve d'autres choses qui ne vous intéressent pas.

Ce que vous voulez faire est de trouver un ensemble de fonctionnalités ou de descripteurs que vous pouvez calculer pour chaque petit extrait de votre enregistrement brut que vous pouvez ensuite faire correspondre aux fonctionnalités que votre enregistrement clair produit. Je ne pense pas que la convolution soit nécessairement mauvaise, bien qu’elle soit plutôt sensible au bruit, elle pourrait donc ne pas être optimale pour votre cas. Ce qui pourrait réellement fonctionner dans votre cas est la correspondance de modèle sur une transformation de Fourier en binôme. Vous prenez la transformée de Fourier de votre signal, vous donnant un graphe puissance / fréquence (plutôt qu'un graphe puissance / temps), puis vous divisez la fréquence en bandes et vous prenez la puissance moyenne de chaque bande comme caractéristique. Si vos données contiennent principalement du bruit blanc, le bruit que vous obtenez à partir d’un son d’insecte brut de longueur similaire correspond très étroitement au modèle de votre son de référence. Cette dernière astuce a été utilisée avec succès (avec un peu de fenêtrage) pour craquer les captcha audio utilisés par google et autres pour créer leurs sites accessibles aux aveugles.

Soit dit en passant, votre signal audio brut est numérique (sinon, le traitement avec un ordinateur ne fonctionnera pas ;-)) la convolution est appropriée. Vous devez effectuer la convolution entre votre signal de référence et un échantillon de longueur égale à partir de l’entrée brute à partir de chaque échantillon. Ainsi, si votre signal de référence a une longueur N et que votre échantillon brut a une longueur M où M> = N, vous devez alors effectuer M-N + 1 = P convolutions entre votre signal de référence et P échantillons de votre entrée brute à partir de 1 .. P. La meilleure possibilité pour l'emplacement du son de référence dans l'échantillon brut est l'échantillon avec le score de convolution le plus élevé. Notez que cela prend énormément de temps très rapidement.

L’appariement basé sur la transformation de Fourier, comme je l’ai expliqué ci-dessus, utilisant 50% d’échantillons chevauchants provenant de vos données brutes, soit deux fois la longueur de votre échantillon de référence, serait au moins plus rapide (mais pas nécessairement meilleur)

Des informations supplémentaires sont nécessaires.

Quand vous dites un signal bruyant, quel est le bruit de fond? Est-il, en première approximation, stationnaire (au sens statistique, c'est-à-dire constant) ou est-il non stationnaire (c'est-à-dire susceptible de contenir d'autres sons, tels que des appels d'animaux, etc.?)

Si le bruit de fond n’est pas stationnaire, il est préférable d’utiliser un élément appelé Analyse des composants indépendants. qui tente de séparer un mélange sonore donné en ses composants, vous n’auriez même pas besoin de l’enregistrement original de l’insecte lui-même. De nombreux logiciels ICA sont liés à la page Wikipedia.

(Edit: ICA est un cas de Séparation aveugle de sources ( BSS), il existe de nombreuses autres façons de faire le BSS et il pourrait être utile de les rechercher également.)

Si toutefois, le bruit de fond est immobile, le problème est beaucoup plus simple (bien que toujours très difficile):

Dans ce cas, l’approche que j’utiliserais est la suivante. Analysez le spectre d'amplitude d'un peu du bruit et le spectre d'amplitude de votre appel d'insecte. Si vous êtes chanceux, l'appel des insectes peut, en général, être dans une bande de fréquence différente de celle du bruit. Si tel est le cas, filtrez le signal entrant avec un filtre passe-haut, bas ou passe-bande approprié.

Vous pouvez ensuite essayer de comparer des sections de votre signal filtré contenant "plus d'énergie". que la moyenne avec votre appel d'insecte (filtré). Peut-être en utilisant les algorithmes de similarité d’images suggérés par A. Rex.

Modifier : votre bruit de fond n'étant pas stationnaire, je ne peux que suggérer que vous recherchiez Source aveugle La séparation de sources non gaussiennes peut vous amener à utiliser d'autres algorithmes. J'ai peur que la réponse soit qu'il n'y a pas de simple algorithme qui fera ce que vous voulez.

Si j'étais auparavant, vous liriez un peu plus sur les Fonctions de la fenêtre comme celle de Hamming, C’est un bon point de départ pour la reconnaissance sonore. (Ceci est bien sûr combiné à la transformation de Fourier )

.

Vous pouvez essayer un filtre correspondant. Bien que je n’en ai jamais utilisé, j’ai entendu de bonnes choses.

De plus, même si ce n’est pas simple, je pense qu’un modèle de Markov caché (HMM, je sais que vous n’avez pas dit de reconnaissance vocale, mais écoutez-moi!) vous donnerait les meilleurs résultats. Encore une fois, je n’en ai jamais utilisé, mais des implémentations open source sont disponibles partout. Il vous suffira de le former à l’aide des informations "propres" existantes. enregistrement d'insectes. Voici une implémentation Open Source: Bibliothèque de modèles de Markov généraux masqués .

Certes, ce n’est pas mon domaine de compétence, mais ma première pensée est un filtre de moindres carrés récursifs - il effectue une autocorrélation. Il ressemble au filtre de convolution que vous utilisez maintenant, mais un peu plus avancé. Le filtrage de Kalman est une extension de ceci - il est utilisé pour régénérer un signal à partir de plusieurs mesures bruitées, il n'est donc probablement pas utile dans ce cas. Je ne rejetterais pas les réseaux de neurones spontanés - ils sont très utiles pour ce genre de choses (à condition de les former correctement).

Réfléchissant davantage à cette question, je recommanderais probablement l’utilisation d’une FFT. Le signal que vous recherchez est probablement très limité en bande et vous auriez probablement plus de chance en utilisant un filtre passe-bande sur les données puis une FFT et enfin en utilisant votre filtre de convolution simple sur ces données au lieu des données de domaine temporel points. Ou faire les deux et avoir deux fois les données. Je ne suis pas un adepte des mathématiques, je ne peux donc pas vous dire si vous obtiendrez des résultats significatifs (non linéairement dépendants) avec cette méthode, mais la seule chose que vous perdez, c'est le temps.

Vous pouvez être intéressé par la MA Toolbox , une implémentation Matlab de mesure (s) de similarité.

J'ai personnellement trouvé ce document, Classification générale du son et similitude dans MPEG-7 , intéressant. Cependant, cela pourrait être derrière un paywall (je ne sais pas) et cela pourrait ne pas être très utile dans la pratique.

Le cadre GPL-ed Marsyas dispose d'un outil de classification de l'apprentissage automatique appelé kea. Mon hypothèse est que cela ne fait probablement pas ce que vous voulez ou demande trop d’efforts.

Sinon, ma seule idée est de prendre des transformations de Fourier pour transformer efficacement vos sons en images en niveaux de gris. Utilisez ensuite l'un des nombreux algorithmes de similarité d'images .

Un Naive Bayes Classifier peut être intéressant ici, classant les échantillons sonores dans ceux qui contiennent votre espèces d'intérêt et ceux qui ne le font pas. Cela fonctionne assez bien pour des phénomènes complexes; Une fois, je m'en suis servi pour déterminer si un ensemble de données RADAR à ondes millimétriques donné contenait un obstacle, tel qu'une brosse, un piège de réservoir, etc. l'ensemble de données en continu et séparer des morceaux de longueur égale à votre échantillon d'insecte Par exemple, si l’échantillon comparé dure 2 secondes, vous pouvez alimenter le discriminateur avec une valeur de 0-2, 0,5-2.5, 1-3, etc. exigence de toute solution basée sur l’apprentissage automatique.

Ce type d’approches est à peu près la seule solution si votre espèce d’insecte n’a pas le son unique et relativement distinct que vous recherchez. La corrélation croisée / convolution a une utilité limitée si vous recherchez quelque chose de plus complexe qu'un son unique, dont le volume peut être supérieur ou inférieur.

Il existe des implémentations naïves du classificateur Bayes pour plusieurs langues, telles que nbc .

Vous souhaitez peut-être adopter une approche Filtre de Wiener .

Google: algorithme FastICA. Certains utilisent indifféremment la séparation des signaux ICA et de sources aveugles. L'auteur de l'algorithme a écrit un livre fantastique sur l'ACI qui coûte entre 40 et 60 dollars sur Amazon.

Goertzel - Vous pouvez l’utiliser soit pour la détection de modèle simple, soit pour la séparation compliquée de fréquences. Vous pouvez voir l'exemple de ma mise en œuvre en C #

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top