FreeRTOS, CMSIS DSP (Спасибо Геннадию Завидовскому)
ПРИМЕР:
//заполнение массива тремя sin-усоидами.
// FIR фильтр на 169 taps
// FFT
// получение амплитуд pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);
// прорисовка
__IO float32_t p[FRAME_SIZE * 2];
__IO float32_t pFirOut[FRAME_SIZE];
__IO float32_t pOut[FRAME_SIZE];
__IO float32_t win[FRAME_SIZE];
__IO float32_t pMag[FRAME_SIZE];
float32_t firStateF32[FRAME_SIZE + SAMPLEFILTER_TAP_NUM - 1];
float32_t firCoeff32[SAMPLEFILTER_TAP_NUM];
..
..
..
..
void StartDefaultTask(void const *argument) {
/* init code for USB_HOST */
MX_USB_HOST_Init();
/* USER CODE BEGIN 5 */
unsigned char buff[20];
uint32_t cou = 0;
float32_t pp = (float32_t) (2 * 3.14159265359);//3.14159265359
int freq = 6700;
int bit = 24000;//битрэйд
//ini log2 table
init_log_table();
//весовое окно
for (int i = 0; i < FRAME_SIZE; i++) {
win[ i] = (float32_t) (1.0
- 1.93293488969227 * cos((double) i * pp / (FRAME_SIZE - 1))
+ 1.28349769674027 * cos((double) i * pp * 2.0 / (FRAME_SIZE - 1))
- 0.38130801681619 * cos((double) i * pp * 3.0 / (FRAME_SIZE - 1))
+ 0.02929730258511 * cos((double) i * pp * 4.0 / (FRAME_SIZE - 1)));
}
HAL_RNG_Init(&hrng);
//ini fft
arm_rfft_fast_instance_f32 fftInstance;
arm_rfft_fast_init_f32(&fftInstance, 1024);
//ini fir filtra
for (int i = 0; i < SAMPLEFILTER_TAP_NUM; i++) {
firCoeff32[ i] = (float32_t) filter_tap[ i];
}
arm_fir_instance_f32 S;
arm_fir_init_f32(&S, SAMPLEFILTER_TAP_NUM, (float32_t *) firCoeff32, &firStateF32[0], FRAME_SIZE);
/* Infinite loop */
while (1) {
if (freq > 11000)freq = 6700;
for (int i = 0; i < FRAME_SIZE; i++) {
float32_t sin1 = arm_sin_f32(pp * 1456 * i / bit);
float32_t sin2 = arm_sin_f32(pp * 10976 * i / bit);
float32_t sin3 = arm_sin_f32(pp * freq * i / bit);
float32_t sinn = (sin1 + 3 * sin2 + 6 * sin3 + HAL_RNG_GetRandomNumber(&hrng) / 0xdfffffff);
p[ i] = sinn * win[ i];//wtFLATTOP
p[i + FRAME_SIZE] = 0; // заполняем мнимую часть сигнала
}
p[0] = 0;
p[FRAME_SIZE] = 0;
arm_fir_f32(&S, (float *) p, (float32_t *) pFirOut, FRAME_SIZE);
// arm_rfft_fast_f32(&fftInstance, (float32_t *) p, (float32_t *) pOut, 0);
arm_rfft_fast_f32(&fftInstance, (float32_t *) pFirOut, (float32_t *) pOut, 0);
//pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);
arm_cmplx_mag_f32((float32_t *)pOut,(float32_t *)pMag,FRAME_SIZE);
fft();
freq += 100;
cou++;
if (cou >= 999999)cou = 0;
// osDelay(1);
}
/* USER CODE END 5 */
}