본문 바로가기

CMSIS DSP

자체 개발 BPF 함수와 CMSIS BPF 함수 속도 비교

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);