
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接 第17章 ComplexMathFunctions的使用(一) 本期教程主要讲解复数运算中的共轭,点乘和模的求解(什么是复数,大家应该还有印象吧,这个很重要,在后面FFT等算法的处理时都要用到,印象不深的同学需要简单的补充下高数知识)。 17.1 复数共轭运算 ComplexConj 17.2 复数点乘 ComplexDotProduct 17.3 复数求模 ComplexMag 17.4 总结 17.1 复数共轭运算 ComplexConj17.1.1 arm_cmplx_conj_f32 公式描述: for(n=0; n<numSamples; n++) { pDst[(2*n)+0)] = pSrc[(2*n)+0]; // 实部 pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // 虚部 } 函数定义如下: void arm_cmplx_conj_f32(float32_t * pSrc, float32_t * pDst, uint32_t numSamples) 参数定义: *pSrc points to the input vector *pDst points to the output vector numSamples number of complex samples in each vector 注意事项: 1. 数组pSrc中存储的数据格式是(实部,虚部,实部,虚部……………),一定要按照这个顺序存储数据,比如数据1-j,j,2+3j这个三个数在数组中的存储格式就是:pSrc[6] = {1, -1, 0, 1, 2, 3}。 (注意第三个数据是0)。函数的输出结果pDst也是按照这个顺序存储的。 17.1.2 arm_cmplx_conj_q31 公式描述: for(n=0; n<numSamples; n++) { pDst[(2*n)+0)] = pSrc[(2*n)+0]; // 实部 pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // 虚部 } 函数定义如下: void arm_cmplx_conj_q31(q31_t * pSrc, q31_t * pDst, uint32_t numSamples) 参数定义: *pSrc points to the input vector *pDst points to the output vector numSamples number of complex samples in each vector 注意事项: 1. 数组pSrc中存储的数据格式是(实部,虚部,实部,虚部……………),一定要按照这个顺序存储数据,比如数据1-j,j,2+3j这个三个数在数组中的存储格式就是:pSrc[6] = {1, -1, 0, 1, 2, 3}。 (注意第三个数据是0)。函数的输出结果pDst也是按照这个顺序存储的。 2. 这个函数使用了饱和运算。 3. 数值0x80000000由于饱和运算将变成0x7FFFFFFF。 17.1.3 arm_cmplx_conj_q15 公式描述: for(n=0; n<numSamples; n++) { pDst[(2*n)+0)] = pSrc[(2*n)+0]; // 实部 pDst[(2*n)+1)] = -pSrc[(2*n)+1]; // 虚部 } 函数定义如下: void arm_cmplx_conj_q15(q15_t * pSrc, q15_t * pDst, uint32_t numSamples) 参数定义: *pSrc points to the input vector *pDst points to the output vector numSamples number of complex samples in each vector 注意事项: 1. 数组pSrc中存储的数据格式是(实部,虚部,实部,虚部……………),一定要按照这个顺序存储数据,比如数据1-j,j,2+3j这个三个数在数组中的存储格式就是:pSrc[6] = {1, -1, 0, 1, 2, 3}。 (注意第三个数据是0)。函数的输出结果pDst也是按照这个顺序存储的。 2. 这个函数使用了饱和运算。 3. 数值0x8000由于饱和运算将变成0x7FFF。 17.1.4 实例讲解 实验目的: 1. 学习ComplexMathFunctions中复数共轭的求解(首先大家要明白什么是复数共轭) 实验内容: 1. 按下按键K1, 串口打印函数DSP_CONJ的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下: ![]() 程序设计:
1. 这里先简单的普及一下复数共轭的基础知识,可能很多人都已经忘记了(来自wiki百科): ![]() 的复共轭是 ![]() 举例明之: ![]() ![]() 在复数的极坐标表法下,复共轭写成 ![]() 这点可以透过欧拉公式验证 ![]() 下面再说一下如何在matlab上面共轭复数。比如我们要求解数组a = [1+2j 2+2j 3+3j j]的共轭复数: ![]() 2. Q31格式定点数的共轭求解。 3. Q15格式定点数的共轭求解。 |
17.2.2 arm_cmplx_dot_prod_q31
17.2.3 arm_cmplx_dot_prod_q15
17.2.4 实例讲解
17.3.1 arm_cmplx_mag_f32
17.3.2 arm_cmplx_mag_q31
17.3.3 arm_cmplx_mag_q15
17.3.4 实例讲解
17.4 总结