Digitale Klangsynthese

Rampensau schrieb:
Nun was der Volksmund "Wavetable" schimpft, besteht aus einzelnen Wavetables. Eine Wavetable ist einfach eine Tabelle von 256 Funktionswerten. Eine Wavetable, die keinen periodischen Vorgang beschreibt, bezeichnet der Volksmund einfach Sample.

Der Begriff "Wavetable" ist für mich seit jeher mit der Syntheseform nach Herrn Palm verbunden und das habe ich damit auch gemeint.

Rampensau schrieb:
Verkleinern kann man die Anzahl der berechneten Samples nicht, da die Anzahl der Samples, die durch FFT verarbeitet werden immer eine 2er Potenz ist.

Ich weiß, eben dass ist ja mein Problem. In der MSDOS Version hab ich das damals noch mit den naiven Sinusfunktionen gemacht, da trat das Problem natürlich nicht auf. Nun ja, ich werde mal gucken, was ich draus machen kann. Da ich die Abspielgeschwindigkeit leider nicht ändern kann, muss ich wohl oder übel die Daten resampeln. Oder ich schmeiß die FFT wieder raus und mache das mit dem Sinus zu Fuß.
 
Cyclotron schrieb:
Da ich die Abspielgeschwindigkeit leider nicht ändern kann
Dann ist die Entwicklungsumgebung schlichtweg Mist.

Btw. Sinusfunktionen sind am Ende auch nur Tabellen/ Vektoren ;-)
 
Rampensau schrieb:
Wenn du die Frequenz steuern möchtest, musst du die Abspielgeschwindigkeit verändern und nicht die Abtastrate und auch nicht die Anzahl der Samples pro Table.
in einem zeitdiskreten system, dem eine feste samplingrate zu grunde liegt (wie z.b. bei einer soundkarte) IST eine änderung der abspielgeschwindigkeit resampling.

Dein Schleifenzähler zum Durchfahren einer einzelnen(!) Wavetable heißt also nicht "i++", sondern "i = i + (N * Frequenz)/ Samplerate". Dadurch entsteht natürlich Aliasing.
Einfache lineare Interpolation der Funktionswerte reicht dann aus, wenn das Signal bandbeschränkt(d.h. hier, das Band darf nicht die halbe Abtastrate überschreiten) und überabgestastet ist (d.h. mehr als 2 Abtastwerte pro Periode), um eine bessere Näherung des Wunschssignals zu erhalten.

ja und genau hier wären wir wieder beim resampling, oder etwa nicht?
die aussage, dass lineare interpolation reicht, wenn das signal bandbeschränkt und überabgetastet ist, finde ich etwas platt. auch wenn du 2fach überabtastest, und das signal bandbeschränkt ist (was es bei einer erzeugung durch iFFT per definition ist), fängst du dir trotzdem aliasing ein. mit einer guten wahrscheinlichkeit sind die aliasingkomponenten jedoch so gedämpft, dass man sie nicht wahrnimmt.

Beliebig verändern kann man die Anzahl der berechneten Samples nicht, da die Anzahl der Samples, die durch FFT verarbeitet werden immer eine 2er Potenz ist.
ich glaube darum drehte sich cyclotrons eingangsfrage, aber die warst du dir ja zu fein (?) zum beantworten.
 
haesslich schrieb:
Beliebig verändern kann man die Anzahl der berechneten Samples nicht, da die Anzahl der Samples, die durch FFT verarbeitet werden immer eine 2er Potenz ist.
ich glaube darum drehte sich cyclotrons eingangsfrage, aber die warst du dir ja zu fein (?) zum beantworten.

was willst du eigentlich? Die Frage hab ich doch beantwortet oder nicht?


haesslich schrieb:
die aussage, dass lineare interpolation reicht, wenn das signal bandbeschränkt und überabgetastet ist, finde ich etwas platt. auch wenn du 2fach überabtastest, und das signal bandbeschränkt ist (was es bei einer erzeugung durch iFFT per definition ist)
was ist per definition wie? Definiere mal bitte.
 
