Bandpassfilter zum Isolieren der Musiknote „A2“

Ich möchte einen Bandpassfilter entwerfen, um die Musiknote A2 (110 Hz) mit einer Genauigkeit von einem halben Schritt von ihren Nachbarnoten zu isolieren. Dies bedeutet, dass G2# = 103.83Hzund A2# = 116.54Hzim Stoppband liegen sollten.

Im Idealfall wären 110Hz bei 0 Gain. G2# und A2# wären stumm (unendliche negative Verstärkung?), und es würde ein sanftes Abrollen von A2 zu jeder benachbarten Note geben.

Wie kann ich meinen Fenstertyp auswählen, bestimmen, wie viele Koeffizienten erforderlich sind, und diese Koeffizienten berechnen?

Ich habe an der Universität ein paar EE-Kurse belegt, aber ich bin weit davon entfernt, ein Elektroingenieur zu sein. Bitten Sie daher um Klärung, wo dies erforderlich ist.

Verweise:

Möchten Sie diese Frequenz letztendlich durchlassen oder nur ihre Präsenz / Amplitude erkennen?
@ChrisStratton: Im Moment möchte ich nur seine Amplitude überprüfen. Schließlich möchte ich vielleicht auch andere Qualitäten des Signals bei dieser Frequenz bestimmen.
Möchten Sie einen digitalen Filter in einem DSP oder einer analogen Schaltung erstellen?

Antworten (5)

So wie ich es verstehe, möchten Sie die Amplitude der 110-Hz-Komponente mit einer Bandbreite von weniger als der 12. Wurzel von 2 auf beiden Seiten erkennen. Die benachbarten Noten, die nicht erkannt werden sollten, sind 103,8 Hz und 116,5 Hz, die etwa 6 % von der Mittenfrequenz entfernt sind.

Erstens ist das ein sehr enger Filter. Mit analoger Elektronik wird das 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, auf dem benachbarte Noten gedämpft werden sollen. Quadriere dann jedes der Ergebnisse und summiere sie. Diese einzelne Zahl ist das Quadrat der aktuellen Amplitude einer beliebigen 110-Hz-Komponente im Eingangssignal. Denken Sie daran, dass dieser Filter langsam reagiert, da er eine sehr schmale Bandbreite hat. Es dauert einige 100 ms, um sich von einem Schritt in der eingehenden 110-Hz-Amplitude zu stabilisieren.

Wenn Sie nur erkennen möchten, dass die 100-Hz-Komponente über einem bestimmten Schwellenwert liegt, können Sie den quadrierten Amplitudenwert direkt verwenden. Wenn Sie die tatsächliche Amplitude benötigen, müssen Sie die Quadratwurzel aus dem Ergebnis 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 quadrierten Amplitudenwert zeigt, den ich oben für drei aufeinanderfolgende DTMF-Frequenzen beschrieben habe, wobei der Algorithmus so eingerichtet ist, dass er die mittlere erkennt:

Hier ist das Code-Snippet, das über jedes Eingabe-Sample lief, um die quadrierte Größe (MAGSQ) und die tatsächliche Größe (MAG) zu erzeugen:

  for sampn := 0 bis nsamp do begin {einmal für jedes Eingabe-Sample}
    t := sampn * sampdt; {Machen Sie Zeit für dieses Beispiel}
    samp := getsamp (t); {Eingabebeispiel abrufen}
    r := t * Frequenz; {Referenzfrequenzphase erstellen}
    ii := trunc(r);
    r := r - ii;
    r := r * pi2;
    prods := samp * sin(r); {Mischen nach Ref-Frequenz Sinus und Cosinus}
    prodc := sample * cos(r);
    filter (filts, prods); {Ergebnisse des Tiefpassfiltermixers}
    filtern (filtc, prodc);
    magsq := sqr(filts.val) + sqr(filtc.val); {Größenquadrat berechnen}
    magsq := magsq * 4,0; {normalisieren, sodass Eingabe 1,0 1,0 ergibt}
    mag := sqrt(magsq); {lineare Größe berechnen}

Die Subroutine FILTER führt auf übliche Weise einen zweipoligen Tiefpassfilter durch. Jeder Pol folgt dem Standardalgorithmus:

