Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

RIFからの入力データで256ポイントの範囲のFFTを行うようにSPUを設定し、SPUと他のFFTライブラリ(Python numpy.fft)との間でFFT結果を比較します。

下図のような入力データの場合、上のプロットは小さなノイズ変動の時間領域信号で、ADC値は1750から2000まで変化します。 下のプロットはSPUとnumpy.fftからのFFT結果です。 そして、それらは互いに非常によく整列しているため、緑色の線が1本しか見えません。 (ビン 0 の 1 つのポイントを除く)。

koala_0-1712827528702.png
これは、セットアップ全体と SPU 構成がある程度正しいことを示しています。

 

しかし、下図のように変動の大きい入力データ(ノイズ+100kHzの正弦波とADC値が1920から2120まで変動)では、SPU(赤線)とnumpy.fft(緑線)のFFT差が大きくなります。 SPUの結果は、はるかに高いノイズフロアを示しています。

koala_1-1712828284052.png

 

また、下図のように入力振幅をさらに大きくすると(ADC値は1400から2600まで変化します)、意外にもSPUの結果、ノイズフロアは減少しましたが、100kHzの周波数の振幅も小さくなり、アーチファクト周波数成分が現れました。

koala_2-1712828757295.png

 

これが私のSPU構成です:

 

        /* INPUT SOURCE */
        cfg->input.dataSource      = IfxSpu_DataSource_rif0;
        cfg->input.rif.numAntennae = IfxSpu_Num_Antennae_2;
        cfg->input.rif.dataFormat  = IfxSpu_InputDataFormat_real;
        cfg->input.rif.dataType    = IfxSpu_InputDataType_unsigned;
        cfg->input.rif.sampleCount = 256;
        cfg->input.rif.numRamps    = 256;
        IfxSpu_setupInput(slot, &cfg->input);

        /* BIN-REJECTION */
        cfg->binrej.mode             = IfxSpu_BinRejection_Mode_reject;
        cfg->binrej.numAllowedBins   = 128;
        cfg->binrej.thresholdEnabled = FALSE;
        cfg->binrej.thresholdValue   = 0xFFFFu;
        IfxSpu_setupBinRejection(slot, &cfg->binrej);

        IfxSpu_PassId      passId = IfxSpu_PassId_0;
        IfxSpu_PassConfig *pcfg   = &cfg->pass[passId];
        /* MATH 1 */
        pcfg->math1.loaderExponent      = 5;
        pcfg->math1.numDropFirstSamples = 0;
        pcfg->math1.numDropLastSamples  = 0;
        pcfg->math1.numPadFrontSamples  = 0;
        pcfg->math1.window.enabled      = FALSE;
        pcfg->math1.window.dataFormat   = IfxSpu_WindowDataFormat_real16;
        pcfg->math1.window.baseAddress  = IFX_OFFSETOF(SPU_Cmem0_Map_t, rWndw);
        for (antNr = 0; antNr < RADAR_NUM_RX; antNr++)
        {
        	pcfg->math1.window.antennaOffsets[antNr] = 0;
        }

        pcfg->math1.phaseShift = IfxSpu_PhaseShift_0;
        IfxSpu_setupMath1(slot, passId, &pcfg->math1);

        /* FFT ENGINE UNLOADER */
        pcfg->fft.enabled     = TRUE;
        pcfg->fft.inversed    = FALSE;
        pcfg->fft.size        = IfxSpu_getSizeCode(RADAR_FFT1_LEN);
        pcfg->fft.dataFormat  = IfxSpu_FftDataFormat_complex32Bit;
        pcfg->fft.exponent    = 0;
        pcfg->fft.forceToReal = FALSE;
        IfxSpu_setupFft(slot, passId, &pcfg->fft);

        /* FFT OUTPUT */
        pcfg->fftOut.enabled       = TRUE;
        pcfg->fftOut.baseAddress   = IFX_OFFSETOF(SPU_Emem_Map_t, fft_range);
        pcfg->fftOut.format        = IfxSpu_ODP_Format_complexHalfFloat;
        pcfg->fftOut.exponent      = 16;
        pcfg->fftOut.inPlace       = FALSE;
        IfxSpu_setupFftOutput(slot, passId, &pcfg->fftOut);

 

 

 

math1.loaderExponentを変更してみました 0から18まで、FFT結果のスケールを変更するだけで、問題は解決しません。
fftOut.exponentも変更してみましたが、しかし、効果はありません。

