オーディオのダブル(64ビット)浮動小数点を検討する場合


12

最新のプロセッサでオーディオを合成して処理するとき、単精度(32ビット)浮動小数点以外の使用を検討するのはいつですか。明らかに、現実世界に出入りするオーディオは16/24ビットなので、ソフトウェアでの信号(オーディオ自体とフィルター係数のようなものの両方)の精度について話しているだけです。

と仮定する:

  • CPU / DSPには、単精度と倍精度の両方のハードウェア浮動小数点サポートがあります。
  • 優先事項は、高性能ではなく高品質のオーディオです。たとえば、より良い(知覚的)品質を提供する場合は、倍精度が考慮されます。

回答:


9

IEEE floatシングルは、約24ビットの仮数のみを提供します。しかし、多くのDSP /フィルタリングアルゴリズム(単位円の近くに極/零点があるIIRバイカッドなど)では、中間計算積(アキュムレータなど)の仮数を24ビットよりはるかに多くする必要があります。 24ビット。これらのタイプのアルゴリズムでは、32、40、および48ビットのスケーリングされた整数アキュムレータが、FPUのないDSPでしばしば使用されました。

ただし、現在の多くのプロセッサ実装(PC、スマートフォンなど)では、アルゴリズムが24ビットを超える中間積を必要とする場合、倍精度FPUは32ビットまたは64ビットのスケーリングされた整数を使用するよりもはるかに高速です。

データキャッシュの破損を防ぐために、生データは短整数または単精度浮動小数点形式にすることができますが、よりローカルな計算カーネルのみがより高い解像度の形式を使用できます。しかし、DSPモジュール間で中間の計算結果を共有している場合、モジュール間の交換プロトコルも、より高い解像度(24ビットの仮数)のバスまたはデータ形式の恩恵を受ける可能性があります。


これは私が求めていたような情報です。フィルターを機能させるために倍精度が必要なケースの具体的な例を提供していただければ、この回答を受け入れます。倍精度で。
user1849104 2012年

また、キャッシュを破棄するとはどういう意味ですか?通過するデータが2倍になると、物事がひどく遅くなるということですか?
user1849104 '25

例として、単位円の近くに極/零点があるIIRが示されました。キャッシュがある場合、このキャッシュに収まるアルゴリズムと作業データセットは、そうでないものよりも大幅に高速になります。
hotpaw2

9

CPU / DSPには、単精度と倍精度の両方のハードウェア浮動小数点サポートがあります。

それは本当にあなたが話しているサポートの種類に依存します。x86では、x87スタイルの浮動小数点命令を使用すると、完全な80ビットの内部精度と同じ処理時間(単精度と倍精度のどちらで作業しているか)が得られます。

ただし、SIMD命令を使用する場合、32ビットフロートを使用すると、64ビットフロートを使用した場合よりも2倍多くの作業を行うことができます。それは大きな問題です。

考慮すべきもう1つのことは、メモリです。倍精度を使用すると、キャッシュメモリの最高速レベルに収まるデータ量を2で割ります。

最新のプロセッサでオーディオを合成して処理する場合、

それはあなたがどんな種類の合成と処理をするかに帰着します。IIRフィルター(または、より一般的には、状態変数やフィードバックを伴うもの)が含まれる場合、32ビットを使用しないと、簡単に自分の足(不安定性、または係数の切り捨てによる低カットオフの不正確さ)を撃つことができます。あなたが何をしているかについて考えすぎます。一部のフィルタートポロジは、32ビットで問題なく動作します。

いずれにせよ、それは数値の精度の問題です-品質の点では、知覚上の違いはありません。ハードウェアオーディオチェーンの精度が20ビットを超えると予想するのは非常に馬鹿げていることを覚えておいてください(ボードが完全に配線され、すべての部品が理想的であり、ジョンソンノイズの限界に達していると仮定します)。この精度は主に単精度の浮動小数点数でカバーされています。ハイエンドのミキシングデスクの信号経路には50のオペアンプがあり、単精度のフロートでの算術演算の量子化ノイズよりも数桁大きい歪みを個別に持っています。


SIMD命令で単精度を使用すると、常に倍精度の約2倍のパフォーマンスが得られると言っても安全でしょうか。
user1849104 '25

以前のコメントは編集できなくなったので、SIMD命令セットを(直接)使用する機会がありませんでした。単純に単精度を使用して、パフォーマンスを2倍にすることは可能ですか?それとも現実は邪魔をしますか?
user1849104

6

アルゴリズムの数値要件を把握し、それに応じて精度を選択する必要があります。

それでは、ここで計算してみましょう。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程度であるため、最初に問題の大きさの不一致は発生しません。


2

単精度と比較して倍精度にすることには、2つの利点があります。範囲の拡大と分解能の向上です。範囲を広げることがアプリケーションに何らかの影響を与えるとしたら、私は非常に驚きます。表示される場合は、おそらくスケーリングに問題があります。

改善がある場合、それは解決策にあります。解像度が高いほど、量子化ノイズが少なくなります。ただし、量子化ノイズが他のすべてのノイズ源と同じレベルに近い場合を除いて、おそらく違いはありません。ノイズと信号レベルの分析を行って、ノイズのどれだけが量子化誤差に起因するかを知ることができますが、両方で実装するまで、それが違いをもたらすかどうかは確かにわかりません。それが違いを生むかどうかを確認してください。


2

生成とレンダリングの間に多くの処理(16/24ビット整数への変換)を行う合成オーディオを使用している場合は、マシンが持つ最高の数値精度で作業することでメリットが得られます。

整数と浮動小数点数を基本的に区別することも重要です。倍精度浮動小数点(64ビット)は64ビット整数とは異なり、使用するソフトウェアツールによっては、ソフトウェアで任意精度整数を操作することもできます。サウンドを生成するのではなく録音する必要がある場合、これは重要です(私の知る限り、AD変換では常にサンプリングされたサウンドが整数形式で保存されます)。

私はそれについて完全に確信することはできませんが、浮動小数点ですでにサウンドを生成する場合、より一般的なアーティファクトは定義上存在しない可能性が高く、はるかに「オーディオ品質」で処理できます。おそらく、ジェネレータ自体にいくつかのエフェクトを適用した後でのみ、サウンドサンプルを生成することもできます。実際にアーティファクトが発生する可能性があるのは、たとえば.WAVなどの整数ファイル形式で出力用に変換するときだけです。

実際、最近のほとんどのマシンにはネイティブの「倍」(64ビット)精度があるので、32ビットで作業する理由はもうわかりません...

お役に立てば幸いです。


3
「32ビットで作業する理由はもうわかりません...」SIMDを使用しない限り!
ピシェネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.