网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  TMS320LF2407上实现快速傅里叶变换(FFT)         ★★★ 【字体:
TMS320LF2407上实现快速傅里叶变换(FFT)
作者:Free    文章来源:Free    点击数:    更新时间:2007-12-12    

FFT的程序代码
1)主程序
#include                   "f2407_c.h"
#include                   "math.h"
#define             N            32                 //    FFT
变换的点数  
extern                   void   fft(void)
      
extern                   void   resave(void)
  
interrupt                  void  phantom(void)
  
void                    sysinit(void)

extern                  int input[2*N]
           //    输入数据的存储数组
int                    indati[N]={0}
         
//    -----------------------------------------------------------------------------------
//    128
FFT所需的数据
//   
采样函数: x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t)
//    f=50Hz
//    -----------------------------------------------------------------------------------
/*    int indatr[N]={16394
158711442512398 10276    8584    7767    8088    9557    11913    14660    17155    18724    18802    17044    13411    8197   1995   -4389   -10071   -14231   -16255   -15844   -13057   -8309   -2296   4125    10079    14819    17843    18969    18342    16394   13739    11055    8950    7848   7921    9070    10961    13110    14992    16159    16334   5479    13792    11675    9640    8197    7741    8457    10264    12815    15554    17812   18939    18429    16034    11825    6203   -156   -6405   -11662   -15165   -16394   -15165   -11662   -6405   -156    6203    11825    16034    18429    18939    17812    15554    12815   10264    8457    7741   8197    9640    11675    13792    15479    16334    16159    14992  13110    10961    9070   7921    7848    8950    11055    13739    16393    18342    18969   17843    14819    10079   4125   -2296   -8309   -13057   -15844   -16255   -14231   -10071   -4389    1995    8197    13411    17044    18802    18724    17155    14660    11913    9557   8088    7767    8584    10276    12398    14425    15871            
}
*/
//   -----------------------------------------------------------------------------------
//   32
FFT所需的数据
//   
采样函数: x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t)
//   f=50Hz
pi=π
//   -----------------------------------------------------------------------------------
/*  int indatr[N]={16384
10270    9551    18713    8192   -14222   -8304    14810    16384    7843    13102 15469    8192    12807    18418   -0156   -16384   -0156    18418    12807    8192    1546913102    7843    16383    14810   -8304   -14222    8192    18713    9551    10270  
}
*/
int indatr[N]={0x07ff
0x07ff    0x07ff    0x07ff   0x07ff 0x07ff 0x07ff    0x07ff    0x07ff   0x07ff    0x07ff 0x07ff    0x07ff    0x07ff    0x07ff   0x07ff   0x0F801 0x0F801    0x0F801    0x0F801   0x0F801    0x0F8010x0F801    0x0F801   0x0F801    0x0F801   0x0F801   0x0F801   0x0F801    0x0F801    0x0F801    0x0F801
}
       
//   -----------------------------------------------------------------------------------
//    64
FFT所需的数据
//   
采样函数: x=1/4+1/4cos(3*2*pi*f*t)+1/4cos(6*2*pi*f*t)+1/4cos(9*2*pi*f*t)
//   f=50Hz
//   -----------------------------------------------------------------------------------
/*    int indatr[N]={16384
   14416    10270    7762    9551    14651    18713    17034    8192   -4387   -14222-15834   -8304    4123    14810    18957    16384    11049    7843    9064    13102    16149   15469    11668    8192    8452    12807    17801    18418    11818   -0156   -11655   -16384   -11655   -0156    11818    18418    17801    12807    8452    8192    11668    15469    16149  13102    9064    7843    11049    16383    18957    14810    4123   -8304   -15834   -14222     -4387    8192    17034    18713    14651    9551    7762    10270    14416     }*/
