Bonjour, communauté!
J'avais envie de jouer à nouveau avec le microcontrôleur et de faire quelque chose d'utile. Le but a été formé presque immédiatement, car quelque chose m'a dérangé dans l'appartement.
Comme vous le savez, une table d'ordinateur est une table à manger pour regarder Drobyshevsky ou lire Giktayms / Green Cat / etc. en même temps que le dîner. Mais il y a un problème - je sors généralement de la cuisine avec les
deux mains occupées, et aussi le dos,
car les tasses sont empilées en 3 morceaux. Allumez et éteignez la lumière dans la cuisine (triple interrupteur - cuisine / salle de bain / WC) est l'épaule, le nez, l'auriculaire. Autrement dit, il est gênant en aucune façon, mais il est impossible de le réorganiser. Il y avait une tâche à gérer d'une manière ou d'une autre à distance.
Tous les capteurs de présence et de passage ont été immédiatement écartés - pas cette précision, il n'y a aucun contrôle par la volonté du propriétaire. La solution se trouve dans le contrôle du son, la voix. Je dirai tout de suite que je n'avais pas prévu de faire de reconnaissance vocale, ce n'est pas nécessaire ici. La lumière allumée par la pop a été décrite dans Radio 80, mais je ne voulais pas faire ça. Il s'est avéré une sorte de mains libres lorsque les mains sont occupées. Les détails sont connus.
Partie matériel.
Il y avait une carte avec Atmega32 avec du quartz et des périphériques
SEM0007M-32A et une dispersion d'électronique.
Il y avait un microphone et un amplificateur opérationnel. Pour la sortie, il y a un transistor dans un boîtier sot32 sur la carte, il y a aussi un relais de 7 ampères. Tout est assemblé poussé dans un coffret pour cartes de visite, le relais est mis en parallèle avec l'interrupteur, le microphone est caché sous la prise. Le schéma est banal, je ne l'ai même pas dessiné. Une seule entrée analogique et une sortie MK discrète sont utilisées. SEM est redondant, mais pour l'instant, laissez-le.
Carte et fils non assemblés. Puis il l'a refait plus précisément.L'interrupteur lui-même, le microphone n'est pas visible sous la prise démontée.Recherchez un algorithme.
Objectif: le capteur doit répondre à un mot, par exemple, «
lumière! »Avec un minimum de code.
Tâche: identifier le mot de commande sur fond de bruit, de coups et de clics possibles avec le même commutateur. C'est-à-dire que seule l'analyse d'amplitude ne convient pas, et l'analyse spectrale a montré qu'il y a trop d'harmoniques dans le mot et bien sûr elles changent. Il était donc nécessaire de rechercher une solution simple, mais avec une immunité au bruit acceptable. Vous pouvez faire plusieurs filtres temps-fréquence et une comparaison avec un échantillon du mot, mais vous n'avez pas besoin de vous occuper de la reconnaissance. Il a été décidé d'analyser la présence d'un seul son de voyelle, par exemple le son «E» ou «E».
Le son est "E". De nombreuses harmoniques sont visibles, de ce fait, l'analyse est difficile.Le son est "A." Le spectre a l'air plus propre, il y a une fréquence principale.Partie logiciel
Afin de connaître les composantes spectrales du signal, vous pouvez utiliser des filtres numériques. Il existe un
bon programme sur Internet
pour créer des filtres numériques FIR et IIR et calculer leurs coefficients - c'est clair et le code C est automatiquement généré.
Mais j'ai refusé les filtres numériquesPour un filtrage acceptable (4 ordres ou plus), de nombreux coefficients ont été obtenus, et même un flottant. Comme ça, plus tous les calculs de filtre dans le flotteur:
float ACoef[NCoef+1] = { 0.00000347268864059354, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00002083613184356122, 0.00000000000000000000, -0.00001389075456237415, 0.00000000000000000000, 0.00000347268864059354 }; float BCoef[NCoef+1] = { 1.00000000000000000000, -7.09708794063733790000, 22.77454294680684300000, -43.03321836036351300000, 52.29813665034108500000, -41.84199842886619100000, 21.53121088556695300000, -6.52398963450972500000, 0.89383378261285684000 };
Le microcontrôleur aurait pu le faire, mais il y aurait eu des problèmes de débogage - il n'est pas facile de déplacer les limites du filtre - ce sont de nouveaux coefficients à calculer.
Après quelques recherches, je me suis installé sur la transformée de Fourier monofréquence en ligne. C'est-à-dire que la transformée de Fourier discrète classique, effectuée à l'arrivée de chaque échantillon du signal avec une fréquence d'échantillonnage (1600 Hz), il n'y a pas de passage à travers les fréquences, il n'y a qu'une seule fréquence, il est donc facile de la configurer via RS-232 lors de la mise en service. En conséquence, l'analyse a été effectuée pour une fréquence de 128 Hz.
En raison de courts échantillons (blocs) et d'une fenêtre rectangulaire, la résolution en fréquence est faible, ce qui donne une sensibilité sélective dans la plage 114 ... 140 Hz,
et c'est le filtre P que je voulais obtenir.Vous devez d'abord comprendre où le signal de commande vocale commence à
crier . Pour ce faire, tout d'abord, un niveau de signal nul est calculé, par
lissage exponentiel avec une constante de lissage 1/64. Le code est ci-dessous.
Une partie du code temporisateur pour le traitement du signal. Fréquence de la minuterie 1600 HzLe signal se normalise à la moyenne. Pour déterminer le niveau d'intensité sonore, les valeurs absolues du signal sont également moyennées avec une constante de 1/16, pour le filtrage passe-haut des demi-ondes de signal individuelles (il s'agit d'un analogue de RMS, mais plus facile à calculer). Le dépassement de ce niveau au-dessus du seuil est le début d'une commande vocale et une analyse séquentielle de 5 blocs de 135 échantillons (84,3 ms) commence.
La figure ci-dessous montre le signal, le niveau du signal, le seuil et 5 blocs.
Protection contre les interférences
Le signal est divisé en blocs pour protéger contre une impulsion - un clic ou un coup. L'impulsion, comme vous le savez, a une réponse en fréquence uniforme, c'est-à-dire que dans n'importe quelle bande de fréquence, il y aura un résultat non nul et probablement au-dessus du seuil. Mais les
cheveux sont longs, mais l' impulsion de
l'esprit est courte. Autrement dit, il n'y aura plus d'impulsion dans le bloc suivant, ce qui signifie que le niveau dans la bande de fréquences sera inférieur au seuil. Simultanément avec cet avantage, les blocs courts donnent une
faible résolution en fréquence. Par conséquent, certaines différences de fréquence dans le signal tombent toujours dans la ligne de fréquence sélectionnée.
Conversion de fréquence
Dans chaque bloc, une transformée de Fourier à fréquence unique est effectuée pour une fréquence f.
Traditionnellement, pour accélérer les calculs, les fonctions sin et cos sont tabulées et mises à l'échelle à -127 .. + 127.
L'indice
si(ps)
tableau
si(ps)
est calculé à partir de l'argument sin (2 * π * f * t / T), bien sûr avec un bouclage à l'intérieur de la même période. L'index
pc
pour cos (2 * π * f * t / T) est simplement poussé de 12 positions vers l'avant dans le même tableau
si
.
Résultat
Y - le niveau de la raie spectrale est obtenu comme la somme des valeurs absolues des parties réelles et imaginaires pendant un bloc.
Alorsdans le bon sens, vous devez faire la somme des carrés et de la racine, mais c'est terrible pour un MK 8 bits.
Dans le même minuteur: a_si = (long int) (a * si[ps]) >> 4;
À la fin de chaque bloc,
Y est comparé à un seuil, le nombre de blocs est calculé qui dépasse les blocs déclenchés par seuil. Après les expériences, il s'est avéré que le nombre minimum de blocs déclenchés est de 3 sur 5.
Un exemple d'intensité spectrale en blocs avec une commande vocale. L'équipe est passée.Trois blocs déclenchés ou plus sont interprétés comme une commande correctement reçue. Le signal à la sortie discrète du MK est inversé, allumant ou éteignant la lumière. Puisque toute l'analyse a lieu à l'intérieur des blocs, il n'y a pas de retard de fonctionnement après le dernier bloc.
Le temps de calcul est d'environ 1600 cycles, la minuterie est appelée tous les 9000 cycles, donc la charge du MK est faible - il y a de la place pour d'autres expériences de reconnaissance. Ou vous pouvez faire une solution complète de tailles plus petites et sur un MK faible.
L'exactitude des algorithmes a été contrôlée par l'échange des variables nécessaires (log) via RS-232 avec le programme sur VBasic. La fréquence f et les seuils sont stockés dans eeprom.
En conséquence: le capteur s'est avéré très pratique, il répond aux mots de "
A ", par exemple,
" Waaau ", " Taaam ", " Laite ", " Miaaa ", " Yao-Yao " . Le volume est courant pour la conversation humaine. Le mot «
Lit » refuse obstinément d'écouter. Clics, frappant aux portes, marches, verser de l'eau ignore. Vous pouvez maintenant marcher avec des tasses et des assiettes pleines mains)).