arm_mult_f32 を使用して 2 つの配列を乗算すると、予期しない (ガベージ) 結果が生成されます。
私はdspについて読んでいます。FFT の前に、サンプリングされた PCM データに適用するハン係数を作成しています。
ハニング関数は、私が見つけた hann.m matlab の例からのものです。唯一の違いは、stm32f4 には単精度 FPU しかないため、データ フィールドには double ではなく uint32_t を使用しています。
まず、定義。
FFT_LEN = 256;
float32_t FFTBuf[FFT_LEN * 2]; // data set twice the fft length as output
//symetrically repeated
float32_t FFTMagBuf[FFT_LEN]; //
float32_t * hann_window;
float32_t * hann_buff;
float32_t * hanning(uint32_t, uint8_t)
ハニング関数を呼び出して、ウィンドウに入力します。
hann_window = hanning(FFT_LEN * 2, 2); // creates a dynamic array and
//populates it with coeffs.
hann_buff = (float32_t *)calloc(FFT_LEN * 2, (sizeof(float32_t)));
memset(hann_buff, 0, FFT_LEN * 2 * sizeof(float32_t)); //intermediate
//buffer
then when all pcm samples are read
arm_mult_f32(FFTBuf, &hann_window[0], &hann_buff[0], (FFT_LEN * 2)); //
arm_cfft_f32(&arm_cfft_sR_f32_len256, &hann_buff[0], 0, 1);
arm_cmplx_mag_f32(&hann_buff[0], FFTMagBuf, FFT_LEN);
ハン関数は次のとおりです。
float32_t *hanning(uint32_t N, uint8_t itype)
{
uint32_t half, i, idx, n;
float32_t *w;
w = (float32_t *)calloc(N, sizeof(float32_t));
memset(w, 0, N * sizeof(float32_t));
if (itype == 1) //periodic function
n = N - 1;
else
n = N;
if (n % 2 == 0)
{
half = n / 2;
for (i = 0; i < half; i++) //CALC_HANNING Calculates Hanning window samples.
w[i] = 0.5 * (1 - cos(2 * PI * (i + 1) / (n + 1)));
idx = half - 1;
for (i = half; i < n; i++)
{
w[i] = w[idx];
idx--;
}
}
else
{
half = (n + 1) / 2;
for (i = 0; i < half; i++) //CALC_HANNING Calculates Hanning window samples.
w[i] = 0.5 * (1 - cos(2 * PI * (i + 1) / (n + 1)));
idx = half - 2;
for (i = half; i < n; i++)
{
w[i] = w[idx];
idx--;
}
}
if (itype == 1) //periodic function
{
for (i = N - 1; i >= 1; i--)
w[i] = w[i - 1];
w[0] = 0.0;
}
return (w);
}
ウィンドウ関数を使用しないと、適切な値が得られます。コードを 4khz の正弦波でテストしたところ、正しい結果が得られました (ハン ウィンドウの要素なし)。
新しい出力のサンプルはあまり良くありません。
{1.10114283e-019, 0 <repeats 48 times>, 35050560, inf, 0.0352631919,
1.08468142e-019, 2.84188939e-009, inf, 143872, 142068.25, 3.31743232e+010,
8800024, 3.29058877e+010, 0, 1.53397155e-019, 4.58692708e-013, 61631.5938,
0, inf, 1154.63733, inf, inf, inf, inf, inf, inf, inf, 1.14477244e+011,
提案に従って、動的割り当てを削除しました。新しい出力は見栄えがよく、理にかなっています。次に入力を正規化し、旅を続けます。
{6120297, 4445404.5, 1772673.5, 1041102.38, 659743.438, 484291.75,
513112.688, 289598.594, 668016.812, 487091.375, 315217.875, 585517.562,
513285.281, 268263.375, 69867.4531, 108220.406, 85955.2031, 75381.0234,
124448.68, 559070.812, 996484.75, 1008192.25, 515462.312, 316204.938,
124825.734,