haesslich schrieb:
Rampensau schrieb:
Wenn du die Frequenz steuern möchtest, musst du die Abspielgeschwindigkeit verändern und nicht die Abtastrate und auch nicht die Anzahl der Samples pro Table.
in einem zeitdiskreten system, dem eine feste samplingrate zu grunde liegt (wie z.b. bei einer soundkarte) IST eine änderung der abspielgeschwindigkeit resampling.

Au backe. Um Himmels Willen NEIEN. Samplen heißt soviel wie Messen. Eine Tabelle auslesen, ist einfach nur Auslesen einer Tabelle. Da wird nicht regesampelt.
 
haesslich schrieb:
die aussage, dass lineare interpolation reicht, wenn das signal bandbeschränkt und überabgetastet ist, finde ich etwas platt. auch wenn du 2fach überabtastest, und das signal bandbeschränkt ist (was es bei einer erzeugung durch iFFT per definition ist), fängst du dir trotzdem aliasing ein. mit einer guten wahrscheinlichkeit sind die aliasingkomponenten jedoch so gedämpft, dass man sie nicht wahrnimmt.
Das mit der Überabtastung hab ich wirklich etwas platt formuliert. Ändert aber nichts daran, dass das nichts mit Lotto zu tun hat.
Überabtasten meint eigentlich nur, dass Band weit weniger als bis zur halben Abtastrate reicht. Und da muss man mit nichten auf den Zufall als Antialiasing-Algorithmus pochen. Dafür gibts andere Ansätze. ;-)
 
Rampensau schrieb:
Cyclotron schrieb:
Da ich die Abspielgeschwindigkeit leider nicht ändern kann
Dann ist die Entwicklungsumgebung schlichtweg Mist.

Das liegt eher daran, dass das nun mal kein abspielendes Instrument ist sondern nur ein Renderingprogramm (und das Rendern ja eigentlich auch nur ein Abfallprodukt, eigentlich geht es ja darum, Spektraldaten für den Terratec Komplexer manuell oder per Resynthese zu erstellen). Abspielen tun das andere irgendwo auf diesem Planeten mit irgendwelchen Programmen und da kann ich nur hoffen, das deren Software dieses leichte Differenz von der Note anhand meines smpl - Chunks korrigiert. Der Entwickler des VAZ Modular war ja so nett und hat mir bei kvr die die korrekten Daten gegeben.

Was die Vorhörfunktion in meinem Programm betrifft liegt es wiederum eher daran, dass ich bislang gerade mal die PlaySound - Funktion von Windows verstehe. Und die rödelt das eben nur einmal runter wie ein normales Sample und verarbeitet auch keine Loop- oder Noteninformationen. Langfristig will ich das aber ohnehin auf die flexiblere WaveOut API umstellen und ich werde in diesem Zusammenhang auch mal die hier gemachten Vorschläge ausprobieren.

Meine Studienzeit ist leider schon recht lange her und ich habe seitdem nix mehr damit zu tun gehabt. Programmierung stand damals auch nicht gerade hoch im Kurs. Deshalb meine doofen bzw. doof formulierten Fragen.
 
Rampensau schrieb:
Au backe. Um Himmels Willen NEIEN. Samplen heißt soviel wie Messen. Eine Tabelle auslesen, ist einfach nur Auslesen einer Tabelle. Da wird nicht regesampelt.

ich weiß, was sampling ist ;-) und wenn wir schon im K-modus sind: Samplen heißt "eine Probe nehmen".
Das hat mit Resampling auch ERSTMAL nichts zu tun.

