Algorithmus für den digitalen Verzerrungseffekt


10

Ich habe das DAFX-Buch von Udo Zölzer über den Verzerrungseffekt auf den Seiten 124-125 gelesen und es besagt, dass eine geeignete Simulation der Verzerrung durch die Funktion gegeben ist:

f(x)=x|x|(1ex2/|x|)

Kann jemand diese Formel erklären und welche Art von Signal wir bekommen?

Soweit ich weiß, ist 'x' das abgetastete Signal, also ist dies eine Folge von Zahlen. Was macht | x | bedeuten? Bezieht es sich auf den absoluten Wert von x für jeden abgetasteten Wert?

Wenn ich also diese Simulation des Verzerrungseffekts implementieren möchte,

  1. Ich muss die Länge von x kennen (es wird durch die Anzahl der Proben gegeben)
  2. In einer Schleife muss ich diese Formel für jeden Stichprobenwert berechnen
  3. Nach dem Ende der Schleife erhalte ich das verzerrte Signal (in digitaler Form).

Danach muss ich es in ein analoges Signal umwandeln, damit ich es hören kann.


2
Beachten Sie, dass die im Buch angegebene Formel einen Fehler enthält (der Exponent sollte ein negatives Vorzeichen enthalten). Siehe meine Antwort unten.
Matt L.

Antworten:


5

| x | bezeichnet den absoluten Wert - das x / | x | Ein Teil der Formel dient dazu, sicherzustellen, dass das Vorzeichen der Eingabe in der Ausgabe erhalten bleibt. In Bezug auf die Implementierung sind die von Ihnen aufgeführten Schritte korrekt.


1
Was meinst du mit "echter Verzerrung"? Absolut jede Operation, die Sie am Originalsignal ausführen, wäre sowieso eine Verzerrung! Was versuchst du zu machen?
Pichenettes

1
Verzerrung ist ein sehr vager Begriff, der jede (normalerweise unerwünschte) Transformation beschreibt, die das Signal verändert. Gitarrenverzerrungen werden durch viele verschiedene Prozesse erreicht - Clipping, Gleichrichtung, Überlastung - abhängig von der Art des Pedals / Verstärkers, in dem sie auftreten - es gibt keine einzige "wahre" Formel ... Die Formel, die Sie haben, sieht so aus, als würde sie eine geben sigmoidartige Funktion, die eine Überlastung simulieren würde; aber ich denke, es könnte irgendwo einen Fehler haben.
Pichenettes

1
Sie müssen dies im Zeitbereich tun.
Pichenettes

1
Denn so funktionieren Gitarrenverzerrungseffekte. Sie wurden ursprünglich mit nichtlinearen Elementen wie Röhren, Dioden und späteren Transistoren hergestellt, deren Verhalten im Zeitbereich durch eine nichtlineare Funktion beschrieben wird. Und Sie versuchen, das digital zu emulieren ...
Pichenettes

1
Tonhöhenverschiebung, Generator für ausgefallene Harmonien (z. B. EHX Micro Pog) oder ausgefallenes spektrales Morphing (kann sich nicht an den Produktnamen erinnern) erfordern eine Frequenzbereichsverarbeitung. Einige Verstärker / Lautsprechersimulatoren erfordern lange Faltungen, die durch Multiplikationen im Frequenzbereich effizient ausgeführt werden. In jedem Fall wird jedoch NIEMALS "die gesamte FFT des Signals genommen" - dies wird durch Überlappungsaddition einer FFT kleiner Länge (etwa 1024 Abtastwerte) implementiert.
Pichenettes

9

Dank der Handlung in Olli Niemitalos Antwort war ich überzeugt, dass die im Buch angegebene Formel einen Vorzeichenfehler aufweist. Die Nichtlinearität, die für Fuzz oder Verzerrung verwendet wird, ist immer eine Art geglättete Clipping-Funktion, die das Eingangssignal komprimiert. So erfahren kleine Eingangsamplituden nur geringe Änderungen, während hohe Eingangsamplituden (mehr oder weniger) sanft abgeschnitten werden. Und die in Ollis Antwort gezeigte Zahl macht genau das Gegenteil.

Ich bin also überzeugt, dass die richtige Formel sein sollte

(1)f(x)=x|x|(1ex2/|x|)=sgn(x)(1e|x|)

Für kleine Werte von wir , und für große (Größen-) Werte erhalten wir dh Beschneiden.xf(x)sgn(x)|x|=xf(x)sgn(x)

Dies ist eine Darstellung der korrigierten Nichtlinearität ( WolframAlpha ):f(x)

Geben Sie hier die Bildbeschreibung ein

Die Formel sollte auch wie der Ausdruck ganz rechts in vereinfacht werden , da ein Anfänger möglicherweise geneigt ist, die andere Formel buchstäblich zu implementieren und zu versuchen, die Begriffe zu bewerten undDies ist unnötig komplex und verursacht auch Probleme, wenn nahe Null ist. Eine typische Implementierung würde folgendermaßen aussehen:x / | x | x 2 / | x | x(1)x/|x|x2/|x|x

if (x> 0)
   y = 1 - exp (-x);
sonst
   y = -1 + exp (x);
Ende

Oh ja, das Buch zitiert web.archive.org/web/20070826204128/http://www.notam02.no/… falsch und das Obige ist die richtige Formel.
Olli Niemitalo

OK danke. Denken Sie, dass dies die Quelle des Buches war?
Matt L.

Ja, das Buch bezog sich auf diese studentische Arbeit. Es gab eine zweite norwegische Abschlussarbeit, die die falsche Formel hatte und die erste Abschlussarbeit zitierte. Ich habe mich nicht darum gekümmert, Daten zu überprüfen, um festzustellen, ob das Buch die zweite These kopiert hat, ohne die Originalquelle zu überprüfen, oder ob die zweite These das Buch kopiert hat.
Olli Niemitalo

1
@OlliNiemitalo: Typischer Fall der Fehlerausbreitung. Ich bin mir auch nicht sicher, warum sie alberne Ausdrücke wie. Wie ich meiner Antwort hinzugefügt habe, könnte ein Anfänger dies buchstäblich umsetzen. x2/|x|
Matt L.

2

Sie können den Hauptteil der Funktion direkt in Wolfram Alpha schreiben und er zeichnet ihn auf:

Geben Sie hier die Bildbeschreibung ein

Es sieht für mich wie ein Wellenformer aus , und diese können so verwendet werden, wie Sie es beschreiben.


1
Jetzt, wo ich Ihre Handlung sehe, bin ich ziemlich überzeugt, dass die Formel im Buch falsch ist. Siehe meine Antwort. Was denken Sie?
Matt L.

2
@ MattL.Ja das macht viel mehr Sinn. Die Funktion des Buches nimmt ebenfalls ab, was zu einer unerwünschten Phaseninversion führen würde.
Olli Niemitalo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.