在电能检测应用中,电能质量一项分析即谐波分析,谐波分量大,说明电能质量不好,
基于本板信号处理前端也实现了该功能。
shell_fun.h中
void FftFun(void* param);
shell_fun.c中
#include "fft.h"
shell_cmd_list中添加一行
{ (const uint8_t*)"fft", FftFun, "fft"}, /*打印帮助信息*/
添加命令执行函数
void FftFun(void* param)
{
fft_main();
}
Fft.c
#include "arm_math.h"
#include "arm_const_structs.h"
#include < stdio.h >
#define TEST_LENGTH_SAMPLES 2048
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
static float32_t testOutput[TEST_LENGTH_SAMPLES/2];
static uint32_t fftSize = 1024;
static uint32_t ifftFlag = 0;
static uint32_t doBitReverse = 1;
static arm_cfft_instance_f32 varInstCfftF32;
static int testIndex = 0;
static float testtmp_f32_10khz[2048];
static int32_t adcbuffer[2048];
int32_t fft_main(void)
{
arm_status status;
float32_t maxValue;
status = ARM_MATH_SUCCESS;
status=arm_cfft_init_f32(&varInstCfftF32,fftSize);
//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz));
adc_samp(adcbuffer,2048);
for(int i=0; i< 2048;i ++)
{
testtmp_f32_10khz[i] = (float)adcbuffer[i];
}
arm_cfft_f32(&varInstCfftF32, testtmp_f32_10khz, ifftFlag, doBitReverse);
arm_cmplx_mag_f32(testtmp_f32_10khz, testOutput, fftSize);
/* Calculates maxValue and returns corresponding BIN value */
arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
int32_t out = 0;
for(int i=0; i< TEST_LENGTH_SAMPLES; i++)
{
if(i >TEST_LENGTH_SAMPLES/2)
{
out = testOutput[i-TEST_LENGTH_SAMPLES/2]/1024;
}
else
{
out = testOutput[i]/1024;
}
printf("/*%ld,%ld*/rn", adcbuffer[i],out);
}
}
/** endlink */
Fft.h
#ifndef FFT_H
#define FFT_H
int fft_main(void);
#endif
看到分析如下,前面是模拟输入,后面是谐波分析结果
详见视频和工程源码
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !