Bin Frequency Example에서 테스트했습니다. arm_cfft_f32 함수는 연산 단위로 bin을 사용하고 arm_fir_f32 함수는 float32_t 타입을 사용하기 때문에 for문으로 bin의 패딩 공간을 없애주는 작업이 필요했지만, for문을 1024회 수행하는데 1ms도 걸리지 않았기 때문에 아래 코드에서는 생략했습니다. 예상대로 영역 전환이 없는 CMSIS FIR 함수가 더 빨랐지만(8.5%) 생각보다 큰 차이는 아니었습니다. 그에 반해서 정확도는 주파수 영역을 직접 수정하는 자체 개발 Band Pass Filter 함수가 더 높았습니다.
그런데 이 속도는 그다지 의미가 없습니다. FIR 모듈의 경우 차수를 높힐수록 속도가 줄어들고, FTT 모듈도 FTT Size에 따라 속도가 달라지기 때문입니다. 그냥 심심해서 기본 예제를 바탕으로 테스트 해봤습니다.
자체 개발 BPF 함수 : 211ms
uint32_t exe_tick = HAL_GetTick();
/* Process the data through the CFFT/CIFFT module */
arm_cfft_f32(cfft_instance, cfft_data, ifftFlag, doBitReverse);
/* filtering by 10KHz BPF */
// 48KHz * 213 / 1023 = 10KHz
bandpass_filter(cfft_data, 213, 0 , fftSize);
/* Reverse Complex FFT */
//ifftFlag = 1;
arm_cfft_f32(cfft_instance, cfft_data, ifftFlag, doBitReverse);
exe_tick = HAL_GetTick() - exe_tick;
printf("execution tick : %u\r\n", (unsigned int)exe_tick);
CMSIS BPF 함수 : 193ms (8.5% 감소)
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);
// convert from bin format to only float.
for(int i=0; i<TEST_LENGTH_SAMPLES/2; i++) {
testInput[i] = cfft_data[i*2];
}
uint32_t exe_tick = HAL_GetTick();
inputF32 = &testInput[0];
outputF32 = &testOutput[0];
// Call the FIR process function for every blockSize samples
for(int i=0; i < numBlocks; i++)
{
arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
}
exe_tick = HAL_GetTick() - exe_tick;
printf("execution tick : %u\r\n", (unsigned int)exe_tick);
'CMSIS DSP' 카테고리의 다른 글
CMSIS DSP 맛보기 목차 (0) | 2018.04.10 |
---|---|
CMSIS FIR 필터 함수와 매트랩을 사용하여 Band Pass Filter 설계 (0) | 2018.04.09 |
FIR Lowpass Filter Example (0) | 2018.04.09 |
자체 개발한 Digital Band Pass Filter 함수 (0) | 2018.04.09 |
샘플링 주파수를 감소시켰을 때 Frequency Bin Example (0) | 2018.04.09 |