助けてください。

ありがとうございました。

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/SPU-FFT-result-seems-not-valid-when-input-amplitude-is-large-Small-is-OK/td-p/736984

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@koala、SPUは内部的に常に32ビット符号付き整数データ形式で動作します。 したがって、12ビットの符号なし入力がある場合、MATH1で許可される最大左シフトは19です。 MATH1 を使用します。EXPNT = 20の場合、上記で指摘したようにデータは飽和します。 数学1.EXPNT = 20 は、12 ビット符号付き入力の場合に問題なく動作します。

元の投稿で解決策を見る

0 件の賞賛
10 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@koala

SPUの設定に問題があるか、C / Pythonの実装が異なる(例: 中間計算ステップ中の精度?

この問題の真相を突き止めるには、次の備考を参照してください。

  • どのAurixマイクロコントローラを使用しているか教えてください。
  • SPU で FFT を実行する前に、入力データにウィンドウを適用していないことがわかります。 これは、Pythonの実装と比較してノイズフロアが増加した理由でしょうか?
  • 「math0 loader exponent」パラメータを使用すると、Nビット入力データを内部32ビット形式に揃えることができます。 つまり、たとえば N=12ビットの入力データの場合、この値は「20」に設定することが望ましいです。

また、テスト目的では、上の画像でテストに使用したデータのテストデータセット(整数C配列としての生データ)を提供して、私たちの側でテストを実行できるようにしていただければ幸いです。

 

よろしくお願いいたします

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/SPU-FFT-result-seems-not-valid-when-input-amplitude-is-large-Small-is-OK/m-p/739350

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@tt3

私はTC357TAを使用していますが、問題はRIF設定にあることがわかりました:データ長レジスタはデフォルトで10ビットになっています。 手動で12ビットに設定すると、問題が解決しました。

ところで、私は "math0ローダー指数"パラメータを20に設定しようとしましたが、FFTエンジンへの入力データは2048に制限されているようです。FFTエンジンへの入力信号(下図のシアン線)は、SPU出力(赤線)の逆FFTを計算して推定します。

koala_0-1713242088890.png

 

そして、 "math0 loader exponent"を19に設定すると、すべてが完全に整列します。

koala_1-1713242497100.png

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/SPU-FFT-result-seems-not-valid-when-input-amplitude-is-large-Small-is-OK/m-p/740038

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@koala、SPUは内部的に常に32ビット符号付き整数データ形式で動作します。 したがって、12ビットの符号なし入力がある場合、MATH1で許可される最大左シフトは19です。 MATH1 を使用します。EXPNT = 20の場合、上記で指摘したようにデータは飽和します。 数学1.EXPNT = 20 は、12 ビット符号付き入力の場合に問題なく動作します。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

注意しました、ありがとう!

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは、RIF構成も共有していただけませんか?

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

具体的には、RIFx_DFUを見るのは興味深いことです。DFビット設定 私には、RIF側での署名付き/署名なしのデータ処理に問題がある可能性があるようです。 RIF は SPU に 16 ビット値としてサンプルを提供します。 サンプル幅が16ビットより小さい場合(例: 12 ビット サンプル) では、MSB は RIFx_DFU に従って符号が拡張されます。DF設定。

12 ビットのサンプルケースで、SPU の Unsigned 設定で、RIF の Signed 設定では、2047 より大きい値は RIF によって符号拡張されますが、SPU によって非常に大きな符号なし値としてインターパートされます。 2047 より小さい値の場合、符号の拡張は行われないため、違いがない可能性があります。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは、私は符号なしデータ形式を使用しています:

IfxRif_setDataFormat(rif, IfxRif_DataFormat_unsigned);

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@koala、全体的な概要をよりよく理解するために、RIF構成を送信していただけませんか? 内部または外部ADCを使用していますか?Regstier Dumpはさらに役立つと思います。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@Lichtgestalt 

はい、内部ADCを使用しており、次の図はRIFレジスタを示しています。

koala_0-1714637816295.png

ありがとうございました

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

こんにちは@koala、デバッグのためのもう1つの考え:すべてのSPU処理をバイパスして、結果を次のように保存することは可能ですか? real16データ形式と、データが期待どおりにメモリに到着しているかどうかを確認しますか? 問題がSPU処理によってどのように導入されるかを確認するだけです。

0 件の賞賛