also ich erkläre es mal langsamer, dann kannst du mir vielleicht auf die sprünge helfen, falls ich dich nicht richtig verstanden habe.
du hast eine tabelle mit werten, genau ein wellenzyklus. meinetwegen 1024 werte. deine soundkarte spielt exakt 44100 werte pro sekunde aus. dadurch ergibt sich eine feste tonhöhe.
du willst jetzt eine andere tonhöhe.
was du beeinflussen kannst: wann du werte aus der tabelle liest. was du nicht beeinflussen kannst: wieviele werte deine soundkarte pro sekunde ausspielt.
du willst also nun die tonhöhe ändern, meinetwegen um einen ganz ganz kleinen betrag. du möchtest in der zeit, in der sonst 1024 samples gelesen worden sind, nur 1023 samples lesen. also einfach etwas langsamer durch die tabelle gehen. leider passt genau dieser betrag "etwas langsamer" nicht mehr in dein raster von 44100 Hz. Und nun? Du musst doch die Relation zum Takt deines DA Wandlers wahren, also zur Soundkarte. Was machst du also? Interpolation, stimmt's? Und da kommt Resampling in's Spiel.
Denn Interpolation von Werten in besagter Tabelle IST Resampling.

Wenn ich etwas übersehen habe, weise mich doch gerne darauf hin. Ansonsten verstehe ich nicht, wie du deine Samples aus der Tabelle in einer anderen Geschwindigkeit ausspielst.

iFFT und per Definition Bandbeschränkt:
die iFFT transformiert doch Frequenzen von -pi/2 bis pi/2 in ein Zeitsignal. Das ist doch beschränkt?
 
hör mir uff mit mathematischen formeln, es reicht aus wenn du den scheiss pitchen tust, problem nur das sich meistens der klang dadurch nagativ verändert
 
Also wir haben sowas wie einen zirkularen Speicherbereich, dessen Register linear modulo-adressiert werden.

Linear meint erstmal nur, dass man einen zusammenhängenden Speicherbereich hat. Modulo-adressierung (diese Adressierungsart bieten viele DSProzessoren) meint, dass wenn ein Register über N angesprochen wird, wird die Adresse in den Bereich von 1 bis N "zurückgeschoben".

Pseudocode:
wenn x > N
dann x = x - N

x kann man sich als Tastkopf, der unendlich lange über den Buffer kreist, verbildlichen. Gehen wir mal davon aus, der Tastkopf kann nur kontinuierlich(gleitend) wandern und keine diskreten(feste) Schritte machen. Dieser Tastkopf wird zu jedem Sampletick für eine unendlich kurze Zeit angehalten. Das Register, dass dem Tastkopf gerade am nächsten ist, wird ausgelesen.
Die Geschwindigkeit mit der Tastkopf wandert, ist genau der Parameter an dem man drehen kann, damit die resultierende Tonhöhe sich ändert.

x ist also der Schleifenzähler und wird mit jedem Sampletick nicht(!) ganzzahlig erhöht, sondern mit oben angegebenen Inkremental. Das Inkremental stellt die Geschwindigkeit des Tastkopfes dar.
x zählt die Adressen der einzelnen Register durch. wenn x nun auf dem einen Takt den Wert 23.56, wird je nach Implementierung der Rundung das 23. oder 24. Register aus dem Buffer gelesen. x zählt aber nicht ganzzahlig weiter. Das führt dazu, dass wenn die besagte Tonhöhe eine Periode von bspw. N-14.24394 Samples benötigt,trotzdem der gesamte Buffer adressiert werden kann. Die Schritte, in denen die Register angesprochen werden, werden halt größer oder kleiner.
So entstehen zwar viele Nebengeräusche, die durch die Rundung erstmal viel mehr mit Quantisierungsrauschen (Problem der Amplitude, da Werte fehlen = Interpolation nötig) zu tun haben, als mit Aliasing (was ein Problem der Zeit ist und keins der Amplitude).

Lineare Interpolation (das Mindeste, was man hier tun kann gegen Quantisierungsrauschen) kann man sich als zweiten Tastkopf vorstellen, der immer genau ein Register vor dem anderen Tastkopf ist. Mit jedem Sampletick lesen diese beiden Tastköpfe Werte aus. Diese beiden Werte werden gewichtet zusammenaddiert. Die Gewichtung ist genau die euklidische Differenz der Tastköpfe zu einer "ganzzahligen" x-Position.

Fazit: Es ist fast egal, wie viel Samples die gewünschte Periode benötigt. Durch die Modulo-adressierung kompensiert sich der Fehler immer wieder.