//   ---------------------------------------------------------------
//    128
FFTsin cos值存储表
//   ---------------------------------------------------------------
/*    const int sintab[N]={0x07fff
0x00x07fd90x0f9b90x07f620x0f3750x07e9d0x0ed38
                0x07d8a
0x0e7080x07c2a0x0e0e70x07a7d0x0dad80x078850x0d4e1
                0x07642
0x0cf050x073b60x0c9460x070e30x0c3aa0x06dca0x0be32
                0x06A6C
0x0B8E40x066CE0x0B3C10x062F10x0AECD0x05ED60x0AA0C
                0x05A81
0x0A57F0x055F40x0A12A0x051330x09D0F0x04C3F0x09932
                0x0471C
0x095940x041CD0x092370x03C560x08F1F0x036B90x08C4B
                0x030FB
0x089C00x02B1E0x0877D0x025270x085840x01F190x083D7
                0x018F8
0x082770x012C70x081640x00C8B0x0809F0x006470x08029
                0x00000
0x080010x0F9B90x080290x0F3750x0809F0x0ED390x08164
                0x0E708
0x082770x0E0E70x083D70x0DAD90x085840x0D4E20x0877D
                0x0CF05
0x089C00x0C9470x08C4B0x0C3AA0x08F1F0x0BE330x09237
                0x0B8E4
0x095940x0B3C10x099320x0AECD0x09D0F0x0AA0C0x0A12A
                0x0A57F
0x0A57F0x0A12A0x0AA0C0x09D0F0x0AECD0x099320x0B3C1
                0x09594
0x0B8E40x092370x0BE330x08F1F0x0C3AA0x08C4B0x0C947
                0x089C0
0x0CF050x0877D0x0D4E20x085840x0DAD90x083D70x0E0E7
                0x08277
0x0E7080x081640x0ED390x0809F0x0F3750x080290x0F9B9
}
*/
//   ---------------------------------------------------------------
//   64
FFTsin cos值存储表
//   ---------------------------------------------------------------                       
/*    const int sintab[N]={        0x7FFF
0x00000x7F61 0xF375 0x7D89 0xE708 0x7A7C 0xDAD90x7640 0xCF05 0x70E1 0xC3AA 0x6A6C 0xB8E4 0x62F1 0xAECD
0x5A81
0xA57F 0x5133 0x9D0F 0x471C 0x9594  0x3C56  0x8F1F
0x30FB
0x89C0 0x2527 0x8584 0x18F8 0x8277 0x0C8B 0x809F
0x0000
0x8001 0xF375 0x809F 0xE708 0x8277 0xDAD9 0x8584
0xCF05
0x89C0 0xC3AA 0x8F1F 0xB8E4 0x9594 0xAECD 0x9D0F
0xA57F
0xA57F 0x9D0F 0xAECD 0x9594 0xB8E4 0x8F1F 0xC3AA
0x89C0
0xCF05 0x8584 0xDAD9 0x8277 0xE708 0x809F 0xF375 }*/
//   ---------------------------------------------------------------
//   32
FFTsin cos值存储表
//   ---------------------------------------------------------------
const int sintab[N]={
                        0x7FFF
0x00000x7D890xE7080x76400xCF050x6A6C0xB8E4
                        0x5A81
0xA57F0x471C0x95940x30FB0x89C00x18F80x8277
                        0x0000
0x80010xE7080x82770xCF050x89C00xB8E40x9594
                        0xA57F
0xA57F0x95940xB8E40x89C00xCF050x82770xE708
}

extern int table128[]

extern int nom
                                                //   nom=1时, FFT 需要归一化处理
main()
{        int i
   
        double x=0
y
        nom=1
                                       //   需要归一化处理       
        sysinit()

        for(i=0
i<=255i++)   input=0          //   清除输入数据
resave()
                                 //    把原始的输入数据反序排列                  
        *PCDATDIR=(*PCDATDIR&0x0FF00)|0x01

        fft( )
                                     //    进行FFT运算  
        *PCDATDIR=*PCDATDIR&0x0FF00

}
void  interrupt  phantom(void)
{       
return

}               
void sysinit(void)
{       
*SCSR1=0x81FE

        *WDCR=0x0E8

        *IFR=0x0FF

        *IMR=0x0

        WSGR=0

        *MCRB=0

        *PCDATDIR=0x100

}
2)反序排列子程序
.def        _resave
//  
2时间抽取的128FFT算法需要定义的各量
//  N                .set        128                                       
//  
2时间抽取的64FFT算法需要定义的各量
//  N                .set        64                  
//  
2时间抽取的32FFT算法需要定义的各量  
N                .set        32                 
        .global        _resave
        .global        _input
        .global        _indatr
        .global        _indati
_resave

