This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教 DSP FFT库到底怎么调用啊~

Other Parts Discussed in Thread: CCSTUDIO3

请教 DSP FFT库到底怎么调用啊~

需要准备些什么?调用什么函数呢

只用DSPF_sp_bitrev_cplx 和DSPF_sp_cfftr2_dit 这个就可以了?

DSPF_sp_bitrev_cplx 中的index数组是怎么得到的啊?

  • tw_genr2fft(wd,N); // 产生旋转因子
    bit_rev1(wd, N>>1); // 把系数倒置,为下面函数输入准备
    DSPF_sp_cfftr2_dit(xd, wd, N); //计算该FFT,需要先调用上面两个函数
    bit_rev1(xd,N); //输出是倒置的,所以重新倒置为正常

    这么用的,你试一下。

  • 谢谢

    可是我用的DSPLIB 3.1.1中没有您说的那个函数啊

    tw_genr2fft(wd,N); // 产生旋转因子

    bit_rev1(wd, N>>1); // 把系数倒置,为下面函数输入准备

     

     

  • 我用的是C67XDSPLIB_200,芯片是C6713,这个里面是这样用的,不知道你用的那款芯片,上面的那2个函数是在安装路径下面的SUPPORT目录下面的,不包含在库文件里面。

  • SUPPORT?能否具体说下呢

    我看到 C:\ti\dsplib_c674x_3_1_1_1\examples\fft_example_sp.c 是这样调用的

    gen_twiddle_fft_sp(w_sp, N);

    DSPF_sp_fftSPxSP(N, x_sp, w_sp, y_sp, brev, 4, 0, N);

     

    brev是单独写出来的

     

    unsigned char brev[64] = {

        0x0, 0x20, 0x10, 0x30, 0x8, 0x28, 0x18, 0x38,

        0x4, 0x24, 0x14, 0x34, 0xc, 0x2c, 0x1c, 0x3c,

        0x2, 0x22, 0x12, 0x32, 0xa, 0x2a, 0x1a, 0x3a,

        0x6, 0x26, 0x16, 0x36, 0xe, 0x2e, 0x1e, 0x3e,

        0x1, 0x21, 0x11, 0x31, 0x9, 0x29, 0x19, 0x39,

        0x5, 0x25, 0x15, 0x35, 0xd, 0x2d, 0x1d, 0x3d,

        0x3, 0x23, 0x13, 0x33, 0xb, 0x2b, 0x1b, 0x3b,

        0x7, 0x27, 0x17, 0x37, 0xf, 0x2f, 0x1f, 0x3f

    };

    函数 gen_twiddle_fft_sp 是另外写的

    /* Function for generating Specialized sequence of twiddle factors */

    void gen_twiddle_fft_sp (float *w, int n)

    {

        int i, j, k;

        double x_t, y_t, theta1, theta2, theta3;

        const double PI = 3.141592654;

        for (j = 1, k = 0; j <= n >> 2; j = j << 2)

        {

            for (i = 0; i < n >> 2; i += j)

            {

                theta1 = 2 * PI * i / n;

                x_t = cos (theta1);

                y_t = sin (theta1);

                w[k] = (float) x_t;

                w[k + 1] = (float) y_t;

                theta2 = 4 * PI * i / n;

                x_t = cos (theta2);

                y_t = sin (theta2);

                w[k + 2] = (float) x_t;

                w[k + 3] = (float) y_t;

                theta3 = 6 * PI * i / n;

                x_t = cos (theta3);

                y_t = sin (theta3);

                w[k + 4] = (float) x_t;

                w[k + 5] = (float) y_t;

                k += 6;

            }

        }

    }

     

     

    他给的这个例程是不是对所有C6000都是通用的~

    gen_twiddle_fft_sp(w_sp, N);和brev数组不知道是通用的么?

     

     

    我用的是OMAPL138,里面的DSP是C6748的~

    你说的那个方法在 C6713测试通过了吧 能不能给个例子呢?

  • 我用的这个库是在C6713下面实现的,是可以用的,用法如下

    tw_genr2fft(wd,N); // 产生旋转因子
    bit_rev(wd, N>>1); // 把系数倒置,为下面函数输入准备
    DSPF_sp_cfftr2_dit(xd, wd, N); //计算该FFT,需要先调用上面两个函数
    bit_rev(xd,N); //输出是倒置的,所以重新倒置为正常

    tw_genr2fft(wd,N),bit_rev(xd,N),这2个函数在D:\ccstudio3.3\c6700\dsplib\support\fft,这个路径下面,是单独用C语言写的,这个路径就是DSPLIB的安装路径,C6748没用过,不晓得这个库可不可以用。C6748好像和C6713有很大的不同了,连CSL库都没了,你试一试看行不行。C67xDSPLIB_v200.exe,这个库在官网有下载的。

  • (⊙o⊙)…  我用的CCSv5 都找不到那个目录~

    看来真的有很大不同

    没有CSL但是有个Startware的库 函数级的~不过外设库不是很全

     

    请问你一般是做多少点的FFT?FFT之前需要滤波什么的么?比如IIR或者FIR

  • 我们一般做2048,4096,8192,最大到16384个点的FFT,暂时没有加滤波,直接拿采集的数据做输入的。把得到的结果做指数平均得到的谱线会平滑很多,你可以试一试。C6748和C6713是有很多不同,本来要把C6713换成C6748的,最后太麻烦了,只能先用C6713了,这个产品换代了感觉都不会用了。。

  • 请帮忙看一下我的

    tw_genr2fft(w, Numlength);
    bit_rev(w,Numlength>>1);
    DSPF_sp_cfftr2_dit(Input,w,Numlength);
    bit_rev(Input,Numlength);

    我头文件用了#include "utility.h"    lib有dsp67x.lib但为什么显示这样的错误:

    undefined first referenced
    symbol in file
    --------- ----------------
    _bit_rev F:\CCS_Files\FFT_1\FFT\Debug\fft_6713.obj
    _tw_genr2fft F:\CCS_Files\FFT_1\FFT\Debug\fft_6713.obj

    >> Compilation failure  

    显示三个函数未定义,但在#include "utility.h"已经声明了呀 ,请指导一下

  • 会不会是路径不对呢?

    你选住那个函数,点击鼠标右键有个好像是打开函数的命令

    看看程序能否跳转到那个函数

  • 我把鼠标放函数上点击它弹出来的框可以跳转到utility.h文件的函数声明上,即

    void tw_genSPxSPfft(float * w, int n);
    void bit_rev(float* x, int n);
    void tw_genr2fft(float* w, int n);
    void tw_genr4fft(float *, int);
    void R4DigitRevIndexTableGen(int n, int * count, unsigned short *IIndex, unsigned short *JIndex);
    void digit_reverse(double *yx, unsigned short *JIndex, unsigned short *IIndex, int count);

    我的困惑是我用了DSPF_sp_cfftr2_dit()函数,添加了库文件DSPF_sp_cfftr2_dit.h,库文件只有声明,该函数不报错,但bit_rev()h和void tw_genr2fft()在库文件utility.h声明了却报错,是不是support文件里的库文件和include的库文件有很大区别?请专家指导一下,谢谢

  • penghui zhang 说:

    我把鼠标放函数上点击它弹出来的框可以跳转到utility.h文件的函数声明上,即

    void tw_genSPxSPfft(float * w, int n);
    void bit_rev(float* x, int n);
    void tw_genr2fft(float* w, int n);
    void tw_genr4fft(float *, int);
    void R4DigitRevIndexTableGen(int n, int * count, unsigned short *IIndex, unsigned short *JIndex);
    void digit_reverse(double *yx, unsigned short *JIndex, unsigned short *IIndex, int count);

    我的困惑是我用了DSPF_sp_cfftr2_dit()函数,添加了库文件DSPF_sp_cfftr2_dit.h,库文件只有声明,该函数不报错,但bit_rev()h和void tw_genr2fft()在库文件utility.h声明了却报错,是不是support文件里的库文件和include的库文件有很大区别?请专家指导一下,谢谢

    库函数里面应该只有DSPF_sp_cfftr2_dit()函数,至少6748是这样的~

    二进制位反转和旋转因子的生成函数需要自己写

    Ti的例程里面有

  • 我看了support文件里的例子,把二进制反转和旋转因子的生成函数自己复制过来了,可以编译通过,但运行时出现

    Trouble running Target CPU: *** Runtime error at PC = 00000994      

    Resource(s) L Unit Write Port on side B in conflict in E1 phase. Ref SPRU189F Sec 3.7, Sec 4.5, Sec 7.2  

    的错误,把Numlength大小改成128运行出现

    Trouble running Target CPU: Illegal opcode (c394a031) at pc = 0x00002328

    的错误,我看了Ref SPRU189F Sec 3.7, Sec 4.5, Sec 7.2  但是根本没有思路,自己理解是内存的问题,还是其他呢,能详细解答吗,谢谢!

  • 点数应该不是问题 TI 给的DSP C674X 的库 可以支持到 65536个点

    你能否发个截图呢?

  • 我用的是c6713,软件仿真,程序如下:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <DSPF_sp_cfftr2_dit.h>
    //#include <utility.h>


    # define PI 3.14159265358979323846
    # define Numlength 32

    void gen_w_r2(float* , int );
    void bit_rev(float* , int );

    void main()
    {
    int i;
    float w[Numlength];
    float Input[Numlength*2],Output[Numlength*2];


    for(i=0;i<Numlength;i++) //输入Input
    {
    Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
    Input[2*i+1]=0;
    }

    gen_w_r2(w,Numlength); //产生旋转因子

    // tw_genr2fft(w, Numlength); // 产生旋转因子
    bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
    DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
    bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
    for(i=0;i<(Numlength*2);i++)
    {
    Output[i]=Input[i];
    }
    while(1);
    }


    void gen_w_r2(float* w, int n)
    {
    int i, j=1;
    float pi = 4.0*atan(1.0);
    float e = pi*2.0/n;
    for(j=1; j < n; j <<= 1)
    {
    for(i=0; i < ( n>>1 ); i += j)
    {
    *w++ = cos(i*e);
    *w++ = -sin(i*e);
    }
    }

    }

    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;
    }
    }
    }

    东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢

  • penghui zhang 说:
    我用的是c6713,软件仿真,程序如下:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <DSPF_sp_cfftr2_dit.h>
    //#include <utility.h>


    # define PI 3.14159265358979323846
    # define Numlength 32

    void gen_w_r2(float* , int );
    void bit_rev(float* , int );

    void main()
    {
    int i;
    float w[Numlength];
    float Input[Numlength*2],Output[Numlength*2];


    for(i=0;i<Numlength;i++) //输入Input
    {
    Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
    Input[2*i+1]=0;
    }

    gen_w_r2(w,Numlength); //产生旋转因子

    // tw_genr2fft(w, Numlength); // 产生旋转因子
    bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
    DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
    bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
    for(i=0;i<(Numlength*2);i++)
    {
    Output[i]=Input[i];
    }
    while(1);
    }


    void gen_w_r2(float* w, int n)
    {
    int i, j=1;
    float pi = 4.0*atan(1.0);
    float e = pi*2.0/n;
    for(j=1; j < n; j <<= 1)
    {
    for(i=0; i < ( n>>1 ); i += j)
    {
    *w++ = cos(i*e);
    *w++ = -sin(i*e);
    }
    }

    }

    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;
    }
    }
    }

    东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢

    6713的例程里有没有要求变量要内存对齐呢?

    类似这样的

    #pragma DATA_ALIGN(CFFT_In,8);

    使用#pragma预编译命令

    我把我测试成功的DSP C6748的代码发上来你参考下哈

  • bin wang2 说:

    我用的是c6713,软件仿真,程序如下:

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <DSPF_sp_cfftr2_dit.h>
    //#include <utility.h>


    # define PI 3.14159265358979323846
    # define Numlength 32

    void gen_w_r2(float* , int );
    void bit_rev(float* , int );

    void main()
    {
    int i;
    float w[Numlength];
    float Input[Numlength*2],Output[Numlength*2];


    for(i=0;i<Numlength;i++) //输入Input
    {
    Input[2*i]=cos(PI*2*i/Numlength*3)*1024;
    Input[2*i+1]=0;
    }

    gen_w_r2(w,Numlength); //产生旋转因子

    // tw_genr2fft(w, Numlength); // 产生旋转因子
    bit_rev(w,Numlength>>1); //把系数倒置,为下面函数输入准备
    DSPF_sp_cfftr2_dit(Input,w,Numlength); ///计算该FFT,需要先调用上面两个函数
    bit_rev(Input,Numlength); //输出是倒置的,所以重新倒置为正常
    for(i=0;i<(Numlength*2);i++)
    {
    Output[i]=Input[i];
    }
    while(1);
    }


    void gen_w_r2(float* w, int n)
    {
    int i, j=1;
    float pi = 4.0*atan(1.0);
    float e = pi*2.0/n;
    for(j=1; j < n; j <<= 1)
    {
    for(i=0; i < ( n>>1 ); i += j)
    {
    *w++ = cos(i*e);
    *w++ = -sin(i*e);
    }
    }

    }

    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;
    }
    }
    }

    东西有点多,刚开始上论坛,写的很杂,见谅,请给点指导,谢谢

    6713的例程里有没有要求变量要内存对齐呢?

    类似这样的

    #pragma DATA_ALIGN(CFFT_In,8);

    使用#pragma预编译命令

    我把我测试成功的DSP C6748的代码发上来你参考下哈

    [/quote]

    工程中引用的函数

    原文件名 DSPF_sp_fftSPxSP.s

    原文件名 DSPF_sp_ifftSPxSP.s

  • 关于变量对齐的问题我在C6713的例程里没有,您给的这两个.s文件是汇编程序,我不知道如何调用,我把函数DSPF_sp_cfftr2_dit()自己用C在主函数之前重新定义,运行可以通过,问题就出在用库文件的DSPF_sp_cfftr2_dit()运行出错,您能不能推荐几个资料我看看,以下是我现在在看的资料,另外TI给的英文资料TMS320C67x_DSP_Library_Programmer's_Reference_Guide.pdf。谢谢您给我之前的帮助

    TMS320C67x_DSP_Library在程序开发中的应用.pdf
  • penghui zhang 说:

    关于变量对齐的问题我在C6713的例程里没有,您给的这两个.s文件是汇编程序,我不知道如何调用,我把函数DSPF_sp_cfftr2_dit()自己用C在主函数之前重新定义,运行可以通过,问题就出在用库文件的DSPF_sp_cfftr2_dit()运行出错,您能不能推荐几个资料我看看,以下是我现在在看的资料,另外TI给的英文资料TMS320C67x_DSP_Library_Programmer's_Reference_Guide.pdf。谢谢您给我之前的帮助

    直接声明函数名就可以了~

    你可以试试安装新版本的DSP库

    资料的话直接看DSP库自带的说明文档就好了

    不客气~

  • 我改用 DSPF_sp_fftSPxSP(Numlength,CFFT_In,w,CFFT_Out,brev,2,0,Numlength);这个函现在程序可以跑了,没有用C674X系列的板子,手头拿的是合众达的seed—dec6713,以前跑的出错是在void DSPF_sp_cfftr2_dit(float* , float* , int);的调用上,看了disassemble窗口,以前都停在类似:

    000030B0 AACED2C7 .word 0xaaced2c7
    000030B4 00000000 || NOP
    000030B8 38B504F2 .word 0x38b504f2
    000030BC AACED2C7 .word 0xaaced2c7
    000030C0 2ACED2C7 .word 0x2aced2c7
    000030C4 00000000 || NOP
    000030C8 46FA0000 .word 0x46fa0000
    000030CC 2ACED2C7 .word 0x2aced2c7

    这样的地方,换了函数能跑了,单找不到原因,lib的话我用的是最新的C67xDSPLIB_v200.exe,cmd文件也是照着Ti给的资料写的。

    我第一次用这个论坛,遇到好人了,十分感谢!!!!!

  • penghui zhang 说:

    我改用 DSPF_sp_fftSPxSP(Numlength,CFFT_In,w,CFFT_Out,brev,2,0,Numlength);这个函现在程序可以跑了,没有用C674X系列的板子,手头拿的是合众达的seed—dec6713,以前跑的出错是在void DSPF_sp_cfftr2_dit(float* , float* , int);的调用上,看了disassemble窗口,以前都停在类似:

    000030B0 AACED2C7 .word 0xaaced2c7
    000030B4 00000000 || NOP
    000030B8 38B504F2 .word 0x38b504f2
    000030BC AACED2C7 .word 0xaaced2c7
    000030C0 2ACED2C7 .word 0x2aced2c7
    000030C4 00000000 || NOP
    000030C8 46FA0000 .word 0x46fa0000
    000030CC 2ACED2C7 .word 0x2aced2c7

    这样的地方,换了函数能跑了,单找不到原因,lib的话我用的是最新的C67xDSPLIB_v200.exe,cmd文件也是照着Ti给的资料写的。

    我第一次用这个论坛,遇到好人了,十分感谢!!!!!

    客气了 大家互相学习罢了

    建议关注下Ti的wiki

    C674x DSPLIB 函数详解

    http://processors.wiki.ti.com/index.php/C674x_DSPLIB

    C674x_DSPLIB 已知问题 这里就说了一些库函数使用上需要注意的问题

    http://processors.wiki.ti.com/index.php/C674x_DSPLIB_Known_Issues#DSPF_sp_fftSPxSP_Only_Supports_n_.3C.3D_8K

    高效实数FFT

    http://processors.wiki.ti.com/index.php/Efficient_FFT_Computation_of_Real_Input

    C6000 DSP除了外设其它差异不大 你也可以参考下