FFT: Naja, das schaut mir irgendwie nach normiertem Frequenzband aus. Die Zeitgrenzen der FFT sind jedenfalls insofern freie Parameter, als das man immer eine 2er Potenz an Samples für die FFT benötigt.
 

Anhänge

  • Wavetable.png
    Wavetable.png
    1,3 KB · Aufrufe: 52
ah. ein schönes beispiel, und auch noch anschaulich erklärt. cyclotron kann es genau so nachimplementieren, denke ich.

nichts desto trotz ist GENAU DAS ein resamplingvorgang.
das einzige, was anders ist, ist die betrachtungsweise.

kurze erläuterung, damit du das möglicherweise doch noch einsiehst:
resampling ist das erneute abtasten eines zeitdiskreten signals. was würde man also brute force machen? das zeitdiskrete signal rekonstruieren und erneut abtasten. das können wir uns aber sparen, indem wir einfach interpolieren. die resultierenden werte sind ein "geresampletes" signal. den interpolationsfehler, den du dir damit z.b. bei linearer interpolation reinholst, wäre der gleiche, wie im fall einer erneuten abtastung eines signals, das zuvor rekonstruiert und mit einem halteglied 1. ordnung (linear eben) geglättet worden wäre. eine perfekte rekonstruktion bekommst du ja bekanntlich nur bei rekonstruktion mit einer sinc funktion, ebenso kannst du mit einem sinc interpolator auch nahezu fehlerfrei interpolieren.

aliasing mal aussen vorgelassen (ich behaupte, du holst dir tatsächlich aliasing rein, denn dein interpoliertes signal könnte frequenzen über der halben samplingrate enthalten), das hier zu diskutieren würde jetzt wirklich zu weit führen.

ich hoffe, dass du mir folgen konntest, denn ich glaube, besser kann ich es nicht ausdrücken. im gegensatz zu deinen profs werde ich aber auch nicht für's erklären bezahlt, sondern fürs anwenden ;-)
 
haesslich schrieb:
nichts desto trotz ist GENAU DAS ein resamplingvorgang.
das einzige, was anders ist, ist die betrachtungsweise
wenn ich mir das mit dem tastkopf so überlege, scheinst du ja Recht zu haben.
Für mich beherbergt Resamplen aber den Vorgang des Abspielens, Verarbeitens(Überabtastung, Effektierung, Dynamik), und des erneute Aufnehmens. Ergebnis ist also eine neue Tabelle von Datenpunkten.

Ab hier driften wir wohl in die Haarspalterei..

haesslich schrieb:
im gegensatz zu deinen profs werde ich aber auch nicht für's erklären bezahlt, sondern fürs anwenden
Meine profs werden primär fürs Forschen bezahlt. Selbststudium scheint in Googles Zeitalter hoch im Kurs zu sein. Jemand, der keine Forschungsgelder mitbringt, sprich einfach nur pure Lehre mitbringen will, wird gar nicht erst eingestellt.
 
Rampensau schrieb:
wenn ich mir das mit dem tastkopf so überlege, scheinst du ja Recht zu haben.
Für mich beherbergt Resamplen aber den Vorgang des Abspielens, Verarbeitens(Überabtastung, Effektierung, Dynamik), und des erneute Aufnehmens. Ergebnis ist also eine neue Tabelle von Datenpunkten.

Ab hier driften wir wohl in die Haarspalterei..

genau. :nihao:
denk einfach mal an geräte, die in "echtzeit" resampling machen sollen, wie z.b. ein fernseher, der 32kHz bekommt, und viellleicht 48kHz ausspielt oder so.

Rampensau schrieb:
Meine profs werden primär fürs Forschen bezahlt. Selbststudium scheint in Googles Zeitalter hoch im Kurs zu sein. Jemand, der keine Forschungsgelder mitbringt, sprich einfach nur pure Lehre mitbringen will, wird gar nicht erst eingestellt.

ah! das entspricht zwar leider der wahrheit, das sollte aber als student nicht dein anspruch an deine profs sein!