//-------------------------------------------------------------------
//  
C语言兼容的代码部分
// -------------------------------------------------------------------
                POPD        *+
                SAR                AR0
*+
                SAR                AR1
*
                LAR                AR0
*+AR3
// ------------------------------------------------------------------
//  
反序排列程序部分
//------------------------------------------------------------------
                LAR                AR2
#_input
                LAR                AR3
#_indatr
                LAR                AR0
#N
                LAR                AR4
#(N-1)
RESAV1       
LACC        *+
0AR2
                SACL        *BR0+
AR4
                BANZ        RESAV1
*-AR3
//-------------------------------------------------------------------
//  
C语言兼容的程序代码部分
//-------------------------------------------------------------------
                MAR                *
AR1
                SBRK        #2
                LAR                AR0
*-
                PSHD        *
                RET
3 FFT应用子程序
// -------------------------------------------------------------------------------------------------
//
函数名:        void         fft(void)
//
功能:实现3264128采样点的快速傅立叶变换
//
入口条件:       
//        _sintab               
存放FFT运算中用到的sincosin函数值
//        _input               
存放FFT运算中用到的数据,包括实部和虚部,按二进制反序排列
//                               
注意:由于“*BR0+”间接寻址方式对_input的地址有特殊的要求,
//                               
所以最好将数组_input放置在一个独立的块中,如B1块。
//        _nom                       
_nom=0时,本函数将不对运算结果进行归一化。反之,将对每
//                               
一步运算结果进行归一化处理,避免溢出,但是,它会使运算精度降低。
//         N                        
常数,参与FFT运输的点数,用户可根据需要选择,例如,需要进行128
//                                 FFT
时,请在本函数中做出如下选择:
//        N        .set        128
//        M        .set        7
//       
依此类推。
//       
出口条件:
//        _input               
存放FFT的运算结果
//       
本函数可供C调用,请用户在C主程序中作以下声明:
//        extern        void fft(void)

//        const                int sintab[N]={...}
                N1286432
//        extern        int _input[2*N]

//        extern        int nom

//--------------------------------------------------------------------------------------------------
        .def        _        fft
//
2时间抽取的128FFT算法需要定义的各量
// N                .set        128                                 //
点数
// M                .set        7                                    //  N=2**M
//
2时间抽取的64FFT算法需要定义的各量
// N                .set        64                        //
点数
// M                .set        6                         // N=2**M
//
2时间抽取的32FFT算法需要定义的各量
N                .set        32                        //
点数
M                .set        5                         // N=2**M
_input        .usect  ".data0"
2*N             //   输入数据      
//                   .bss        _sintab
N                     //   SINCOSIN函数的存储表                               
                .bss        _nom
1            //    _nom=1时, FFT需要归一化处理,为0时则不需要
                .global        _fft
                .global        _sintab
                .global        _input
                .global _nom
                .text     
_fft
   
//   --------------------------------------
//   
C语言兼容的代码部分
//   --------------------------------------
                   POPD        *+                           //   
存储返回地址ADDRESS
                   SAR                AR6
*+                  //   存储 AR6
                   SAR                AR7
*+                  //   存储 AR7
                   SAR                AR0
*+                  //   存储 AR0
                   SAR                AR1
*                   //   堆栈分布情况:ADDRESS/AR6/AR7/AR0/AR1
                                                                //   ARP=AR1
AR1AR1
                   LAR                AR0
#08h           
                   LAR                AR3
*0+AR3           //   AR3FP SP=SP+size(size=frame的长度)
                                                             //   ARP=AR3
                   LAR                AR2
*                     //   AR2AR1
                   LAR                AR7
#_nom                //   AR7 指向 _nom
//   -----------------------------------------
//   
初始化一些寄存器
//   -----------------------------------------                
                SPLK        #(N-1)
*+                        
                SPLK        #(M-1)
*+                          
                                                             //   
堆栈分布情况:ADDRESS/AR6/AR7
//   /AR0/N/M/Y(
其中Y为没有确定的量)
                                                             //   ARP=AR3
AR2N AR3Y
                SPLK        #1
*+AR2                            //   ID=1ARP=AR2
                                                             //   
