単純にデータをスケーリングすることによって振幅(およびおそらくFFT品質)を増やすことは有効ですか?


10

Mark Borgerdingによる "KISS FFT"のバージョンを使用しています。これは、16ビットの固定小数点入力値の配列を受け入れ、32ビットの浮動小数点結果配列を生成します。

入力振幅が低い場合、フロートの結果の値の多くがゼロになることがわかりましたが、単純に入力をスケーリングすると(たとえば、因数16)、出力値が少なくなるため、出力に含まれるようになりますより詳しく。(それは私の目的にとってあまり重要ではありませんが、一貫性のために、結果の浮動小数点値を同じスケーリング係数で除算します。)

とにかく、これは機能しているように見えます。以前はほぼすべてゼロのバッファを取得していたのに結果を生成するという意味でですが、何らかの理由があり、有効なアプローチではないのではないかと思っています。

(このアプローチは、データの「粗さ」/粒度がはるかに多いことを意味します。特に、通常は存在する低レベルのノイズは存在しません。注入するのが賢明かどうか、ほとんど疑問に思っています。入力のゼロ値を置き換えるための低レベルのノイズ。)


「入力のゼロ値を置き換えるために低レベルのノイズを注入するのが賢明かどうか、私はほとんど疑問に思っています。」= en.wikipedia.org/wiki/Dither
endolith

回答:


7

これは有効なアプローチです。固定小数点(つまり整数)演算を使用するときに頻繁に発生する非常に実用的な問題を観察しています(ただし、浮動小数点でも発生する可能性があります)。計算の実行に使用している数値形式が、計算から生じる可能性のある値の全範囲を表現するのに十分な精度を持っていない場合、何らかの形式の丸めが必要です(切り捨て、最近傍への丸めなど)。オン)。これは多くの場合、信号への付加的な量子化誤差としてモデル化されます。

ただし、アルゴリズムと丸めスキームの一部の組み合わせでは、入力信号の大きさが非常に低い場合、観測されたもの、つまりゼロ出力が多くなる可能性があります。基本的に、一連の操作のどこかで、中間結果が小さくなり、ゼロ以外のレベルに量子化するために必要なしきい値を超えないようになります。その後、値はゼロに丸められます。これは、多くの場合、出力に転送されます。結果は、ご指摘のとおり、多くの出力ゼロを生成するアルゴリズムです。

それで、データを拡大することでこれを回避できますか?時々(常に機能するテクニックは非常に少ないです!)。入力信号の絶対値が数値形式のフルスケール(16ビットの符号付き整数は-32768〜+32767の範囲)未満の値に制限されている場合、入力信号を拡大して、使用可能な範囲をより完全に使用できます。それ。これは、丸め誤差の大きさが対象の信号と比較して小さくなるため、丸め誤差の影響を軽減するのに役立ちます。したがって、すべての出力がアルゴリズムの内部でゼロに丸められている場合、これが役立つことがあります。

そのようなテクニックはいつあなたを傷つけますか?アルゴリズムの計算の構造によっては、入力信号を拡大すると数値のオーバーフローが発生する可能性があります。また、信号にアルゴリズムの丸め誤差よりも大きさが大きいバックグラウンドノイズまたは干渉が含まれている場合、出力で得られる品質は通常、計算で導入された誤差ではなく、環境によって制限されます。


私はかなりうまく機能しているように見える動的なテクニックをスケーリングに使用しています。そして、運が良ければ、極端なトランジェントはノイズとして処理され、とにかくクリッピングされるので、時折クリッピングが問題になることはありません。入力のスケールファクターで除算して出力を「スケール解除」することは有効だと思いますか?
ダニエルRヒックス

1

これに対処する最も簡単で最も簡単な方法は、FFTの前にデータを浮動小数点に変換し、浮動小数点FFTを使用することです。このアプローチの唯一の欠点は、より多くのプロセッサとメモリを消費する可能性があることです。とにかく出力は浮動小数点なので、おそらく実用的な違いはほとんどありません。


私は現在のFFTアルゴリズムがすでに整っている状態でこのプロジェクトを手渡されましたが、現時点ではそれをいじくりたくありません。そして、これはすべてリアルタイムで電話で起こっているので、パフォーマンスは間違いなく問題です。
ダニエルRヒックス

わかった。FFTの内部が固定小数点か浮動小数点かを知っていますか?それが修正された場合、クリッピング、オーバーフロー、アンダーフローについて心配する必要があります
Hilmar

ドキュメンテーションと解説は不在では例外的ですが、コードには多くのintがあり、貴重な少数のfloatとdoubleがあります。16ビットから32ビットまたはフロートに切り替えるための粗い#ifdefフレームワークが含まれているようですが、フレームワークは明らかに長い間無効になっています。
ダニエルRヒックス

AN iPhone(ARM + NEON CPU)C.における整数FFTよりも(フレームワーク加速を介して)高速フロートFFTを行うことができ
hotpaw2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.