float THD,V[5]; u32 VMaxIndex; void CalcTHD(float *dat) { arm_mult_f32(dat,(float *)flatTop1024_TAB,fft_inputbuf,ADC_Buffer_Size); //int i; //for(i=0;i<ADC_Buffer_Size;i++) //{ // fft_inputbuf[i]=dat[i]*flatTop1024_TAB[i]; //} arm_rfft_fast_f32_app(fft_inputbuf); //计算峰峰值 fft_inputbuf[0] = 0;//用于去除直流分量 arm_max_f32(fft_inputbuf,ADC_Buffer_Size/2,V+0,&VMaxIndex);//进行傅里叶变换 if(VMaxIndex<20){ THD=-1; return; }else if(VMaxIndex>102){ THD=-3; return; } V[1]=findMax(fft_inputbuf+VMaxIndex*2-2,fft_inputbuf+VMaxIndex*2+3); V[2]=findMax(fft_inputbuf+VMaxIndex*3-2,fft_inputbuf+VMaxIndex*3+3); V[3]=findMax(fft_inputbuf+VMaxIndex*4-2,fft_inputbuf+VMaxIndex*4+3); V[4]=findMax(fft_inputbuf+VMaxIndex*5-2,fft_inputbuf+VMaxIndex*5+3); THD=sqrtf(V[1]*V[1]+V[2]*V[2]+V[3]*V[3]+V[4]*V[4])/V[0]; }
时间: 2024-04-16 17:25:36 浏览: 172
这段代码是用于计算总谐波失真(Total Harmonic Distortion,THD)的函数。具体流程如下:
1. 定义了一个浮点型变量THD和一个长度为5的浮点型数组V,用于存储计算结果。
2. 定义了一个无符号整型变量VMaxIndex,用于记录峰值的索引。
3. 定义了一个名为CalcTHD的函数,该函数用于计算THD。
4. 在函数内部,使用arm_mult_f32函数将输入数据(dat)与flatTop1024_TAB数组进行逐元素相乘,结果存储到fft_inputbuf数组中。
5. 调用arm_rfft_fast_f32_app函数对fft_inputbuf数组进行快速傅里叶变换。
6. 将fft_inputbuf数组中的第一个元素置为0,用于去除直流分量。
7. 使用arm_max_f32函数找到fft_inputbuf数组中的最大值,并将最大值存储到V数组的第一个元素中,并记录其索引到VMaxIndex变量中。
8. 根据VMaxIndex的值,计算V数组的其他元素,即找到VMaxIndex的2倍、3倍、4倍和5倍位置上的峰值,并存储到对应的V数组元素中。
9. 计算THD,即将V数组中除第一个元素外的平方和开根号后除以第一个元素,并将结果存储到THD变量中。
需要注意的是,代码中有一些注释掉的部分,可能是以前的实现或调试代码,被注释掉的部分不参与计算。如果VMaxIndex小于20,则将THD置为-1;如果VMaxIndex大于102,则将THD置为-3。最后,函数执行完毕,THD的值即为计算结果。
如果您有其他问题,请随时提问。
阅读全文