FILTERN <-- FILTERN + FF(NEU - FILTERN)

In diesem Fall ist FF 1/128. Da es sich um eine ganzzahlige Zweierpotenz (in diesem Fall –7) handelt, könnte dies in einem Mikrocontroller durch eine Rechtsverschiebung von 7 Bits durchgeführt werden.

Ich denke, der Tondecoder-IC LM567 verwendet im Wesentlichen diese Technik. ti.com/lit/ds/symlink/lm567.pdf

Wie Olin feststellte, ist die Bandbreite für Analog sehr schmal. Sehr.

Eine PLL kann sich der Herausforderung durchaus stellen.

Klingt sehr nach Arbeit für einen Lock-In-Verstärker. Was wohl einer Hardwareform der vorgeschlagenen DFT nahe kommt.

Siehe Ende für hervorragende Jim Williams App Note..


Lock-In-Verstärker:

Nützliche Übersicht über Princeton

Volldigitales FPGA-Lock-in-Verstärker- Princeton-Projekt. Gut. Verilog.

Labview-Implementierung - gut. Viele unterstützende Materialien und Links. Hervorragende Leistung.

Universitätsnotizen zu einem Kurs - einige nützliche Materialien.

Hier ist eine 26 Jahre alte App-Notiz des verstorbenen großartigen Jim Williams, die genau das sein könnte, was Sie wollen. Anwendungen für einen Switched-Capacitor-Instrumentierungsbaustein .

Siehe Abbildung 4 und Text auf den Seiten AN3-3 und An3-4. Wenn es nach potenziellem Wert aussieht, sollten Sie sich wahrscheinlich viele der anderen angegebenen Beispiele ansehen.

Ob dies zutrifft, hängt teilweise davon ab, ob Sie Zugriff auf die A2-Quelle haben, die das mit anderen Signalen gemischte A2 erzeugt hat. Wenn Sie das tun, dann funktioniert dies hervorragend - Sie haben einen "Homodyne". Wenn nicht, können Sie einen lokal erzeugten A2 für den Chopper-Treiber verwenden (Pin 16-Einspeisung zum LTC1043), aber Sie haben keine Phasenkohärenz. Ergebnisse KÖNNEN trotzdem nützlich sein. LTC1043-Datenblatt – auf Lager für 5,70 US-Dollar pro Stück bei Digikey. Das ist DIP18. Auch verfügbar in SOIC18.

Geben Sie hier die Bildbeschreibung ein

Sie sagen:

Lock-In-Verstärker Der in Abbildung 3 verwendete AC-Träger-Ansatz kann erweitert werden, um einen „Lock-In“-Verstärker zu bilden. Ein Lock-in-Verstärker arbeitet durch synchrones Erfassen des trägermodulierten Ausgangs der Signalquelle. Da die gewünschte Signalinformation im Träger enthalten ist, stellt das System einen extrem schmalbandigen Verstärker dar. Nicht trägerbezogene Komponenten werden zurückgewiesen und der Verstärker lässt nur Signale durch, die mit dem Träger kohärent sind. In der Praxis können Lock-In-Verstärker ein Signal 120 dB unter dem Rauschpegel extrahieren

Abbildung 4 zeigt einen Lock-in-Verstärker, der eine einzelne LTC1043-Sektion verwendet. Bei dieser Anwendung ist die Signalquelle eine Thermistorbrücke, die extrem kleine Temperaturverschiebungen in einer biochemischen Mikrokalorimetrie-Reaktionskammer erfasst.

Der 500-Hz-Träger wird am Eingang von T1 angelegt (Spur A, Abbildung 5). Der schwebende Ausgang von T1 treibt die Thermistorbrücke, die A1 einen unsymmetrischen Ausgang liefert. A1 arbeitet mit einer AC-Verstärkung von 1000. Eine 60-Hz-Breitbandrauschquelle wird auch absichtlich in den Eingang von A1 eingespeist (Spur B). Die Nulldurchgänge des Trägers werden von C1 erkannt. Der Ausgang von C1 taktet den LTC1043 (Spur C). Der Ausgang von A1 (Spur D) zeigt das gewünschte 500-Hz-Signal, das in der 60-Hz-Rauschquelle verborgen ist. Das nulldurchgangssynchronisierte Schalten des LTC1043 am positiven Eingang von A2 (Spur E) bewirkt, dass die Verstärkung von A2 zwischen plus und minus eins wechselt. Als Ergebnis wird der Ausgang von A1 von A2 synchron demoduliert. Der Ausgang von A2 (Spur F) besteht aus einem demodulierten Trägersignal und nicht kohärenten Komponenten. Die gewünschte Amplituden- und Polaritätsinformation des Trägers ist in der Ausgabe von A2 erkennbar und wird durch Filtermittelung bei A3 extrahiert. Um diese Schaltung zu trimmen, stellen Sie das Phasenpotentiometer so ein, dass C1 schaltet, wenn der Träger durch Null geht

