打印
[程序源码]

CMSIS-DSP库做FFT,如何求相位?

[复制链接]
1435|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GZZXB|  楼主 | 2019-6-27 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码在官方的例子里稍做修改而来,频率计算准确.相位不对.  

#include "arm_math.h"
#include "arm_const_structs.h"
#define TEST_LENGTH_SAMPLES 256
#if TEST_LENGTH_SAMPLES==2048
    #define ARM_CFFT_SR_F32_LEN arm_cfft_sR_f32_len1024
#elif TEST_LENGTH_SAMPLES==1024
    #define ARM_CFFT_SR_F32_LEN arm_cfft_sR_f32_len512
#elif TEST_LENGTH_SAMPLES==512
    #define ARM_CFFT_SR_F32_LEN arm_cfft_sR_f32_len256
#elif TEST_LENGTH_SAMPLES==256
    #define ARM_CFFT_SR_F32_LEN arm_cfft_sR_f32_len128
#endif
//#define TEST_F   2300
uint16_t  TEST_F =  5000;
/* -------------------------------------------------------------------
* External Input and Output buffer Declarations for FFT Bin Example
* ------------------------------------------------------------------- */
float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES*2];
static float32_t testOutput[TEST_LENGTH_SAMPLES/2];
/* ------------------------------------------------------------------
* Global variables for FFT Bin Example
* ------------------------------------------------------------------- */
uint32_t fftSize = TEST_LENGTH_SAMPLES/2;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
/* Reference index at which max energy of bin ocuurs */
uint32_t refIndex = 213, testIndex = 0;
volatile float32_t ph;
/* ----------------------------------------------------------------------
* Max magnitude FFT Bin test
* ------------------------------------------------------------------- */
float32_t fre1;
float32_t n;
int32_t main(void)
{
  uint16_t i,j=0;
  arm_status status;
  float32_t maxValue;

  status = ARM_MATH_SUCCESS;
        while(1)
        {
                //for(i=0; i<fftSize; i++)TEST_LENGTH_SAMPLES
                n++;
                for(i=0; i<TEST_LENGTH_SAMPLES; i++)
                {
                        testInput_f32_10khz[i*2+1] = 0;
                        testInput_f32_10khz[i*2] = arm_sin_f32(2*3.1415926f*TEST_F/10000*i+PI/180*n);//模拟一路5K正弦信号,10K采样
                }
          for(i=1;i<TEST_LENGTH_SAMPLES;i++)//
                {
                        //testInput_f32_10khz[i*2]=testInput_f32_10khz[i*2]*conv[i-1];
                }
                for(i=0;i<TEST_LENGTH_SAMPLES/2;i++)//
                {
                        //testInput_f32_10khz[i*2]+=testInput_f32_10khz[(i+TEST_LENGTH_SAMPLES/2)*2];
                }
          /* Process the data through the CFFT/CIFFT module */
          arm_cfft_f32(&ARM_CFFT_SR_F32_LEN, testInput_f32_10khz, ifftFlag, doBitReverse);
          /* Process the data through the Complex Magnitude Module for
          calculating the magnitude at each bin */
          arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);
          /* Calculates maxValue and returns corresponding BIN value */
          arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
          fre1=((float)(testIndex)/fftSize)*10000;                 //计算频率
          maxValue=atan2(testInput_f32_10khz[testIndex+1],testInput_f32_10khz[testIndex]);
                ph=maxValue;
                ph*=180;
                ph/=PI;                     //角度
          if(testIndex !=  refIndex)
          {
                status = ARM_MATH_TEST_FAILURE;
          }
        }                            /* main function does not return */
}

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2019-6-27 15:39 | 只看该作者
官方有例程,

使用特权

评论回复
板凳
GZZXB|  楼主 | 2019-6-27 16:18 | 只看该作者

请问 官方哪个例程是有求相位的?

使用特权

评论回复
地板
ayb_ice| | 2019-6-27 17:17 | 只看该作者
GZZXB 发表于 2019-6-27 16:18
请问 官方哪个例程是有求相位的?

相位很简单的,就是复数相除还是相乘什么的,有点不记得了,网上搜索下资料,算法是固定的

使用特权

评论回复
5
GZZXB|  楼主 | 2019-6-27 17:59 | 只看该作者
ayb_ice 发表于 2019-6-27 17:17
相位很简单的,就是复数相除还是相乘什么的,有点不记得了,网上搜索下资料,算法是固定的 ...

我搜索到的资料就是用 我上面那样的代码,但是求出来好像不对。
就是这句了
maxValue=atan2(testInput_f32_10khz[testIndex+1],testInput_f32_10khz[testIndex]);

使用特权

评论回复
6
ayb_ice| | 2019-6-28 08:36 | 只看该作者
GZZXB 发表于 2019-6-27 17:59
我搜索到的资料就是用 我上面那样的代码,但是求出来好像不对。
就是这句了
maxValue=atan2(testInput_f3 ...

算法是对的
这是我项目的代码
f32 fTmp = atan2(g_stFftAdc.afBuf[uiHarIndex*2+1], g_stFftAdc.afBuf[uiHarIndex*2+0]);

但是这个算出来应该是弧度,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

96

主题

331

帖子

10

粉丝