Soweit ich weiß, möchten Sie die Amplitude der 110-Hz-Komponente mit einer Bandbreite von weniger als der 12. Wurzel von 2 auf beiden Seiten erfassen. Die benachbarten Noten, die nicht erkannt werden sollten, sind 103,8 Hz und 116,5 Hz, die etwa 6% von der Mittenfrequenz abweichen.
Erstens ist dies ein sehr enger Filter. Dies wird mit analoger Elektronik nicht passieren, zumindest nicht im Basisband.
Sie können dies digital tun, indem Sie das zusammengesetzte Eingangssignal abtasten und mit sin und cos von 110 Hz multiplizieren. Tiefpassfilter jedes dieser Produkte, so dass 6 Hz auf den Pegel gedämpft werden, den benachbarte Noten gedämpft werden sollen. Quadrieren Sie dann jedes der Ergebnisse und addieren Sie sie. Diese einzelne Zahl ist das Quadrat der letzten Amplitude einer beliebigen 110-Hz-Komponente im Eingangssignal. Beachten Sie, dass dieser Filter, da er eine sehr schmale Bandbreite hat, langsam reagiert. Es dauert einige 100 ms, um einen Schritt in der eingehenden 110-Hz-Amplitude zu stabilisieren.
Wenn Sie nur feststellen möchten, dass die 100-Hz-Komponente über einem bestimmten Schwellenwert liegt, können Sie den quadratischen Amplitudenwert verwenden direkt. Wenn Sie die reale Amplitude benötigen, müssen Sie die Quadratwurzel des Ergebnisses ziehen.
Ich habe etwas Ähnliches getan, um einzelne DTMF-Frequenzen in einem DTMF-Signal zu erkennen. Die Frequenzen, die Bandbreite und damit die Zeitkonstanten sind unterschiedlich, aber der Algorithmus ist identisch. Hier ist ein Ergebnis, das den Amplitudenquadratwert zeigt, den ich oben für drei aufeinanderfolgende DTMF-Frequenzen beschrieben habe, wobei der Algorithmus so eingestellt ist, dass er die mittlere erkennt:
Hier ist das Code-Snippet das über jede Eingangsabtastung lief, um die quadratische Größe (MAGSQ) und die reale Größe (MAG) zu erzeugen:
für sampn: = 0 bis nsamp beginnen {einmal für jede Eingangsabtastung} t: = sampn * sampdt; {Zeit für dieses Beispiel festlegen} samp: = getsamp (t); {Eingabebeispiel abrufen} r: = t * freq; {Referenzfrequenzphase machen} ii: = abgeschnitten (r); r: = r - ii;
r: = r * pi2; prods: = samp * sin (r); {mix by ref Frequenz Sinus und Cosinus} prodc: = samp * cos (r); Filter (Filts, Prods); {Ergebnisse des Tiefpassfiltermischers} Filter (filtc, prodc); magsq: = sqr (filts.val) + sqr (filtc.val); {Quadrat der Größe berechnen} magsq: = magsq * 4.0; {normalisieren, so dass Eingabe 1.0 zu 1.0 führt} mag: = sqrt (magsq); {Lineare Größe berechnen}
Die Subroutine FILTER führt auf übliche Weise ein zweipoliges Tiefpassfilter durch. Jeder Pol folgt dem Standardalgorithmus:
FILT <-- FILT + FF (NEU - FILT)
In diesem Fall ist FF 1/128. Da es sich um eine ganzzahlige Potenz von zwei handelt (in diesem Fall -7), könnte sie in einem Mikrocontroller durch eine Rechtsverschiebung von 7 Bit ausgeführt werden