Hallo Community!
Ich hatte den Wunsch, wieder mit dem Mikrocontroller herumzuspielen und etwas Nützliches zu tun. Das Ziel wurde fast sofort gebildet, als mich etwas in der Wohnung störte.
Wie Sie wissen, ist ein Computertisch ein Esstisch, an dem Sie Drobyshevsky beobachten oder Giktayms / Green Cat / usw. lesen können. gleichzeitig mit dem Abendessen. Aber es gibt ein Problem - ich gehe normalerweise mit
beiden fleißigen Händen aus der Küche und auch zurück,
weil die Tassen in drei Teilen gestapelt sind. Ein- und Ausschalten des Lichts in der Küche (Dreifachschalter - Küche / Bad / WC) ist die Schulter, Nase, kleiner Finger. Das heißt, es ist in keiner Weise unpraktisch, aber es ist unmöglich, es neu anzuordnen. Es gab eine Aufgabe, die irgendwie aus der Ferne erledigt werden musste.
Alle Anwesenheits- und Durchgangssensoren wurden sofort entlassen - nicht diese Genauigkeit, es gibt keine Kontrolle durch den Willen des Eigentümers. Die Lösung liegt in der Klangsteuerung, Sprache. Ich werde gleich sagen, dass ich keine Spracherkennung geplant habe, sie wird hier nicht benötigt. Das von Pop eingeschaltete Licht wurde in Radio 80s beschrieben, aber das wollte ich nicht. Es stellte sich heraus, dass die Hände frei waren, wenn die Hände beschäftigt waren. Details sind auf.
Hardware-Teil.
Es gab eine Platine mit Atmega32 mit Quarz und Peripheriegeräten
SEM0007M-32A und einer Streuung der Elektronik.
Es gab ein Mikrofon und einen Operationsverstärker. Für den Ausgang befindet sich ein Transistor in einem sot32-Gehäuse auf der Platine sowie ein 7-Ampere-Relais. Alles wird zusammengebaut in eine Box für Visitenkarten geschoben, das Relais ist parallel zum Schalter geschaltet, das Mikrofon ist unter der Steckdose versteckt. Das Schema ist alltäglich, ich habe es nicht einmal gezeichnet. Es werden nur ein Analogeingang und ein diskreter MK-Ausgang verwendet. SEM ist redundant, aber lassen Sie es vorerst sein.
Platine und nicht montierte Drähte. Dann überarbeitete er es genauer.Der Schalter selbst, das Mikrofon, ist unter der zerlegten Steckdose nicht sichtbar.Suchen Sie nach einem Algorithmus.
Zweck: Der Sensor muss auf ein Wort reagieren, z. B. „
Licht! »Mit einem Minimum an Code.
Aufgabe: Identifizieren Sie das Befehlswort vor dem Hintergrund möglicher Geräusche, Klopfen und Klicks mit demselben Schalter. Das heißt, nur die Amplitudenanalyse ist nicht geeignet, und die Spektralanalyse hat gezeigt, dass das Wort zu viele Harmonische enthält und sich diese natürlich ändern. Daher war es notwendig, nach einer einfachen Lösung zu suchen, die jedoch eine akzeptable Störfestigkeit aufweist. Sie können mehrere Zeit-Frequenz-Filter und einen Vergleich mit einer Stichprobe des Wortes durchführen, müssen sich jedoch nicht mit der Erkennung befassen. Es wurde beschlossen, nur das Vorhandensein eines Vokaltons zu analysieren, beispielsweise des Tons „E“ oder „E“.
Der Ton ist "E". Viele Harmonische sind sichtbar, daher ist die Analyse schwierig.Der Ton ist "A." Das Spektrum sieht sauberer aus, es gibt eine Hauptfrequenz.Software-Teil
Um die Spektralkomponenten des Signals zu kennen, können Sie digitale Filter verwenden.
Im Internet gibt es ein
gutes Programm zum Erstellen digitaler FIR- und IIR-Filter und zum Berechnen ihrer Koeffizienten - es ist dort klar und C-Code wird automatisch generiert.
Aber ich habe digitale Filter abgelehntFür eine akzeptable Filterung (4 oder mehr Ordnungen) wurden viele Koeffizienten und sogar ein Float erhalten. So und alle Filterberechnungen im Float:
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 };
Der Mikrocontroller hätte es vielleicht getan, aber es hätte Probleme beim Debuggen gegeben - es ist nicht einfach, die Filtergrenzen zu verschieben - dies sind neue zu berechnende Koeffizienten.
Nach einigem Suchen habe ich mich online für die Einzelfrequenz-Fourier-Transformation entschieden. Das heißt, die klassische diskrete Fourier-Transformation, die beim Eintreffen jeder Abtastung des Signals mit einer Abtastfrequenz (1600 Hz) durchgeführt wird, es gibt keinen Durchgang durch die Frequenzen, es gibt nur eine Frequenz, so dass es einfach ist, sie während der Inbetriebnahme über RS-232 zu konfigurieren. Als Ergebnis wurde die Analyse für eine Frequenz von 128 Hz durchgeführt.
Aufgrund kurzer Abtastwerte (Blöcke) und eines rechteckigen Fensters ist die Frequenzauflösung niedrig, was eine selektive Empfindlichkeit im Bereich von 114 bis 140 Hz ergibt,
und dies ist der P-Filter, den ich erhalten wollte.Zuerst müssen Sie verstehen, wo das Sprachbefehlssignal zu
schreien beginnt. Dazu wird zunächst durch
exponentielle Glättung mit einer Glättungskonstante 1/64 ein Signalpegel von Null berechnet. Der Code ist unten.
Teil des Timer-Codes für die Signalverarbeitung. Timerfrequenz 1600 HzDas Signal normalisiert sich auf den Durchschnitt. Zur Bestimmung des Schallpegels werden auch die Absolutwerte des Signals mit einer Konstanten von 1/16 gemittelt, um aus einzelnen Signalhalbwellen hochpassgefiltert zu werden (dies ist ein Analogon von RMS, aber einfacher zu berechnen). Das Überschreiten dieses Pegels über dem Schwellenwert ist der Beginn eines Sprachbefehls, und eine sequentielle Analyse von 5 Blöcken mit 135 Abtastwerten (84,3 ms) beginnt.
Die folgende Abbildung zeigt das Signal, den Signalpegel, den Schwellenwert und 5 Blöcke.
Störschutz
Das Signal ist zum Schutz vor einem Impuls - einem Klicken oder einem Klopfen - in Blöcke unterteilt. Wie Sie wissen, hat der Impuls einen gleichmäßigen Frequenzgang, dh in jedem Frequenzband gibt es ein Ergebnis ungleich Null und wahrscheinlich über dem Schwellenwert. Aber die
Haare sind lang, aber der Impuls
des Geistes ist kurz. Das heißt, im nächsten Block gibt es keinen Impuls mehr, was bedeutet, dass der Pegel im Frequenzband unter dem Schwellenwert liegt. Gleichzeitig mit diesem Vorteil ergeben kurze Blöcke eine
niedrige Frequenzauflösung. Daher fallen einige Frequenzunterschiede im Signal immer noch in die ausgewählte Frequenzlinie.
Frequenzumwandlung
In jedem Block wird eine Einzelfrequenz-Fourier-Transformation für eine Frequenz f durchgeführt.
Um die Berechnungen zu beschleunigen, werden die sin- und cos-Funktionen traditionell tabelliert und auf -127 .. + 127 skaliert.
Der
ps
Index des
si(ps)
-Arrays wird aus dem Argument sin (2 * π * f * t / T) berechnet, natürlich mit einem Loopback innerhalb derselben Periode. Der
pc
Index für cos (2 * π * f * t / T) wird im selben
si
Array einfach um 12 Positionen nach vorne verschoben.
Ergebnis
Y - Der Pegel der Spektrallinie wird als Summe der Absolutwerte des Real- und Imaginärteils während eines Blocks erhalten.
AlsoAuf die richtige Weise müssen Sie die Summe der Quadrate und der Wurzel machen, aber das ist für einen 8-Bit-MK schrecklich.
Im gleichen Timer: a_si = (long int) (a * si[ps]) >> 4;
Am Ende jedes Blocks wird
Y mit einem Schwellenwert verglichen, die Anzahl der Blöcke wird berechnet, die den durch den Schwellenwert ausgelösten Block überschreitet. Nach den Experimenten stellte sich heraus, dass die Mindestanzahl der ausgelösten Blöcke 3 von 5 beträgt.
Ein Beispiel für die spektrale Intensität in Blöcken mit einem Sprachbefehl. Das Team hat bestanden.Drei oder mehr ausgelöste Blöcke werden als korrekt empfangener Befehl interpretiert. Das Signal am diskreten Ausgang des MK wird invertiert und das Licht ein- oder ausgeschaltet. Da die gesamte Analyse innerhalb der Blöcke stattfindet, gibt es nach dem letzten Block keine Verzögerung im Betrieb.
Die Rechenzeit beträgt ca. 1600 Zyklen, der Timer wird alle 9000 Zyklen aufgerufen, so dass die Last des MK gering ist - es gibt Raum für weitere Experimente mit Erkennung. Oder Sie können eine Komplettlösung in kleineren Größen und auf einem schwachen MK erstellen.
Die Richtigkeit der Algorithmen wurde durch den Austausch der notwendigen Variablen (log) über RS-232 mit dem Programm auf VBasic überprüft. Frequenz f und Schwellenwerte werden in eeprom gespeichert.
Als Ergebnis: Der Sensor erwies sich als sehr praktisch und reagiert auf Wörter aus "
A ", z. B.
" Waaau ", " Taaam ", " Laite ", " Miaaa ", " Yao-Yao " . Lautstärke ist für menschliche Gespräche üblich. Das Wort "
Lit " weigert sich hartnäckig zuzuhören. Klicks, Klopfen an Türen, Stufen, Gießen von Wasser ignoriert. Jetzt können Sie mit vollen Händen Tassen und Teller gehen)).