前面学习了开发板的资料,下面基于官方串口打印示例,添加DSP库测试其运算性能:
首先添加DSP库,通过KEIL RTE一键添加十分方便:
初始化DWT计数器用于计时
uint32_t dwt_init(void)
{
uint32_t c;
CoreDebug->DEMCR &= ~0x01000000;
CoreDebug->DEMCR |= 0x01000000;
DWT->CTRL &= ~0x00000001;
DWT->CTRL |= 0x00000001;
DWT->CYCCNT = 0;
c = DWT->CYCCNT;
__ASM volatile ("NOP");
__ASM volatile ("NOP");
return (DWT->CYCCNT - c);
}
测试代码
static void arm_rfft_f32_app(void)
{
uint16_t i;
uint32_t t1,t2;
arm_rfft_fast_instance_f32 S;
ifftFlag = 0;
delay_init();
/* 初始化结构体S中的参数 */
arm_rfft_fast_init_f32(&S, TEST_LENGTH_SAMPLES);
for(i=0; i<1024; i++)
{
/* 波形是由直流分量,50Hz正弦波组成,波形采样率1024,初始相位60° */
testInput_f32[i] = 1 + cos(2*3.1415926f*50*i/1024 + 3.1415926f/3);
}
t1 = DWT->CYCCNT;
/* 1024点实序列快速FFT */
arm_rfft_fast_f32(&S, testInput_f32, testOutput_f32, ifftFlag);
t2 = DWT->CYCCNT;
PRINTF("arm_rfft_fast_f32 t2=%d t1=%d t=%d -> %fus\r\n",t2,t1,t2-t1,(t2-t1)*1.0/150000000);
/* 为了方便跟函数arm_cfft_f32计算的结果做对比,这里求解了1024组模值,实际函数arm_rfft_fast_f32
只求解出了512组
*/
t1 = DWT->CYCCNT;
arm_cmplx_mag_f32(testOutput_f32, testOutputMag_f32, TEST_LENGTH_SAMPLES);
t2 = DWT->CYCCNT;
PRINTF("arm_cmplx_mag_f32 t2=%d t1=%d t=%d -> %fus\r\n",t2,t1,t2-t1,(t2-t1)*1.0/150000000);
while(1)
{
tm_delay_us(500*1000);
//PRINTF("=========================================\r\n");
}
/* 求相频 */
PowerPhaseRadians_f32(testOutput_f32, Phase_f32, TEST_LENGTH_SAMPLES, 0.5f);
/* 串口打印求解的幅频和相频 */
for(i=0; i<TEST_LENGTH_SAMPLES; i++)
{
// PRINTF("%f, %f\r\n", testOutputMag_f32[i], Phase_f32[i]);
}
}
/*!
* @brief Main function
*/
int main(void)
{
/* Structure of initialize PWM */
pwm_config_t pwmConfig;
pwm_fault_param_t faultConfig;
uint32_t pwmVal = 4;
/* Board pin, clock, debug console init */
BOARD_InitHardware();
PRINTF("mcxn236 DSP test\n");
arm_rfft_f32_app();
while(1);
}
测试结果
主频150MHz,计算1024点FFT函数耗时0.000337us,对比ST网友测试结果:


