后面会基于本开发板实现语音识别,需要使用到FFT等关键算法,所以先移植CMSIS-DSP库,并进行FFT的测试。
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频率明显的峰值
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !