Digitaler Tiefpassfilter



  • Hallo,

    wie der Titel ja schon preisgibt, versuche ich, ein digitales Tiefpassfilter mit Resonanz zu programmieren, um Musik damit zu machen. Hoffentlich bin ich dafür in der richtigen Unterkategorie. Ich kriege schon sonst das Programm hin, aber beim Filter stehe ich ein wenig ratlos da. Hier ist erstmal das Pseudo-Programm für das Filter:

    wellenformwert = berechneWellenform
    filterhüllkurve = berechneFilterhüllkurve
    filtergeschwindigkeit = (((wellenformwert - gefilterterWert) * filterhüllkurve) + filtergeschwindigkeit) / (filterhüllkurve + 1)
    gefilterterWert += filtergeschwindigkeit / resonanzwert
    

    Das macht das Programm im Grunde, es simuliert eine Art Schwung, da das das ist, was mir bei der Betrachtung von Oszilloskopmusik aufgefallen ist: Bei Resonanz bewegt sich der Ausgangswert auf die Wellenform zu, nimmt dabei Schwung auf und "schießt" damit quasi über die eigentliche Wellenform drüber. Das Problem liegt in den Feinheiten: Es entstehen zwar jetzt diese Nebenschwingungen, wenn die Resonanz da ist, allerdings habe ich wenig Ahnung, wie ich den Resonanzwert setzen muss, um schöne Ergebnisse zu erhalten. Ich konnte keinen Wert finden, bei dem die Rechteckwellenform so gefiltert wurde, wie es ein C64 schon mal gerne macht, was so ziemlich das Ziel des Musikprojekts war: Eine Art erweiterten C64-Soundchip virtuell basteln. Ich bin zur Annahme gekommen, dass mein Programm nicht so arbeitet, wie es soll, aber habe keine Ahnung, wie man es richtig schreiben müsste. Wikipedia und so sind mir auch keine Hilfe, ich verstehe die Formeln da nicht. Außerdem konnte ich einige Sachen nicht nachvollziehen: Ein Tiefpass-Filter soll Frequenzen unter seinem Cutoffwert verzögert, aber ungehindert durchlassen. Ich weiß aber nicht, wie man bei diesem Filterprogramm diese Cutofffrequenz berechnen kann, da eine Rechteckwellenform unabhängig von der Resonanz von dem Filter beeinflusst wird. Ich bin ziemlich planlos, wahrscheinlich übersehe ich was total.
    Könnt ihr mir helfen oder benötigt ihr mehr Infos?

    Gruß
    NoobTracker



  • Bei einem digitalen Tiefpaßfiltter würde ich persönlich erst eine FFT machen, dann filtern und anschleißend die Rücktransformation durchführen.



  • Ich fürchte, das geht zeitlich nicht, ich muss mindestens 10 Stimmen mit 50 kHz in Echtzeit berechnen.


  • Mod

    @NoobTracker sagte in Digitaler Tiefpassfilter:

    Ich fürchte, das geht zeitlich nicht, ich muss mindestens 10 Stimmen mit 50 kHz in Echtzeit berechnen.

    Wo ist da jetzt die logische Verbindung zwischen der Anforderung und der Folgerung, das ginge nicht? Audiotechnik ist heute fast ausschließlich digital, kann das, was du willst, und hat überhaupt kein Problem damit. Was denkst du denn, wie die das machen?



  • Ich möchte das auf einem ESP32 ausführen, der hat nur 240 MHz, Dual Core, davon nutze ich einen Kern mit 16 Stimmen zu mehr als 80% mit dieser Art Filter aus. Mehr als die Hälfte des Gerätes will ich nicht mit Musik nutzen. Und "die" machen das mit anderen Maschienen, womöglich mit Samples.



  • @SeppJ Außerdem war es nicht mein Plan, das mit FFT zu machen, ich möchte einfach einen neuen Wert errechnen und direkt den gefilterten Wert haben, da weiß ich nicht, ob das nicht etwas Vorlauf braucht, wenn man das mit Spektrumanalysen macht.


  • Mod

    Gedanken dazu:

    • Im Frequenzraum zu arbeiten ist nicht ohne Grund die Basis für alle Audioverarbeitung, egal ob digital oder analog. Da wirst du aus mathematischen Gründen nicht umher kommen.
    • FFT ist die beste Methode, ein digitales Signal im Frequenzraum darzustellen. Wer da eine wesentliche Verbesserung findet, wird Patentmillionär.
    • Vielleicht kann man deinen Code besser optimieren? Professionelle FFT-Bibliotheken bieten wesentlich höhere Leistung als alles, was man als Einzelperson selber programmieren kann. Nutzt du so etwas schon?
    • Ansonsten ist dein Rechner einfach zu schwach für deine Anforderungen. Vielleicht 15 Euro investieren in einen zweiten Controller?
    • Bezüglich Delay: Ja, der digitale Filter braucht Vorlauf, siehe oben, warum man da nicht herum kommt. Wie lang das mindestens sein muss, kommt auf den Filter an. Oder auf die Kompromisse für die man bereit ist. Letzteres gerade beim Tiefpassfilter, denn theoretisch müsste ein perfekter Tiefpassfilter ja das gesamte Signal kennen.
    • Ich kenne mich mit C64-Sound nicht so aus, aber es gibt ja unzählige Emulatoren. Arbeiten die deiner Einschätzung nach korrekt? Dann muss es ja möglich sein. Vielleicht ist dein Ansatz falsch, und du brauchst gar keinen Tiefpassfilter, sondern einen Gedächtniseffekt in deinem berechneWellenform-Schritt? Da ich wie gesagt zu wenig über C64-Sound weiß, konnte ich nicht so ganz folgen, als du dein Vorhaben erklärt hast.


  • @SeppJ Ja, die Emulatoren machen's richtig. Darum muss es ja gehen. Und bei berechneWellenform funktioniert alles, da wird eine Rechteckwellenform erzeugt.
    Über den C64-Sound: Man hat 3 Kanäle mit den Wellenformen Rechteck / Puls, Sägezahn, Dreieck und Rauschen. Dazu hat man dann einen Filter mit Resonanz und Cutofffrequenz. Einen der Sounds, den ich mit meinen Programm erzeugen will, ist der hier, der beim Bass.
    Ich weiß ja nicht, wie lange eine Spektrumanalyse und dann eine Zusammenschnippelung aus Sinuswellenformen dauert, aber mein Gefühl sagt mir, dass es etwas länger als ein Mal den Durchschnitt nehmen und etwas dividieren dauert. Ich weiß leider nicht, wie genau die analogen Schaltkreise arbeiten, aber einfach nur einen ElKo als Filter konnte ich schon so simulieren:

    wellenformwert = berechneWellenform
    filterhüllkurve = berechneFilterhüllkurve
    gefilterterWert = ((wellenformwert  * filterhüllkurve) + gefilterterWert) / (filterhüllkurve + 1)
    

    Vielleicht kann man das so in der Art auch mit Resonanz machen.



  • @NoobTracker
    Digitale Filter funktionieren anders als du denkst. Man unterscheidet grundsätzlich zwischen FIR Filter und IIR Filter.

    Versuche mal beide Artikel zu lesen und in groben Zügen zu verstehen. Insbesonders die Schaltbilder sind wichtig.

    Und dann würde ich dir ein paar Trockenübungen mit beispielsweise SciPy empfehlen. Dort gibt es ein Modul Signal Processing für die Signalbearbeitung.

    Dort gibt es eine Funktion firwin. Diese berechnet die Koeffizienten des FIR Filters, wie du sie im Wiki Artikel zu FIR siehst.

    So ich hoffe, ich habe dich damit nicht verschreckt.



  • @Quiche-Lorraine Danke für die ausführliche Antwort. Das kleine Problem ist, dass ich 12 bin und Formeln noch weniger als Aktienkurse verstehe. Daher werde ich daraus relativ wenig schlau. Ist es bei einem Filter mit Resonanz nicht so, dass eine Art Schwung entsteht?



  • @SeppJ sagte in Digitaler Tiefpassfilter:

    Gedanken dazu:

    • Im Frequenzraum zu arbeiten ist nicht ohne Grund die Basis für alle Audioverarbeitung, egal ob digital oder analog. Da wirst du aus mathematischen Gründen nicht umher kommen.

    Falsch. "Normale" Filter wie Hochpass, Tiefpass, Bandpass, Notch etc. arbeiten normalerweise im Zeitraum. Weil das viele Vorteile hat:

    • Es ist (viel) einfacher zu implementieren
    • Man kann damit gut analoge Filter simulieren (IIR) - bei Verarbeitung im Frequenzraum ist man dagegen auf FIR Filter eingeschränkt
    • Abhängig von der Anzahl der Filter braucht es viel weniger Rechenzeit (und man braucht schon eine ganze Menge Filter damit sich die Transformation vom Zeitraum in den Frequenzraum und wieder zurück rentiert)
    • Man kann ohne Probleme extrem geringe Latenzen realisieren
    • FFT ist die beste Methode, ein digitales Signal im Frequenzraum darzustellen. Wer da eine wesentliche Verbesserung findet, wird Patentmillionär.

    Ich glaube das ist abhängig von der Anwendung. Für Komprimierung wird sehr oft DCT verwendet. Manchmal auch Wavelet Transformationen.

    • Vielleicht kann man deinen Code besser optimieren? Professionelle FFT-Bibliotheken bieten wesentlich höhere Leistung als alles, was man als Einzelperson selber programmieren kann. Nutzt du so etwas schon?

    Man kann seinen Code sicher besser optimieren, aber IMO idealerweise ohne FFT o.Ä. zu verwenden. Ein Problem bei dem Code das ich sehe sind die zwei Divisionen. Die sind nicht nötig für analoge Filter. Im Prinzip braucht man dafür nur "multiply and accumulate" Operationen.



  • @NoobTracker
    Das Stichwort für digitale Simulation analoger Filter ist "biquad". Google mal nach biquad filter design oder so.

    Das schöne an Biquad Filtern ist dass du mit einer einzigen Funktion alle einfachen Filter simulieren kannst. Also Hochpass, Tiefpass, Shelving, Notch etc. - alles der selbe Code, nur unterschiedliche Parameter. (D.h. der Code zur Berechnung der Parameter ist natürlich unterschiedlich. Aber der muss ja nicht optimiert werden.)

    Es gibt unterschiedliche Formeln die man verwenden kann, und je nachdem welche Formel man verwendet muss man die Parameter unterschiedlich berechnen. Aber man kann mit jeder der Formeln alle Filterarten umsetzen.



  • @Quiche-Lorraine Wieso empfielst du ihm für eine Echtzeitanwendung wo es um wenig Delay geht FIR Filter? Bei so einfachen Sachen wie Hochpass oder Tiefpass sind FIR Filter IMO völlig unsinnig.



  • @mgaeckler Hast du vielleicht eine Idee wie man einem 12-jährigen erklären kann wie man einfache Filter (Hochpass, Tiefpass) digital implementiert und die Koeffizienten berechnet?



  • @hustbaer Es sieht sehr interessant aus und ich könnte damit bestimmt was anfangen, leider konnte ich aber kein Programm dafür finden. Hast du vielleicht ein Beispielprogramm parat?



  • @hustbaer

    Wieso empfielst du ihm für eine Echtzeitanwendung wo es um wenig Delay geht FIR Filter? Bei so einfachen Sachen wie Hochpass oder Tiefpass sind FIR Filter IMO völlig unsinnig.

    Sind FIR Filter so schlecht?

    Ich kennne die gewünschten Randbedingungen des Filters (Grenzfrequenz, Sperrbanddämpfung, Weichheit, Flankensteilheit,...) ja nicht und FIR Filter kann man diesbezüglich schön entwickeln.

    Des weiteren kenne ich im Audio Bereich für digitale Filter nur FIR und IIR. Im Analogen kenne ich noch andere Filter, wie Butterworth. Wie man diese aber in die digitale Welt herüberzieht weiß ich nicht. Der Butterworth Filter war übrigens auch der erste Filter, welcher mir in den Sinn kam, als ich den Thread las.

    Von daher war meine Antwort motiviert.

    Mal eine Frage zurück: Wie sähe denn eine Echtzeit-Alternative aus? Zum Beispiel ein Hochpassfilter mit 1kHz Grenzfrequenz aus?



  • Eine Frage: Wenn man einen ElKo als Tiefpassfilter einfach bei dem Signal parallel schaltet, wie kann man dann die Cutofffrequenz berechnen?



  • @NoobTracker
    Also wenn ich nach biquad filter design google dann finde ich als erstes das:
    https://arachnoid.com/BiQuadDesigner/index.html

    Und das sieht IMO schon recht brauchbar aus.
    Da ist auch einiges zu dem Thema beschrieben, angefangen von den Sampling Grundlagen bis hin zum "Aufbau" eines BiQuad Filters.

    Wenn dir das in Englisch zu heftig ist, kannst du mal den deutschen Wikipedia Artikel versuchen: https://de.wikipedia.org/wiki/Digitales_Filter

    Bzw. hier gibt's etwas Source-Code (natürlich auch englisch, ist halt so): https://www.earlevel.com/main/2012/11/26/biquad-c-source-code/

    Nochmal zurück zum Thema Englisch: ich kann dir nur wärmstens empfehlen neben dem Programmieren auch einiges an Zeit in Englisch zu investieren. Was mich als Jugendlicher ordentlich weitergebracht hat war englische Filme zu gucken. Klar, am Anfang braucht man Untertitel und versteht viel nicht, aber das kommt mit der Zeit. Speziell wenn du hin und wieder, wenn du ein Wort/eine Phrase nicht verstehst, kurz auf Pause drückst und es nachschlägst. Nicht jedes mal, sonst vergeht dir der Spass, aber halt öfter mal, speziell wenn es nicht aus dem Zusammenhang klar wird. Dank moderner Technik (Smartphones etc.) geht das ja heute viel viel einfacher als wo ich jung war.

    Wäre schade wenn du dich durch unzureichende Englischkenntnisse unnötigigerweise zu sehr einschränken würdest.



  • @hustbaer Ich gucke am Tag gefühlt 2 Stunden LGR, davon wurde mein Englisch merklich besser, am Anfang habe ich immer die Untertitel angestellt, jetzt nicht mehr.
    Oh, ich hätte runterscrollen müssen. Das guck ich mir dann mal an ...



  • Okay, dieses Programm sieht sehr wie mein Programm aus, nur ohne den Schwung. Im Grunde einfach nur so etwas wie mein ElKo-Programm.


Log in to reply