完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转dsp系列教程
本期教程主要讲解math_help文件中函数的使用,这个文件也是ARM官方提供的,这些函数相对都比较容易,同时使用频率也很高。希望初学的同学学习并掌握。 22.1 函数讲解 22.3 总结 22.1 函数讲解 22.1.1 函数目录 在文件math_help文件中主要有以下函数: [url=]复制代码[/url]
|
|
相关推荐
|
|
22.1.2 arm_snr_f32
这个函数用于求信噪比: 复制代码 /** (1) * @brief Caluclation of SNR * @param float* Pointer to the reference buffer * @param float* Pointer to the test buffer * @param uint32_t total number of samples * @Return float SNR * The function Caluclates signal to noise ratio for the reference output * and test output */ float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) { float EnergySignal = 0.0, EnergyError = 0.0; uint32_t i; float SNR; int temp; int *test; for (i = 0; i < buffSize; i++) { /* Checking for a NAN value in pRef array */ test = (int *)(&pRef); temp = *test; if(temp == 0x7FC00000) { return(0); } /* Checking for a NAN value in pTest array */ test = (int *)(&pTest); temp = *test; if(temp == 0x7FC00000) { return(0); } EnergySignal += pRef * pRef; EnergyError += (pRef - pTest) * (pRef - pTest); } /* Checking for a NAN value in EnergyError */ test = (int *)(&EnergyError); temp = *test; if(temp == 0x7FC00000) { return(0); } SNR = 10 * log10 (EnergySignal / EnergyError); (2) return (SNR); } |
|
|
|
|
|
|
|
|
|
22.1.3 arm_float_to_q12_20
复制代码 /** * @brief Converts float to fixed in q12.20 format (1) * @param uint32_t number of samples in the buffer * @return none * The function converts floating point values to fixed point(q12.20) values */ void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) { uint32_t i; for (i = 0; i < numSamples; i++) { /* 1048576.0f corresponds to pow(2, 20) */ pOut[i] = (q31_t) (pIn[i] * 1048576.0f); (2) pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; if (pIn[i] == (float) 1.0) { pOut[i] = 0x000FFFFF; } } } 1. 这个函数用于将浮点数转换成Q12.20格式的数据。 2. 浮点数转换成Q12.20格式需要乘以2^20,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。 |
|
|
|
|
|
22.1.4 arm_provide_guard_bits_q15
复制代码 /** * @brief Provide guard bits for Input buffer * @param q15_t* Pointer to input buffer * @param uint32_t blockSize * @param uint32_t guard_bits * @return none * The function Provides the guard bits for the buffer * to avoid overflow */ void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, uint32_t guard_bits) { uint32_t i; for (i = 0; i < blockSize; i++) { input_buf[i] = input_buf[i] >> guard_bits; } } 1. 这个函数用于给q15_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。 |
|
|
|
|
|
22.1.5 arm_provide_guard_bits_q31
复制代码 /** * @brief Provide guard bits for Input buffer * @param q31_t* Pointer to input buffer * @param uint32_t blockSize * @param uint32_t guard_bits * @return none * The function Provides the guard bits for the buffer * to avoid overflow */ void arm_provide_guard_bits_q31 (q31_t * input_buf, uint32_t blockSize, uint32_t guard_bits) { uint32_t i; for (i = 0; i < blockSize; i++) { input_buf[i] = input_buf[i] >> guard_bits; } } 1. 这个函数用于给q31_t类型的数据提供保护位,防止溢出。从函数的实现上看,保护位的实现是通过右移数据实现的。 |
|
|
|
|
|
22.1.6 arm_float_to_q14
复制代码 /** * @brief Converts float to fixed q14 * @param uint32_t number of samples in the buffer * @return none * The function converts floating point values to fixed point values */ void arm_float_to_q14 (float *pIn, q15_t * pOut, uint32_t numSamples) { uint32_t i; for (i = 0; i < numSamples; i++) { /* 16384.0f corresponds to pow(2, 14) */ pOut[i] = (q15_t) (pIn[i] * 16384.0f); pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; if (pIn[i] == (float) 2.0) { pOut[i] = 0x7FFF; } } } 1. 这个函数用于将浮点数转换成Q14格式的数据。 2. 浮点数转换成Q14格式需要乘以2^14,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。 |
|
|
|
|
|
22.1.7 arm_float_to_q30
复制代码 /** * @brief Converts float to fixed q30 format * @param uint32_t number of samples in the buffer * @return none * The function converts floating point values to fixed point values */ void arm_float_to_q29 (float *pIn, q31_t * pOut, uint32_t numSamples) { uint32_t i; for (i = 0; i < numSamples; i++) { /* 1073741824.0f corresponds to pow(2, 30) */ pOut[i] = (q31_t) (pIn[i] * 536870912.0f); pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; if (pIn[i] == (float) 4.0) { pOut[i] = 0x7FFFFFFF; } } } 1. 这个函数用于将浮点数转换成Q30格式的数据。 2. 浮点数转换成Q30格式需要乘以2^30,然后再做舍入处理,特别注意这里的浮点数末尾要加符号f,这样才能保证是单精度。 |
|
|
|
|
|
22.1.8 arm_calc_guard_bits
复制代码 /** * @brief Caluclates number of guard bits * @param uint32_t number of additions * @return none * The function Caluclates the number of guard bits * depending on the numtaps */ uint32_t arm_calc_guard_bits (uint32_t num_adds) { uint32_t i = 1, j = 0; if (num_adds == 1) { return (0); } while (i < num_adds) { i = i * 2; j++; } return (j); } 1. 这个函数是根据加数的个数来计算最终结果需要的保护位格式,从而防止溢出。 |
|
|
|
|
|
22.1.9 arm_apply_guard_bits
复制代码 /** * @brief Converts Q15 to floating-point * @param uint32_t number of samples in the buffer * @return none */ void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits) { uint32_t i; for (i = 0; i < numSamples; i++) { pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); } } 1. 这个函数不是很理解在实际应用中的作用。 |
|
|
|
|
|
22.1.10 arm_calc_2pow
复制代码 /** * @brief Calculates pow(2, numShifts) * @param uint32_t number of shifts * @return pow(2, numShifts) */ uint32_t arm_calc_2pow(uint32_t numShifts) { uint32_t i, val = 1; for (i = 0; i < numShifts; i++) { val = val * 2; } return(val); } 1. 这个函数用于求解2的n次方。 |
|
|
|
|
|
22.1.11 arm_compare_fixed_q15
复制代码 /** * @brief Compare MATLAB Reference Output and ARM Test output * @param q15_t* Pointer to Ref buffer * @param q15_t* Pointer to Test buffer * @param uint32_t number of samples in the buffer * @return none */ uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) { uint32_t i; int32_t diff, diffCrnt = 0; uint32_t maxDiff = 0; for (i = 0; i < numSamples; i++) { diff = pIn[i] - pOut[i]; diffCrnt = (diff > 0) ? diff : -diff; if(diffCrnt > maxDiff) { maxDiff = diffCrnt; } } return(maxDiff); } 1. 这个函数用于对比matlab和ARM实际计算的输出,并返回最大的差值(Q15)。 |
|
|
|
|
|
22.1.12 arm_compare_fixed_q15
复制代码 /** * @brief Compare MATLAB Reference Output and ARM Test output * @param q31_t* Pointer to Ref buffer * @param q31_t* Pointer to Test buffer * @param uint32_t number of samples in the buffer * @return none */ uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) { uint32_t i; int32_t diff, diffCrnt = 0; uint32_t maxDiff = 0; for (i = 0; i < numSamples; i++) { diff = pIn[i] - pOut[i]; diffCrnt = (diff > 0) ? diff : -diff; if(diffCrnt > maxDiff) { maxDiff = diffCrnt; } } return(maxDiff); } 1. 这个函数用于对比matlab和ARM实际计算的输出,并返回最大的差值(Q31)。 |
|
|
|
|
|
好
|
|
|
|
|
|
imx6ull裸机编程,使用宏定义无法驱动,使用指针就可以驱动
434 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十二章 音频FFT实验
297 浏览 0 评论
飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用
1266 浏览 0 评论
stc15f2k60s2利用串口传输字模存储到eeprom并进行点阵显示
1603 浏览 1 评论
1589 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11614 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 14:22 , Processed in 0.992882 second(s), Total 95, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号