Du willst im wesentlichen einen Sinus mit einstellbarer Frequenz
produzieren, also machst du erstmal im Vorfeld eine Tabelle mit einer
vollständigen Sinusschwingung, sagen wir mal mit 32 Einträgen. Wenn man
die Tabelle mit einem kontinuierlichen Zähler indiziert, erhält man mit
32 Schritten eine vollständige Periode. Um deren Frequenz zu ändern,
könnte man den Zähler jetzt nur jeden zweiten/dritten Schritt erhöhen
oder gleich um 2/3/... Tut schon, sorgt aber nur für eine sehr grobe und
noch dazu nichtlineare Frequenzsteuerung.
Jetzt der Trick #1: Man gibt dem Zähler einen Nachkommaanteil und dem
Inkrement pro Schritt auch. Das erlaubt eine sehr feine Steuerung der
mittleren Frequenz. "Mittlere" deswegen, weil die Schritte immer noch
diskret sind, und halt Wiederholungen/Aussetzer haben.
Trick #2: Anhand des Nachkommanteils kann man zwischen den beiden
angrenzenden Tabellensamples interpolieren. Für nicht allzu grosse
Frequenzvariationen reicht lineare Interpolation.
Trick #3: Man macht es nicht mit Float, sondern mit Integer und einer
Tabelle mit 2^m Einträgen. Dann nimmt man die unteren n Bit für den
Interpolator und die oberen m Bit für den Zähler. Ausser Integeraddition
und etwas AND bzw. Schieben ist dann keine "komplizierte" Rechnung
notwendig.
Und jetzt zu deiner FM: Ohne ist das Inkrement immer 1.0. Wenn du was
draufmodulieren willst, muss das Inkrement halt abängig vom Frequenzhub
leicht erhöht/erniedrigt werden.
Und jetzt probier mal rum, nur so wird das was mit dem Verständnis ;)