Ich versuche, den Live-Eingangston zu FFTen und ihn so zu filtern, dass er nur 350 bis 500 Hz hat. Mein Ziel ist es also, das LED-Licht nur einzuschalten, wenn ein Ton eine Frequenz zwischen 350-500 hat. Ich habe mir FFT-Codes angesehen, weiß aber nicht, wie ich sie filtern und das Ausgangssignal senden soll.
Ich bin sehr neu im Arduino-Board. Sie können davon ausgehen, dass ich nichts über das Arduino-Board oder die C-Programmierung weiß. Bitte seien Sie so genau wie möglich. Danke.
Ich würde vorschlagen, eine Art Bandpassfilter zu bauen, gefolgt von einem Spitzendetektor und einem Komparator. Sie können einen RLC-Bandpassfilter oder vielleicht einen aktiven Bandpassfilter mit ein paar Operationsverstärkern und einigen passiven Komponenten bauen. Wie steil muss der Cutoff des Filters sein? Wenn Sie eine sehr steile Grenzfrequenz benötigen, benötigen Sie wahrscheinlich einen aktiven Filter.
Alternativ können Sie das Signal durch einen RC-Tiefpassfilter laufen lassen, es mit dem Arduino ADC abtasten und mit einem DSP-Bandpassfilter filtern. Ich weiß, dass Matlab eine Toolbox zum Erstellen von FIR- und IIR-Filtern hat; Ich würde vorschlagen, dies zu verwenden, um die korrekten Filterkoeffizienten zu berechnen. Ich glaube nicht, dass der Arduino Ihnen genügend Zyklen geben wird, um eine FFT in Echtzeit durchzuführen, und Sie müssten immer noch die Tiefpassfilterung und das Abtasten mit einer FFT durchführen.
"Nur 350 Hz bis 500 Hz" ist eine praktische Unmöglichkeit. Jeder Filter, der Frequenzen unterhalb und oberhalb einer bestimmten Grenze vollständig auslöscht, benötigt unendlich viel Zeit, um das Signal zu verarbeiten. Da Sie die Out-of-Band-Parameter nicht angegeben haben, ist es etwas schwierig, Ratschläge zu geben. Welches Wissen über digitale Filterung ich habe, könnte ein wenig helfen: -
Da ich ein Elektroniker bin, emuliert der digitale LP-Filter einen einfachen RC-Filter. Dieser Filter kann auf eine Tiefpassgrenze von 500 Hz eingestellt werden und wenn die Abtastfrequenz (die Rate, mit der Sie ADC-Abtastwerte sammeln) (z. B.) 10 kHz beträgt, ist T = 100 x 10 , und CR wird sein = 318 x 10 .
Dadurch erhalten Sie einen Tiefpassfilter erster Ordnung, den Sie verbessern können, indem Sie einige weitere kaskadieren, um einen steileren Roll-Off zu erzielen. Um einen Hochpassfilter zu erhalten, verwenden Sie dieselbe Topologie und beachten Sie, dass der Hochpassausgang wie unten gezeigt verfügbar ist: -
Es gibt ein paar andere Schnickschnack, die angewendet werden können, um die Steilheit des Filters enger zu machen, aber ich werde hier nicht darauf eingehen, weil es wahrscheinlich nicht benötigt wird oder zu tief ist. Beachten Sie, dass "Abtastzeit" und "Verzögerungszeit" in den beiden Diagrammen genau gleich sind - ich war bei der Benennung nicht sehr konsequent!
Nachdem Sie das Signal ausreichend gefiltert haben, müssen Sie den Effektivwert des resultierenden Signals berechnen und einen Schwellenwert für die Triggerung festlegen. Dies kann einen Arduino-Ausgang (oder einen beliebigen MCU-Ausgang) speisen, um ein Signal an die Außenwelt zu senden.
Der Vollständigkeit halber zeigen viele digitale Filterbücher den Filter wie folgt: -
Es ist mathematisch dasselbe, wird aber neu angeordnet, wie es in vielen Artikeln über digitale IIC-Filter (Infinite Impulse Response) gezeigt wird. Ich bevorzuge die Bilder früher, weil sie direkter mit dem einfachen analogen CR-Filter in Verbindung gebracht werden können. Viel Glück.
Ignacio Vazquez-Abrams
Bri
Ignacio Vazquez-Abrams
Bri
Ignacio Vazquez-Abrams
Andi aka