Warum ein Tisch? Diese sehr schnelle Funktion hat seine schlimmste Rauschspitze bei -90db, wenn das Signal bei -20db liegt. Das ist verdammt gut.
Für das Resampling von Audio verwende ich immer einen der Interpolatoren aus dem Elephant Paper. Dies wurde diskutiert in einem vorherige SO-Frage .
Wenn Sie einen Prozessor ohne fp haben, können Sie diese Dinge trotzdem tun, aber sie sind schwieriger. Ich habe das schon durchgemacht. Ich fühle Ihren Schmerz. Viel Glück! Früher habe ich zum Spaß Konvertierungen von fp in Integer gemacht, aber jetzt müsstest du mich dafür bezahlen :-)
Tolle Online-Referenzen, die auf Ihr Problem zutreffen:
http://www.audiomulch.com/~rossb/code/sinusoids/
http://www.dattalo.com/technical/theory/sinewave.html
Edit: zusätzliche Gedanken aufgrund Ihrer Kommentare
Da du an einem kniffligen Prozessor arbeitest, solltest du dich vielleicht damit beschäftigen, wie du deine Sinustabelle so gestalten kannst, dass sie mehr Winkel hat, aber trotzdem klein bleibt.
Nehmen wir an, Sie teilen einen Quadranten in 90 Teile auf (in Wirklichkeit würden Sie wahrscheinlich 256 Teile verwenden, aber lassen wir es der Einfachheit und Klarheit halber bei 90). Kodieren Sie diese als 16 Bit. Das sind bis jetzt 180 Bytes der Tabelle.
Für jeden dieser Grade gibt es nun 9 (in Wirklichkeit wahrscheinlich 8 oder 16) Zwischenpunkte.
Nehmen wir als Beispiel den Bereich zwischen 3 Grad und 4 Grad.
sin(3)=0.052335956 //this will be in your table as a 16-bit number
sin(4)=0.069756474 //this will be in your table as a 16-bit number
Wir werden uns also sin(3.1) ansehen.
sin(3.1)=0.054978813 //we're going to be tricky and store the result
// in 8 bits as a percentage of the distance between
// sin(3) and sin(4)
Sie wollen herausfinden, wie sin(3.1) zwischen sin(3) und sin(4) passt. Wenn es auf halbem Weg dazwischen liegt, kodieren Sie es als ein Byte von 128. Wenn es ein Viertel des Weges dazwischen ist, kodiere es als 64.
Das sind zusätzliche 90 Bytes, und Sie haben ein Zehntelgrad in 16-Bit-Auflösung in nur 180+90*9 Bytes kodiert. Sie können nach Bedarf erweitern (vielleicht bis zu 32-Bit-Winkeln und 16-Bit-Tween-Winkeln) und dazwischen sehr schnell linear interpolieren. Um den Speicherplatz zu minimieren, machen Sie sich die Tatsache zunutze, dass aufeinanderfolgende Werte nahe beieinander liegen.
Edit 2: bessere Möglichkeit, die Zwischenwinkel in einer Tabelle zu kodieren
Ich habe mich gerade daran erinnert, dass ich bei dieser Arbeit sehr kompakt ausgedrückt habe Unterschied zwischen dem erwarteten Wert nach linearer Interpolation und dem tatsächlichen Wert. Dieser Fehler liegt immer in der gleichen Richtung.
Ich habe zunächst den maximalen Fehler im Bereich berechnet und dann die Skala darauf aufgebaut.
Hat super funktioniert. Ich habe das Gefühl, ich sollte den Code in einem Blogeintrag erläutern :-)