Zunächst einmal, tut mir leid, dass ich den Code hier nicht gepostet habe. Aus irgendeinem Grund wurde der ganze Code versaut, als ich versuchte, den Code einzugeben, den ich auf dieser Seite hatte, und es war wahrscheinlich zu viel, um ihn zu posten, um akzeptabel zu sein. Hier ist mein Code: Ссылка
Nun, aus dem, was mir gesagt wird, der Grund, warum ich aus diesem Code kein gutes Ergebnis herausbekommen kann, ist, dass ich keine Überlappung addiere. Ich habe versucht, auf mehreren Quellen im Internet zu lesen, warum ich Überlappung addieren muss, aber ich kann es nicht verstehen. Es scheint so, als würde der eigentliche Filter funktionieren, denn irgendetwas über dem gegebenen Cutoff wird in der Tat abgeschnitten.
Ich sollte erwähnen, dass dies Code ist, der für vst2-sdk funktioniert.
Kann mir jemand sagen, warum ich es hinzufügen muss und wie ich einen Überlappungscode in den gegebenen Code implementieren kann?
Ich sollte auch erwähnen, dass ich ziemlich dumm bin, wenn es um Algoritmen und Mathe geht. Ich bin eine jener Personen, die visuell begreifen müssen, was ich mache. Das oder Sachen, die durch Code erklärt werden :), und dann meine ich die tatsächliche Überlappung.
Überladen Theorie hinzufügen: Ссылка
Danke für die Hilfe, die Sie geben können!
Die overlap-add-Methode wird benötigt, um die Grenzen jedes fft-Puffers zu behandeln. Das Problem ist, dass die Multiplikation in der FFT-Domäne zu einer kreisförmigen Faltung im Zeitbereich führt. Dies bedeutet, dass nach dem Ausführen der IFFT die Ergebnisse am Ende des Rahmens die Ausgangsabtastwerte am Anfang des Rahmens umbrechen und verfälschen.
Es mag einfacher sein, so darüber nachzudenken: Angenommen, Sie haben einen Filter der Länge N
. Die lineare Faltung dieses Filters mit M
Eingangsabtastwerten gibt tatsächlich M+N-1
Ausgangsabtastwerte zurück. Die in der FFT-Domäne durchgeführte zirkulare Faltung führt jedoch zu der gleichen Anzahl von Eingabe- und Ausgabeabtastwerten, M
. Die zusätzlichen N-1
-Proben von der linearen Faltung haben sich um die ersten N-1
-Ausgabeproben "herumgewickelt" und sie korrumpiert.
Hier ist ein Beispiel (Matlab oder Oktave):
%Vor%Beachten Sie, dass die letzten zwei Samples sich um die ersten beiden Samples in dem runden Fall gewickelt und hinzugefügt haben.
Die Overlap-Add / Overlap-Save-Methoden sind im Wesentlichen Methoden zur Behandlung dieser Wraparound. Die Überlappung von FFT-Puffern wird benötigt, da die zyklische Faltung weniger unverfälschte Ausgangsabtastwerte zurückgibt als die Anzahl der Eingangsabtastwerte.
Wenn Sie eine Faltung (mit einem Filter mit endlicher Impulsantwort) durchführen, indem Sie die inverse diskrete Fourier-Transformation des Produkts der diskreten Fourier-Transformationen zweier Eingangssignale verwenden, implementieren Sie tatsächlich die zirkuläre Faltung. Ich nenne dies "Faltung im Frequenzbereich berechnet". (Wenn Sie nicht wissen, was eine kreisförmige Faltung ist, sehen Sie sich diesen Link an . Es ist im Grunde eine Faltung, bei der Sie davon ausgehen, dass Die Domäne ist kreisförmig, dh, das Signal wird von den Seiten verschoben, wodurch es sich auf die andere Seite der Domäne "wickelt".)
Im Allgemeinen möchten Sie eine Faltung durchführen, indem Sie schnelle Fourier-Transformationen für große Signale verwenden, da dies rechnerisch effizienter ist.
Overlap add (und sein Cousin Overlap save) sind Methoden, die um die Tatsache arbeiten, dass die im Frequenzbereich ausgeführten Windungen wirklich kreisförmige Faltungen sind, aber dass wir in der Realität selten zyklische Faltung, sondern eher lineare Faltungen machen wollen.
Überlappung addiert es durch "zero-padding" Chunks des Eingangssignals und verwendet dann entsprechend den Teil der kreisförmigen Faltungen (die in der Frequenzdomäne durchgeführt wurden) entsprechend. Overlap Save macht es, indem es nur den Teil des Signals hält, der der linearen Faltung entspricht und den Teil wirft, der durch die kreisförmigen Verschiebungen "korrumpiert" wurde.
Hier sind zwei Links aus Wikipedia für beide Methoden.
Overlap-add : Dieser hat eine schöne Figur, die erklärt, was vor sich geht.
Dieses Buch von Orfanidis erklärt es gut. Siehe Abschnitt 9.9.2. Es ist nicht der "De-facto" -Standard der Signalverarbeitung, aber er ist sehr gut geschrieben und ist meiner Meinung nach eine bessere Einführung als andere Bücher.
Zunächst versteht man, dass die Faltung im Zeitbereich der Multiplikation im Frequenzbereich entspricht. In der Faltung haben Sie ungefähr O (n * m), wobei n die FIR-Länge und m die Anzahl der zu filternden Samples ist. In der Frequenzdomäne, die FFT verwendend, führen Sie ein O (n * log n) aus. Für genügend große n sind die Kosten für das Filtern wesentlich geringer, wenn es den Frequenzbereich betrifft. Wenn n jedoch relativ klein ist, verringern sich die Vorteile auf den Punkt, der im Zeitbereich einfacher zu filtern ist. Dieser Haltepunkt ist jedoch subjektiv. Die Punkte 50 bis 100 sind der Punkt, an dem Sie wechseln könnten.
Ja, ein Faltungsfilter wird "funktionieren", um den Frequenzgang zu ändern. Aber diese Multiplikation in der Frequenzdomäne wird auch Zeitbereichsdaten an einem Ende mit Daten von dem anderen Ende kontaminieren und umgekehrt. Overlap add / save erweitert die FFT-Größe und schneidet das "kontaminierte" Ende ab und verwendet dann diese Enddaten, um den Anfang des nachfolgenden FFT-Fensters zu fixieren.
Tags und Links c++ filter fft convolution vst