创龙官方例程单做ifft 为啥算的不对? - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2651|回复: 1

[未解决] 创龙官方例程单做ifft 为啥算的不对?

[复制链接]

3

主题

4

帖子

1035

积分

金牌会员

Rank: 6Rank: 6

积分
1035
发表于 2017-10-21 16:41:06 | 显示全部楼层 |阅读模式
/****************************************************************************/
/*                                                                          */
/*              基2 时间抽取 快速傅里叶变换 / 快速傅里叶逆变换              */
/*                                                                          */
/*              2014年08月25日                                              */
/*                                                                          */
/****************************************************************************/
#include <stdio.h>                  // C 语言标准输入输出函数库
#include <math.h>                   // C 数学函数库

#include "mathlib.h"                // DSP 数学函数库
#include "dsplib.h"                 // DSP 函数库

/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
// 软件断点
#define SW_BREAKPOINT     asm(" SWBP 0 ");

// 采用点数
#define Tn  16
// 采样频率
#define Fs  256.0

// π 及 浮点数极小值
#define PI                3.14159
#define F_TOL             (1e-06)

/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/
// 快速傅里叶变换测试
#pragma DATA_ALIGN(Input, 8);
float Input[Tn];

#pragma DATA_ALIGN(CFFT, 8);
float CFFT[2*Tn]={0,0,-9,9,9,-9,-9,-9,9,9,-9,9,9,-9,-9,-9,0,0,-9,9,9,9,-9,-9,9,-9,-9,9,9,9,-9,-9};


#pragma DATA_ALIGN(CFFT_In, 8);
float CFFT_In[2*Tn];

#pragma DATA_ALIGN(CFFT_Out, 8);
float CFFT_Out[2*Tn];

#pragma DATA_ALIGN(Cw, 8);
float Cw[2*Tn];

#pragma DATA_ALIGN(Cmo, 8);
float Cmo[Tn];

/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/
void bit_rev(float* x, int n);
void gen_w_r2(float* w, int n);

void FFTTest(void);

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
        // FFT 测试
        FFTTest();

        // 断点
        SW_BREAKPOINT;
}

/****************************************************************************/
/*                                                                          */
/*              快速傅里叶变换测试                                          */
/*                                                                          */
/****************************************************************************/
// 比特位反转
void bit_rev(float* x, int n)
{
    int i,j,k;
    float rtemp,itemp;
    j=0;

    for(i=1;i<(n-1);i++)
    {
        k=n>>1;

        while(k<=j)
        {
            j-=k;
            k>>=1;
        }

        j+=k;

        if(i<j)
        {
            rtemp=x[j*2];
            x[j*2]=x[i*2];
            x[i*2]=rtemp;
            itemp=x[j*2+1];
            x[j*2+1]=x[i*2+1];
            x[i*2+1]=itemp;
        }
    }
}

// 产生旋转因子
void gen_w_r2(float* w, int n)
{
    int i;

    float e=PI*2.0/n;

    for(i=0;i<(n>>1);i++)
    {
        w[2*i]=cossp(i*e);
        w[2*i+1]=sinsp(i*e);
    }
}

// 快速傅里叶变换
void FFTTest(void)
{
       

        // 保留一份 FFT 输入副本
   memcpy(CFFT_In, CFFT, 2*Tn*sizeof(float));

    gen_w_r2(Cw, Tn);


        bit_rev(CFFT_In, Tn);


        // IFFT 计算
        DSPF_sp_icfftr2_dif(CFFT_In, Cw, Tn);
        memcpy(CFFT_Out, CFFT_In, 2*Tn*sizeof(float));

        for(i=0;i<Tn;i++)
        {
                CFFT_Out[i]=CFFT_Out[i]/Tn;
        }


}

回复

使用道具 举报

3

主题

4

帖子

1035

积分

金牌会员

Rank: 6Rank: 6

积分
1035
 楼主| 发表于 2017-10-21 16:44:03 | 显示全部楼层
上面是小弟的程序 !
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-19 18:45 , Processed in 0.037613 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表