【英飞凌PSoC 6 RTT开发板试用】信号处理前端之频率幅值相位分析

描述

3.2 周期(频率),幅值,相位分析

原理

FFT变换结果,幅值最大的横坐标对应信号频率,纵坐标对应幅度。幅值最大的为out[m]=val;则信号频率f0=(Fs/N)m ,信号幅值Vpp=val/(N/2)。N为FFT的点数,Fs为采样频率。相位Pha=atan2(a, b)弧度制,其中ab是输出虚数结果的实部和虚部。

添加命令行

shell_fun.h中

void FrqFun(void* param);

shell_fun.c中

#include "frq.h"

shell_cmd_list中添加一行

{ (const uint8_t*)"frt",         FrqFun,           "frq"},

添加命令执行函数

void FrqFun(void* param)

{

Frq_main();

}

实现代码

Frq.c

#include "arm_math.h"
#include "arm_const_structs.h"
#include < stdio.h >

#define TEST_LENGTH_SAMPLES 2048
#define FS 10000

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 frq_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);

  float freq = (FS/TEST_LENGTH_SAMPLES)*testIndex;
  float vpp = maxValue/(TEST_LENGTH_SAMPLES/2);
  float pha = atan2(testOutput[2*testIndex],testOutput[2*testIndex+1]);
  printf("freq=%f,vpp=%f,pha=%frn",freq,vpp,pha);

}

 /** endlink */

Frq.h

#ifndef FRQ_H
#define FRQ_H

int frq_main(void);

#endif

测试

输入frq开始测试印如下
频率

实时采集测试

此时采集的是音频背景声,噪声很小,所以频率为0
频率

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分