Warum eine Tabelle? This very fast function hat seinen stärksten Geräuschpegel bei -90db, wenn das Signal bei -20db liegt. Das ist verrückt gut.
Für das Resampling von Audio verwende ich immer einen der Interpolatoren vom Elephant Papier. Dies wurde in einer previous SO question diskutiert.
Wenn Sie auf einem Prozessor sind, der nicht fp hat, können Sie diese Dinge immer noch tun, aber sie sind schwieriger. Ich war dort. Ich fühle deinen Schmerz. Viel Glück! Früher habe ich Conversions für fp in Integer gemacht, aber jetzt müsstest du mich dafür bezahlen.
:-)
Coole Online-Referenzen, die auf Ihr Problem anwenden:
http://www.audiomulch.com/~rossb/code/sinusoids/
http://www.dattalo.com/technical/theory/sinewave.html
Edit: zusätzliche Gedanken basierend auf Ihre Kommentare
Da Sie an einem kniffligen Prozessor arbeiten, sollten Sie sich vielleicht überlegen, wie Sie Ihren Sinustisch mehr Winkel zum Nachschlagen haben lassen, aber trotzdem klein bleiben.
Angenommen, Sie brechen einen Quadranten in 90 Teile (in Wirklichkeit würden Sie wahrscheinlich 256 Teile verwenden, aber lassen Sie es 90 für Vertrautheit und Klarheit). Codiere diese als 16 Bits. Das sind bisher 180 Byte Tabelle.
Nun werden wir für jeden dieser Grade 9 (in Wirklichkeit wahrscheinlich 8 oder 16) Zwischenpunkte haben.
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
Also werden wir uns die Sünde ansehen (3.1)
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)
Was Sie tun möchten, ist, herauszufinden, wie sin (3.1) passt zwischen sin (3) und sin (4). Wenn es auf halbem Wege liegt, codiere das als ein Byte von 128. Wenn es ein Viertel ist, codiere das als 64.
Das sind zusätzliche 90 Bytes und du hast bis zu einem Zehntel Grad in 16-Bit res in nur 180 + 90 * 9 Bytes. Sie können nach Bedarf erweitern (bis zu 32-Bit-Winkel und 16-Bit-Tween-Winkel) und dazwischen sehr schnell interpolieren. Um Speicherplatz zu sparen, nutzen Sie die Tatsache, dass aufeinanderfolgende Werte nahe beieinander liegen.
Edit 2: bessere Art und Weise die in-zwischen den Winkeln in einer Tabelle
ich gerade daran erinnert, dass, wenn ich das tat ich sehr kompakt die zwischen dem erwarteten Unterschied zum Ausdruck endete bis zu kodieren Wert nach linearer Interpolation und dem tatsächlichen Wert. Dieser Fehler ist immer in der gleichen Richtung.
Zuerst berechnete ich den maximalen Fehler in dem Bereich und dann basierte die Skala darauf.
Großartig gearbeitet. Ich habe das Gefühl, ich sollte den Code in einem Blogeintrag illustrieren. :-)
Haben Sie eine lineare Interpolation ausgewertet? Ein schnelles Programm auf einem PC, das die erwarteten Eingaben durchläuft, sollte Ihnen die Fehlergröße einer vorgeschlagenen Lösung anzeigen. –
Ich habe DDS nicht gemacht, aber ich habe FM und Phasenverzerrungssynthese gemacht. Ich habe gerade ein wenig über DDS nachgelesen. Es hört sich so an, als ob lineare Interpolation oft verwendet wird, aber ich denke, dass Sie den Grundrauschen etwas mit etwas besser als linear senken können. Wenn Sie mit der Implementierung beginnen, sollten Sie eine FFT an der Ausgabe vornehmen und bekannte Wellen durch die Eingabe setzen, um zu sehen, was Ihr Grundrauschen ist und ob Sie irgendwelche Artefakte erhalten. – Nosredna