堆栈分布情况:ADDRESS/AR6/AR7/AR0/                                                                                //   N/M/ID/Y    ARP=AR2 AR2N AR3
//   -----------------------------------------
//   FFT
运算处理部分
//   -----------------------------------------                                                                       
                SETC        OVM                                      //   
使能溢出模式
                SETC        SXM                                          //   
符号扩展使能
                SPM        1                                  //   PREG
寄存器的输出左移一位,
//   
自动将两个Q15相乘后化为Q15的格式
                LACC        *+
AR3
                ADD        #1
                SACL        *+
1AR2                //   IW=2*(N+1)
                                                                //   
堆栈分布情况:ADDRESS/AR6/AR7
                                                             //   /AR0/N/M/ID/IW/Y   
//   ARP
AR2 AR2M AR3Y
                LAR            AR5
*+                         //   AR5=MARPAR2 AR2ID
//   AR3
Y AR5=M
LOOP3         
                LAR         AR6
#_input                     //   AR6input-->Ri ARPAR2
//   AR2
ID AR3Y AR5=M AR6input  
                LACC        *
1
                SACL    *+                                //   ID=ID*2
ARPAR2AR2IW
//    AR3
Y AR5=M AR6input
          LACC        *
15
          SACH        *                                 //   IW=IW/2
          LACC        *-
15AR3
          SACH        *+
AR2                      //   C2=IW/2
//   
堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
//   ARP
AR2 AR2ID AR3Y AR5=M AR6input
                 LAR        AR0
*                         //   AR0=ID
LOOP2       
                  LAR        AR4
#_sintab                 //   AR4sintab
//  ARP
AR2AR0=IDAR2ID AR3Y AR4sintab AR5=M AR6input
                      LACC         *+
15AR3
                      SACH         *+
AR6            //   C1=ID/2=1
//   
堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/Y
//  ARP
AR6 AR0=ID AR2IW AR3Y AR4sintab AR5=M AR6input
                    MAR        *0+
AR4                               
//  ARP
AR4AR0=IDAR2IWAR3YAR4sintabAR5=MAR6=AR6+ID-->Rj
LOOP1       
LACC         #0
                LT        *+
AR6                  //   TREG=COSαlk
MPY        *+
AR4                           //   Rj* COSαlkARP=AR4AR4SINαlkAR6Ij
                 LT                *
AR6
                 MPYA         *-
AR3                      //   ACC=ACC+Rj*COSαlk PREG=Ij*SINαlk
                                                              //   ARP=AR3
AR4SINαlk AR6 Rj
                 SPAC                                      //   ACC=ACC-Ij*SINαlk
                 SACH    *+
AR4                      //   XT=Rj*COSαlk-Ij*SINαlk
//   
堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/Y
//   ARP
AR4 AR0=ID AR2IW AR3Y AR4SINX AR5=M AR6Q.X
                  LACC        #0
                  LT                *-
AR6
                  MPY                *+
AR4                          //   Rj*SINαlkARP=AR4AR4COSαlkAR6Ij
                  LT                *
AR6
                  MPYA        *-
AR3                           //   ACC=ACC+Rj*SINαlk PREG=Ij*COSαlk
                                                                    //   ARP=AR3
AR4COSαlk AR6Rj
                  APAC       
                  SACH        *-
AR7                          //   YT=Rj*SINαlk+Ij*COSαlk
//   
堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
//   ARP
AR7 AR0=ID AR2IW AR3XT AR4COSX AR5=M AR6Q.X
                LACC        *
AR6
                BCND        D2
NEQ                       //   _nom不为0时,需要在运算过程中进
//   
行归一化操作
//   ----------------------------------------
//   
不进行归一化操作程序部分
//   ----------------------------------------
                MAR                *0-                                  //   AR6=AR6-ID-->Ri
                LACC        *
AR3
                ADD                *
AR6
                SACL        *0+
AR3                          //   Ri=Ri+XT
//   ARP
AR3 AR0=ID AR2IW AR3XT AR4COSαlk AR5=M AR6Rj
                SUB                *+
1AR6
                SACL        *+                                  //   Rj= Ri+XT -XT*2=Ri-XT
AR6Ij AR3YT
//   ARP
AR6 AR0=ID AR2IW AR3YT AR4COSαlk AR5=M AR6Ij
                MAR                *0-                                 //   AR6
