Уродовался-уродовался, родил вот такое:
CODE
// FFT.c
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "arm_math.h"
#include "FftLib.h"
// выходной спектр FFT
uint16_t SpectrumOut [ N_WAVE / 2 ];
static uint32_t ifftFlag = 0;
static uint32_t doBitReverse = 1;
// q31_t == int32_t
static q31_t input [ N_WAVE * 2 ];
static q31_t output [ N_WAVE ];
// Выполнение FFT
// pInData - входные данные (выборка FFT) - N_WAVE
void DoFFT ( uint16_t *pInData )
{
int i, pos;
uint32_t val;
// Очистка спектра
memset ( SpectrumOut, 0, sizeof ( SpectrumOut ) );
// если инициализация не выполнена - ничего не делать
// Initialize the CFFT/CIFFT module
if ( arm_cfft_radix4_init_q31 ( &S, N_WAVE, ifftFlag, doBitReverse) != ARM_MATH_SUCCESS )
return;
// 1. Подготовка входных данных
pos = 0;
for ( i = 0; i < N_WAVE; i ++ )
{
val = pInData [ i ];
val <<= 16;
input [ pos ] = val; // Re
input [ pos + 1 ] = 0; // Im
pos += 2;
} // for
arm_cfft_radix4_q31 ( &S, input );
arm_cmplx_mag_q31 ( input, output, N_WAVE / 2 );
for ( i = 0; i < N_WAVE / 2; i ++ )
{
// SpectrumOut [ i ] = __USAT ( output [ i ] >> 21, 5 );
SpectrumOut [ i ] = __USAT ( output [ i ] >> 14, 7 );
} // for
} // DoFFT
N_WAVE = 1024. Отрисовывается в окне 100x50 в масштабе 1:1. Если палка больше 100 по высоте, рисует 100 пикселей.
Работает, палки дёргаются вроде в такт музыке, но как-то странно - вначале много палок, в конце мало.
Пытался уменьшить размер выборки - N_WAVE = 512 - вообще ничего

Никак не вкурю, как работает DSP-шная команда usat. Гуглом ничего путного не нашёл.