アルゴリズムの数値要件を把握し、それに応じて精度を選択する必要があります。
それでは、ここで計算してみましょう。32ビット浮動小数点には、24ビットの仮数と8ビットの指数があります。これにより、約1540 dBのダイナミックレンジで約150 dBの信号対雑音比が得られます。ほとんどのオーディオではこれで十分です。倍精度では、約2倍になります。
各アルゴリズムには、数値精度に関する特定の要件があります。適切に設計されている場合、私が知っているすべてのオーディオアルゴリズムは、32ビット浮動小数点でうまく動作します。「きちんと設計」がキーワードです。たとえば、II IIRバイカッドフィルターからのダイレクトとして実装された、44.1kHzでサンプリングされた40〜200 Hzの6次バンドパスは、32ビットで実際にいくつかのノイズの問題があります。ただし、転置フォームIIまたは直接フォームIフィルターとして完全に正常に機能します。
たとえば、Matlabの残渣z()関数を使用して同じバンドパスフィルターの部分分数展開を試みると、倍精度でも悪い結果が得られます。ここでも、特定の入力データに対するアルゴリズムの数値要件は、倍精度が提供しなければならないものを超えています。これを修正するための鍵は、盲目的に精度を上げることではなく、代わりにより良いアルゴリズムを使用することです。
最後に、フローティング(32ビットまたは64ビット)が脆弱になる原因を見てみましょう:ダイナミックレンジが非常に大きい、つまり、信号を200dB縮小し、500dB増幅し、再度300dB削減すると、開始した場所に正確に到達します。精度の低下はほとんどありません。そうではありません。浮動小数点には、サイズが大きく異なる数値を追加するのに問題があります。小さな数字を追加してもまったく違いがない点があります。つまり、1 + dx = 1になります。この数値「dx」は、32ビット浮動小数点の場合は約1.2e-7、64ビットの場合は2.2e-16です。アルゴリズムに、マグニチュードがかなり離れている数値の加算または減算が含まれる場合、問題が発生する可能性があります。
これの良い例は、前述のダイレクトフォームIIフィルターです。ダイレクトフロムIIフィルター(https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.htmlを参照)は、基本的に入力をフィルタリングして状態変数を計算します最初に極のみの伝達関数を使用し、次にゼロでフィルタリングして出力を作成します。極が単位円に近い場合、極のみの伝達関数は非常に大きくなります。そのため、状態変数は入力よりもはるかに大きく(80db〜100dB大きく)なり、状態変数を入力と加算すると多くのノイズが発生します。
ここでの解決策は、転置されたフォームIIまたはダイレクトフォームIフィルターに行くことです。分析によると、状態変数は入出力より大きくできず、おそらく12dB程度であるため、最初に問題の大きさの不一致は発生しません。