Ii
                LACC        *
AR3               
                ADD                *-
AR6
                SACL        *0+
AR3                          //   Ii= Ii +YT AR6Ij
//   ARP
AR3 AR0=ID AR2IW AR3XT AR4COSαlk AR5=M AR6Ij
                SUB                *
1AR6                               
                SACL        *+
0AR2              //   Ij= Ii +YT -YT*2=Ii-YT
//   STACK
ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
//   ARP
AR2AR0=IDAR2IWAR3XTAR4COSαlkAR5=MAR6NEXT Rj
                B                D                    //   AR6
指向下一个Rj
//   ---------------------------------------
//   
归一化处理程序部分
//   ---------------------------------------
D2                MAR                *0-                                  //   AR6-->Ri
                LAC                *
15AR3
                ADD                *
15AR6                               
                SACH        *0+
AR3                           //   Ri =( Ri +XT)/2
//   ARP
AR3 AR0=ID AR2IW AR3XT AR4COSαlk AR5=M AR6Rj       
            SUB                *+
16AR6
                SACH        *+                                   //   Rj=Ri-XT
AR6Ij AR3YT
//  ARP
AR6 AR0=ID AR2IW AR3YT AR4COSαlk AR5=M AR6Ij
                MAR                *0-                                   //   AR6
Ii
                LACC        *
15AR3
                ADD                *
15AR6
                SACH        *0+
AR3              //   Ii=(Ii+YT)/2 AR6Ij
//  ARP
AR3 AR0=ID AR2IW AR3YT AR4COSαlk AR5=M AR6Ij
                SUB                *-
16AR6
                SACH        *+
0AR2                    //   Ij=Ii-YT
//   STACK
ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
//   ARP
AR2AR0=IDAR2IWAR3XTAR4COSαlkAR5=MAR6:下一个Rj
D               
LAR                AR0
*-AR4                    //   AR0=IW
//  ARP=AR4
AR0=IW AR2ID AR3XT AR4COSαlk AR5=MAR6:下一个Rj
                MAR                *0+
AR2                            //   AR4=AR4+IW-->下一个COSαlk
                LAR                AR0
*                            //   AR0=ID
                ADRK        #3                                    //   AR2
C1
//  ARP=AR2
AR0=ID AR2C1 AR3XT AR4: 下一个COSαlk AR5=M AR6Rj
            LACC        *
            SUB                #1
            SACL        *-                                            //   C1=C1-1
//   ARP=AR2
AR0=ID AR2C2 AR3XT AR4COSαlk AR5=M AR6Rj
                   BCND        LOOP4
LEQ                    //   跳转至LOOP4 IF C1<0
                   MAR                *-
AR4                            //   AR2IW
//   ARP=AR4
AR0=ID AR2IW AR3XT AR4: 下一个COSαlk AR5=M AR6Rj
                   B                LOOP1               
LOOP4        LACC        *
                SUB                #1
                SACL        *-
AR3
                MAR     *-
AR2                               
//   ARP=AR2
AR0=ID AR2IW AR3C1 AR4: 下一个COSαlk AR5=M AR6Ri
                MAR                *-
        BCND        LOOP2
GT
        MAR     *
AR3
        MAR                *-
AR5              
//   ARP=AR5
AR0=ID AR2IW AR3C2 AR4下一个COSαlk AR5=M AR6Ri
        BANZ        LOOP3
*-AR2
//   ------------------------------------
//   
C语言兼容的代码部分
//   ------------------------------------
           CLRC        OVM
           SPM                0           
        MAR                *
AR1
        SBRK        #09
        LAR                AR0
*-
        LAR                AR7
*-
        LAR                AR6
*-
        PSHD        *
        RET

TMS320LF2407上实现快速傅里叶变换(FFT):点击下载

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于TMS320LF2407的馈线终端…
    TMS320LF2407控制GTG-128324…
    基于DSP的电动汽车CAN总线通…
    TMS320LF2407的将BCD码转换成…
    SVPWM,死区补偿,有电压电流A…
    基于TMS320LF2407的LCD的驱动…
    TMS320LF2407与D/A转换器的接…
    TMS320LF2407与MCG12864A8-3…
    TMS320LF2407与CAN驱动接口电…
    TMS320LF2407与TCS232接口电…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号