edit: type entfernt
 
@rampensau: Das ist eine schön anschauliche Erklärung gewesen, danke! :)
 
Mit die einfachste methode einen Sägezahn hinzukriegen der akzeptabel anti-aliased ist, ist folgender trick:
Naiven Sägezahn machen :

for n in range(0,L):
s[n] = p
p += T0
if p > 1: p -= 1
return s
 
Das ergebnis des naiven Sägzahns dann quadriehren. und ableiten etwa so:

for n in range(0,L):
s = 2*p[n] - 1 # trivial saw MA
s2 = s*s # quadrieren M
y0 = s2 - z0 # ableiten A
y[n] = y0 * 1/(4*T0) # skalieren
z0 = s2
y[0] = 0
return y

T0 = f0/fs
mit f0 = grundfrequenz des sägezahns
fs = sampling rate

Das ist die einfachste weise die ich kenne um einen netten verwendbaren digitalen oscillator zu haben.
Etwas schwerer sind wavetables (aber sehr flexibel) aber auch noch relativ leicht mit FFT zu erstellen.
Ansonten gibts halt noch diese ganzen Blit, MinBlep, Polyplep etc. methoden...
 
ja das ist der DPW-Algorithmus von Seite 1, der auch auf Rechteck und Dreieck anwendbar ist. ;-)
Diese Methode verweigert nur jegliche Phasenmodulation. Also PWM goodbye. FM ist okay bei DPW.
 
Ach ja, ich habs ausprobiert. Lineare Interpolation reicht völlig aus, wenn man ein bandbeschränktes Signal in einem Array gefangen hält. Das Aliasing hält sich in Grenzen.
file.php
 
Rampensau schrieb:
Ach ja, ich habs ausprobiert. Lineare Interpolation reicht völlig aus, wenn man ein bandbeschränktes Signal in einem Array gefangen hält. Das Aliasing hält sich in Grenzen.
[ http://reaktor-forum.de/download/file.php?id=2196 (•BILDLINK) ]

super!
:supi:

hast du das für verschiedene interpolationen ausprobiert (z.b. 1 oktave runterpitchen, 2.5 oktaven runterpitchen, 1 oktave rauf, 2.5 oktaven rauf, oder so)? würde mich interessieren, wie unterschiedlich das aliasing für verschiedene fälle ausfällt.
 
haesslich schrieb:
hast du das für verschiedene interpolationen ausprobiert
hmm. jein. dynamisch.
Der Algorithmus berechnet zunächst die Anzahl der N Harmonischen für eine angeschlagene Tonhöhe. Die DFT wird dann genau N mal auf das Zeitarray durchgeführt. Die Inverse DFT resynthisiert das Signal bis zur N. Harmonischen. D.h. ich habe bei keiner Tonhöhe auch nur ein Spektralanteil über der halben Abtastrate.
Problematisch wird es bei niedrigen Frequenzen. Da müsste ich die Anzahl zu analysierender Samples erhöhen, oder schon dort interpolieren, damit es auch in der nötigen Anzahl Harmonischer resultiert. In N Samples passen ja nur N/2 Harmonische.

Das Klangbild ist nach oben hin bis zum letzten MIDI-Notenwert (127) stabil (nahezu aliasingfrei). Nur nach unten hin (d.h. wenn die Anzahl der nötigen Harmonischen die halbe Anzahl der Samples übersteigt), muss ich mir noch nen Kompromiss überlegen.
Das ist aber kein Aliasing mehr. Es fehlen dann einfach nur die hohen Spektralanteile.

Soweit war ich noch nicht.
 
hab jetzt nicht alles gelesen, nur das oben jedenfalls :

lineare interpolation kann reichen, du solltest aber oversamplen soweit es geht
sogar 32 fach ist noch sinnvoll, falls die möglichkeit besteht

wenn du eine längere dft verwenden kannst, löst du beide problem, das mit den
fehlenden harmonischen für tiefere töne und das oversampling,
 


Neueste Beiträge

News

Zurück
Oben