LT, AN3, Juli 1985:

http://cds.linear.com/docs/Application%20Note/an03f.pdf

Es gibt einen sogenannten „Goertzl-Algorithmus“, der häufig in DSPs verwendet wird, um einzelne Frequenzen innerhalb eines Zeitbereichssignals zu erkennen, beispielsweise um DTMF-Töne abzugreifen. Im Wesentlichen ist es eine optimierte diskrete Fourier-Transformation, aber es ist sehr einfach zu programmieren. Google liefert bei Interesse zahlreiche Beispiele.

Hinweis: Ich poste dies eher als FYI, da die erforderlichen Komponenten kundenspezifisch hergestellt werden müssten und lächerlich teuer wären.

Es ist wirklich eher ein Gedankenexperiment.


Dies ist bei Analog ziemlich leicht möglich (wie bei der elektrischen Konstruktion ist einfach. Die mechanische Konstruktion? nicht so sehr), vorausgesetzt, Sie können die richtigen Komponenten erwerben.

Was Sie wollen, ist ein Niederfrequenz- Quarzfilter .

Die eigentliche Herausforderung wird darin bestehen, Kristalle mit ausreichend niedriger Frequenz zu beschaffen.

Ich weiß, dass es möglich ist, Quarzoszillatoren unter 1000 Hz herzustellen, aber außerhalb von ELF / VLF-Militärempfängern (z. B. für U-Boot-Kommunikation) gibt es keinen Markt für sie, daher sind sie im Grunde nicht verfügbar.

Wenn Sie lernen möchten, Ihre eigenen Kristalle zu schleifen, wäre dies jedoch sicherlich ein interessantes Projekt!


Eine andere interessante Idee wäre, zu versuchen, einen eigenen SAW-Filter zu bauen . Ich denke, das wäre mit ein paar Piezoaktoren möglich. Sie würden eine Art Resonanzmasse benötigen (zum Teufel, vielleicht verwenden Sie eine echte Stimmgabel) und sie hätte wahrscheinlich mehrere Resonanzmodi, sodass Sie zusätzlich zum mechanischen Filter eine elektrische Filterung benötigen würden, aber dies wäre sicherlich einfacher zu bewerkstelligen Dann schleifen Sie Ihre eigenen benutzerdefinierten Quarzkristalle.

Ich weiß allerdings nicht, welche Art von Roll-Offs Sie erreichen könnten.

Als eine Art Gedankenexperiment habe ich mir auch Gedanken gemacht, wie man das analog hinbekommt. Haben Sie schon von "N-Pfad"-Filtern gehört? Hier ist ein Link (Warnung, Mathe schwer): alcatel-lucent.com/bstj/vol39-1960/articles/bstj39-5-1321.pdf Sie sind im Grunde eine Art Filter mit geschalteten Kondensatoren, bei niedrigen Frequenzen können Sie sie verwenden bauen Sie Bandpassfilter mit Q-Faktoren in Millionenhöhe.
@Bitrex - Interessant. Es sieht so aus, als würden sowohl das verlinkte PDF als auch der SAW-Ansatz dasselbe tun, nämlich ein mechanisches System verwenden, um ein FIR-System zu simulieren.
@Bitrex: Sie wollen in diesem Fall kein Q in Millionenhöhe. Das würde das Durchlassband so extrem schmal machen, dass die Reaktion sehr langsam wäre. Denk darüber nach. 1M Zyklen bei 110Hz ist eine lange Zeit.
@Olin Lathrop - Ich glaube nicht, dass er gesagt hat, dass Sie das in diesem Fall wollen würden, nur dass diese Technik solche Filterleistungen erzielen könnte.

