2

かなり具体的な質問があります。
ADC は、2 の補数で 24 ビットのデータポイントを提供します。通常、私はそれらを 32 ビットの int (2 の補数) に格納しました (int の MSB から開始してコピーし、先頭の 1 または 0 を維持するために LSB に向かって 8 ビットシフトすることにより)

CMSIS-DSP ライブラリを使用したいARM プロセッサで FFT 変換を実行します。FFT は float32_t 入力を想定しています。データ形式について聞いたことがなく、固定浮動小数点か何かがあるかどうかについての特定の情報源を見つけることができません...

float32_t が正確に何であるかを誰か教えてもらえますか? さらに、24 ビットの 2 の補数を float32_t に変換することについて何か考えはありますか?

私は意志を調査し続けます 何か新しいことがあれば、この投稿を編集してください :-)


誰かが興味を持っている場合:
ADC はTI-ADS1299
CMISI-DSP ライブラリはここにあります。
リンクは、使用したいメソッド (arm_rfft_f32 ()) に直接移動します。私は古いバージョンのライブラリを使用するようにケーブルを張っているだけなので、メソッドはすでに非推奨としてマークされています。

感謝と挨拶!

4

2 に答える 2

3

多くの場合、最も明白な解決策が最良の解決策になることもあります。24 ビットの数値を符号拡張して浮動小数点型に変換する必要がある場合は、まず次のように記述します。

// See Dric512's answer; I happen to know my compiler's ABI implements 
// 'float' with the appropriate IEEE 754 single-precision format
typedef float float32_t; 

float32_t conv_func(unsigned int int24) {
        return (int)(int24 << 8) >> 8;
}

CMSISと重要なタイミングの両方に言及しているため、マイクロにハードウェアFPUを備えたCortex-M4(またはおそらくCortex-M7)があると安全に想定できます-「パフォーマンス」と「ソフトウェア浮動小数点FFT」という言葉は一緒になりますかなりばかばかしいことに-そして、21世紀なので、半分まともな最適化コンパイラを使用しているので、上記を次のようにコンパイルしました。

$arm-none-eabi-gcc -c -Os -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb float.c

これを取得しました(明確にするためにコメントを追加しました):

   0:   f340 0017       sbfx    r0, r0, #0, #24   @ sign-extend 24-bit value from argument
   4:   ee07 0a90       vmov    s15, r0           @ move 32-bit result to FPU register
   8:   eeb8 0ae7       vcvt.f32.s32    s0, s15   @ convert signed int to 32-bit float
   c:   4770            bx      lr                @ return (with final result in FPU)

まあ、それはすでに最適なコードのように見えます-手動のビット操作がわずか2つのシングルサイクル命令に勝る方法はありません。仕事終わり!


そして、たまたま FPU なしで立ち往生した場合答えの基本的なポイントは変わりません。soft-fp ライブラリの変換実装は次のようになるため、コンパイラ/ライブラリに汚い仕事をさせます。

  • 確実に正しい。
  • かなり最適化されています。
  • 計算自体のオーバーヘッドと比較して、ノイズの中で完全に失われます。
于 2016-05-26T20:25:18.190 に答える
2

Float32_t は標準の IEEE 32 ビット浮動小数点規格であり、複数の ARM CPU でサポートされているハードウェア浮動小数点ユニットのベース (float64_t と同様) です。

1 ビットの符号 (ビット 31)、8 ビットの指数、および 23 ビットの仮数があります: https://en.wikipedia.org/wiki/Single-precision_floating-point_format

ハードウェア浮動小数点を含む CPU を使用している場合は、命令を直接使用して、32 ビット整数を 32 ビット浮動小数点に変換できます (VCVT命令)。

于 2016-05-26T19:53:09.500 に答える