Frage

Ich bin ein Software-Synthesizer zu schreiben und muß bei 44,1 kHz Samplebandbegrenzt, alias freien Wellenformen in Echtzeit zu erzeugen. Sägezahn-Wellenform für jetzt tun würde, da ich durch Mischen von zwei Sägezähne zusammen eine Pulswelle erzeugen kann, eine invertierte und phasenverschoben.

Bisher habe ich folgende Ansätze versucht:

  1. Vorausberechnen von einem Zyklus perfekt Wellenformabtastwerte bei unterschiedlichen Frequenzen Bandgrenze beim Start bandbegrenzt, dann die beiden nächsten diejenigen miteinander vermischt wiedergegeben werden. Funktioniert in Ordnung Ich denke, aber nicht sehr elegant fühlen. Viele Proben sind erforderlich, oder die „Lücken“ zwischen ihnen zu hören. Interpolations-und Mischen ist auch ziemlich CPU-intensiv.

  2. einen Zug von DC Integration kompensierten sinc-Impulse eine Sägezahnwelle zu erhalten. Klingt außer groß, dass die Welle driftet weg von Null, wenn Sie nicht den DC-Ausgleich genau richtig machen (was ich wirklich schwierig sein zu finden). Die DC-Problem kann durch Zugabe von ein wenig Leckage an den Integrator reduziert werden, aber dann verlieren Sie die tiefen Frequenzen.

Also, meine Frage ist: Was ist die übliche Art und Weise dies geschehen ist? Jede vorgeschlagene Lösung muss in Bezug auf den CPU effizient sein, da es muss in Echtzeit erfolgen, für viele Stimmen auf einmal.

War es hilfreich?

Lösung

Es gibt viele Möglichkeiten, um die Bandbegrenzung Wellenformerzeugung zu nähern. Sie werden am Handel Rechenkosten gegen Qualität wie gewohnt beenden.

Ich schlage vor, dass Sie an dieser Stelle einen Blick hier:

http://www.musicdsp.org/

Sehen Sie sich das Archiv! Es ist voll von gutem Material. Ich habe gerade eine Suche auf dem Stichwort „Bandbegrenzung“. Das Material, das erscheint, sollten Sie mindestens eine Woche lang beschäftigen.

Btw - Weiß nicht, ob das, was Sie suchen, aber ich habe alias reduziert vor Wellenform Generation ein paar Jahre (zum Beispiel nicht wirklich begrenzt Band). I berechnet nur das Integral zwischen der letzten und aktuellen Probe-Position. Bei traditionellen Synthesizer-Wellenformen können Sie diese recht einfach tun, wenn Sie Ihr Integrationsintervall an den Singularitäten aufgeteilt (zum Beispiel, wenn die Sägezahn seines Reset erhalten). Die CPU-Last war niedrig und die Qualität akzeptabel für meine Bedürfnisse.

hatte ich die gleichen Drift-Probleme, aber auf dem Integral mit einer sehr niedrigen Cutoff-Frequenz einen Hochpasses Anwendung losgeworden diesen Sinn. Echte Analog-Synthesizer nicht nach unten in die subhertz Region geht trotzdem, so dass Sie nicht viel verpassen.

Andere Tipps

Eine schnelle Möglichkeit, bandbegrenzten Wellenformen zu erzeugen, ist durch bandbegrenzte Schritte (BLEPs) verwendet wird. Sie erzeugen den bandbegrenzte Schritt selbst:

eingeben Bild Beschreibung hier

und speichern, die in einem Wavetable, dann ersetzen jeden Übergang mit einem bandbegrenzten Schritt, um Wellenformen zu erzeugen, die wie folgt aussehen:

eingeben Bild Beschreibung hier

Siehe

die Walk-Through unter bandbegrenzte Sound Synthesis .

Da diese BLEP nicht-kausal (was bedeutet, es erstreckt sich in die Zukunft), für die Echtzeit-Wellenformen zu erzeugen, ist es besser, den minimalen Phasenbandbegrenzten Schritt zu verwenden, eine so genannten MinBLEP , die das gleiche Frequenzspektrum hat, sondern erstreckt sich nur in die Vergangenheit:

  

MinBLEPs nimmt die Idee weiter und   nehmen Sie ein Fenster sinc, führen ein   Mindestphasenrekonstruktion und dann   Integration das Ergebnis und speichern sie in einem   Tabelle. Jetzt einen Oszillator, damit Sie   legen Sie einfach eine MinBLEP an jedem   Diskontinuität in der Wellenform. So für   eine Rechteckwelle fügen Sie eine MinBLEP   wo die Wellenform invertiert, für Säge   Wellen Sie eine MinBLEP einsetzen, wo die   Wert invertiert, aber Sie erzeugen die   Rampe als normal.

Das ist, was ich kam mit, inspiriert von Nils' Ideen. Kleben sie hier falls es für jemand anderen nützlich. I Box einfach eine Sägezahnwelle filtert analytisch die Änderung in der Phase von dem letzten Abtastwert als Kernelgröße (oder cutoff) verwendet wird. Es funktioniert ziemlich gut, es gibt einige hörbare Aliasing bei den allerhöchsten Töne, aber für den normalen Gebrauch klingt es toll.

Aliasing noch die Kerngröße zu reduzieren, kann ein wenig erhöht werden, es 2 * Phasenübergangs zb klingt auch gut, wenn man ein bisschen die höchsten Frequenzen verlieren.

Auch hier ist eine weitere gute DSP-Ressource Ich fand, wenn für ähnliche Themen SP Surfen im Internet: Die Synthese ToolKit in C ++ (STK) . Es ist eine Klassenbibliothek, die viel von nützlichen DSP-Tool hat. Es hat sogar bereit bandbegrenzten Signalgeneratoren verwenden. Die Methode, die sie verwenden, ist sinc zu integrieren, wie ich in meinem ersten Beitrag beschrieben (obwohl ich denke, dass sie es besser dann mir ...).

float getSaw(float phaseChange)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange);
}

float getPulse(float phaseChange, float pulseWidth)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange) - getBoxFilteredSaw(fmod(phase + pulseWidth, 1.0f), phaseChange);
}

float getBoxFilteredSaw(float phase, float kernelSize)
{
    float a, b;

    // Check if kernel is longer that one cycle
    if (kernelSize >= 1.0f) {
        return 0.0f;
    }

    // Remap phase and kernelSize from [0.0, 1.0] to [-1.0, 1.0]
    kernelSize *= 2.0f;
    phase = phase * 2.0f - 1.0f;

    if (phase + kernelSize > 1.0f)
    {
        // Kernel wraps around edge of [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize - 2.0f;
    }
    else
    {
        // Kernel fits nicely in [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize;
    }

    // Integrate and divide with kernelSize
    return (b * b - a * a) / (2.0f * kernelSize);
}

Die DC von einem blit versetzt - mit einem einfachen Hochpass reduziert werden Filter! - ähnlich wie bei einer echten analogen Schaltung, wo sie eine DC-Sperrkappe verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top