なぜテーブルなのか?この非常に高速な関数は、信号が-20dbのときに、-90dbに最悪のノイズピークがあります。それはクレイジーです。
オーディオのリサンプリングには、Elephant紙の補間器の1つを常に使用します。これは、前のSOの質問で説明されています。
fpを備えていないプロセッサを使用している場合でも、これらのことを実行できますが、より困難です。そこに行ったことがある。あなたの痛みが分かります。幸運を!以前は楽しみのためにfpからintegerに変換していましたが、今はそれを行うために私にお金を払わなければなりません。:-)
あなたの問題に当てはまるクールなオンラインリファレンス:
http://www.audiomulch.com/~rossb/code/sinusoids/
http://www.dattalo.com/technical/theory/sinewave.html
編集:あなたのコメントに基づく追加の考え
トリッキーなプロセッサで作業しているので、サインテーブルをより多くの角度で検索できるようにする方法を検討する必要がありますが、それでも小さくしてください。
象限を90個に分割するとします(実際には、おそらく256個を使用しますが、親しみやすさと明確さのために90個のままにしておきましょう)。それらを16ビットとしてエンコードします。これまでのところ、これは180バイトのテーブルです。
さて、これらの学位のすべてについて、9つ(実際にはおそらく8つまたは16つ)の中間点があります。
例として、3度から4度の間の範囲を取り上げましょう。
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
だから私たちはsin(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)
あなたがしたいのは、sin(3.1)がsin(3)とsin(4)の間にどのように収まるかを理解することです。中間の場合は、128バイトとしてコーディングします。中間の場合は、64としてコーディングします。
これは追加の90バイトであり、わずか180 + 90*9バイトで16ビット解像度で10分の1度までエンコードしました。必要に応じて拡張し(おそらく32ビットの角度と16ビットのトゥイーン角度まで)、その間を非常にすばやく線形補間することができます。ストレージスペースを最小限に抑えるために、連続する値が互いに近いという事実を利用しています。
編集2:テーブル内の中間の角度をエンコードするためのより良い方法
これを行ったとき、線形補間による期待値と実際の値の差を非常にコンパクトに表現することになったのを思い出しました。このエラーは常に同じ方向にあります。
最初に範囲内の最大誤差を計算し、次にそれに基づいてスケールを計算しました。
うまくいきました。説明のためにブログエントリのコードを実行する必要があるように感じます。:-)