【英飞凌PSoC 6 RTT开发板试用】语音识别之一:移植CMSIS-DSP库-FFT测试

描述

一. 前言

后面会基于本开发板实现语音识别,需要使用到FFT等关键算法,所以先移植CMSIS-DSP库,并进行FFT的测试。

移植DSP算法库

添加代码

git clone https://github.com/ARM-software/CMSIS_5.git

CMSIS_5\\CMSIS\\DSP下是相关文件,Source下是源码

英飞凌

将DSP文件夹复制到自己的工程目录中,只保留

Include,PrivateInclude,Source三个文件夹

英飞凌

英飞凌

Source下的每个子文件夹都是一类算法,里面的每个c都对应一个计算函数,并且有一个总文件包括其中所有的单个.c,比如BasicMathFunctions.c中

英飞凌

删除这些总的.c,避免编译重复

删除以下文件和所有的非.c和.h文件

BasicMathFunctions:BasicMathFunctions.c,BasicMathFunctionsF16.c

BayesFunctions:BayesFunctions.c,BayesFunctionsF16.c

CommonTables:CommonTables.c,CommonTablesF16.c

ComplexMathFunctions:ComplexMathFunctions.c,ComplexMathFunctionsF16.c

ControllerFunctions:ControllerFunctions.c

DistanceFunctions:DistanceFunctions.c,DistanceFunctionsF16.c

FastMathFunctions:FastMathFunctions.c,FastMathFunctionsF16.c

FilteringFunctions:FilteringFunctions.c,FilteringFunctionsF16.c

InterpolationFunctions:InterpolationFunctions.c,InterpolationFunctionsF16.c

MatrixFunctions:MatrixFunctions.c,MatrixFunctionsF16.c

QuaternionMathFunctions:QuaternionMathFunctions.c

StatisticsFunctions:StatisticsFunctions.c,StatisticsFunctionsF16.c

SupportFunctions:SupportFunctions.c,SupportFunctionsF16.c

SVMFunctions:SVMFunctions.c,SVMFunctionsF16.c

TransformFunctions:TransformFunctions.c,TransformFunctionsF16.c,arm_bitreversal2.S

英飞凌

工程设置添加相关头文件包含路径

测试

复制CMSIS_5\\CMSIS\\DSP\\Examples\\ARM\\arm_fft_bin_example下的arm_fft_bin_data.c和arm_fft_bin_example_f32.c到自己的工程目录

arm_fft_bin_example_f32.c下的

int32_t main(void)改为int32_t ffttest_main(void)

并添加#define SEMIHOSTING以使能printf打印,我们已经重定向实现了printf打印到串口。

由于 arm_cfft_f32(&varInstCfftF32, testInput_f32_10khz, ifftFlag, doBitReverse);会修改testInput_f32_10khz的内容,所以添加一个缓存,以便能重复测试

float32_t testtmp_f32_10khz[2048];
  /* Process the data through the CFFT/CIFFT module */
  memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz));
  arm_cfft_f32(&varInstCfftF32, testtmp_f32_10khz, ifftFlag, doBitReverse);

  /* Process the data through the Complex Magnitude Module for
  calculating the magnitude at each bin */
  arm_cmplx_mag_f32(testtmp_f32_10khz, testOutput, fftSize);

在自己的main函数中申明并调用

int32_t ffttest_main(void);

    ffttest_main();

编译运行可以看到串口打印SUCCESS说明测试OK。

将输入输出数据打印

printf("SUCCESS\\\\\\\\n");
    for(int i=0; i  TEST_LENGTH_SAMPLES; i++)
    {
    	if(i  TEST_LENGTH_SAMPLES/2)
    	{
            printf("/*%f,%f*/\\\\\\\\r\\\\\\\\n", testInput_f32_10khz[i],testOutput[i]);
    	}
    	else
    	{
            printf("/*%f,%f*/\\\\\\\\r\\\\\\\\n", testInput_f32_10khz[i],0.0);
    	}

    }

使用serialstudio可视化显示,可以看到计算结果FFT频率明显的峰值

英飞凌

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分