Wenn Sie nur die Note messen möchten, prüfen Sie die Verwendung der diskreten Fourier-Transformation, die nur bei der interessierenden Frequenz ausgewertet wird (es gibt auch einige andere Algorithmen, aber dieser ist leicht zu beschreiben).

Im Wesentlichen multiplizieren Sie für einige Zeit die Eingangsabtastwerte sowohl mit dem Kosinus als auch mit dem Sinus einer Variablen, die mit der gewünschten Frequenz inkrementiert wird, und akkumulieren die Ergebnisse separat als die beiden Komponenten einer komplexen Zahl. Aus den Summen können Sie den Betrag (Quadratwurzel aus der Summe der Quadrate) und die Phase entnehmen.

Um die Störerkennung anderer Frequenzen zu reduzieren, möchten Sie möglicherweise eine Fensterfunktion wie einen erhöhten Kosinus (Kosinus + 1, von -pi/2 bis pi/2) verwenden, der das Signal sanft ein- und ausblendet, um es zu reduzieren Kontamination der Analyse mit Artefakten von abrupten Start- und Stop-Übergängen.

Sie haben den Teil über die Tiefpassfilterung der Sin- und Cos-Produkte ausgelassen. So wird die schmale Bandbreite erreicht. Die Breite dieses Filters legt das Frequenzdelta um das gewünschte Signal fest, das erkannt wird.
@OlinLathrop - nein, ich habe es nicht ausgelassen, wie ich sagte, um sich für einige Zeit anzusammeln. Die Zeitdauer bestimmt die Bandbreite, und ja, es ist eine Art Tiefpassfilter. Während es möglich ist, diesen Filter in einer kontinuierlichen Form zu erstellen, ist das Konstrukt „akkumulieren, aufzeichnen, ausgeben und neu beginnen“ üblicher. Was angemessen ist, hängt davon ab, wie oft eine Antwort benötigt wird – wenn öfter als die für die gewünschte Schärfe erforderliche Akkumulationsperiode, dann müssen sich die Perioden überlappen, möglicherweise bis zum Äußersten von kontinuierlich.
OK, ich wusste nicht, dass du das mit "seit einiger Zeit" meinst. Ja, das ist ein Tiefpassfilter, speziell ein Boxfilter. Es gibt bessere Filter, die weniger Zustand benötigen und einen besseren Frequenzgang haben und rechnerisch ungefähr gleich sind, aber das wird funktionieren. Ich bin nicht der Meinung, dass die Stapelverarbeitung von Datenblöcken häufiger ist. Es gibt gute Gründe, das nicht zu tun. Ich denke, die meiste Zeit wird es gemacht, weil das alles ist, wovon derjenige, der die Firmware geschrieben hat, wusste.
@OlinLathrop - Nein, angesichts der im letzten Absatz erwähnten Fensterfunktion handelt es sich nicht wirklich um einen Boxfilter. Hauptgründe für die Chunk-Verarbeitung sind die geringeren Speicher- und Rechenanforderungen - für einen kontinuierlichen Filter benötigen Sie etwas FIFO-ähnliches für die Verzögerungsabgriffe. Letztendlich macht es wenig Sinn, mehr Ergebnisse zu berechnen, als Sie verwenden werden.
Nein, Sie brauchen keinen FIFO für "Verzögerungsabgriffe". Das ist für FIR-Filter. Siehe meinen Code oben für ein Beispiel der kontinuierlichen Verarbeitung ohne diese Dinge. Dieses Problem ist besser für einen IIR-Filter geeignet.
Sie haben die interne Implementierung Ihres Filters nicht gepostet, daher gibt es nichts zu "sehen". Und ein zeitdiskretes IIR-Filter erfordert Verzögerungselemente, wenn auch nicht so viele.
Das sollte offensichtlich sein. Ich mache dort nichts Ungewöhnliches, nur zwei Pole einfacher Tiefpassfilterung. Da Sie jedoch fragen, habe ich meine Antwort hinzugefügt, um sie explizit zu zeigen. Jeder Pol erfordert nur ein Zustandsstück, und die Berechnung pro Abtastung ist einfach.