OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5905|回复: 7

求一个STM32板子上能跑的FFT代码

[复制链接]

14

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-2-22
在线时间
0 小时
发表于 2014-3-17 18:38:16 | 显示全部楼层 |阅读模式
我从网上找了一个fft的代码,改了改贴进了我的程序里,结果数组开到1000的时候,向单片机里烧写就不行了,数组改到256就能跑了,听别人说数组是可以开到1000的,于是我就怀疑自己的代码了,所以,想求一个FFT代码。。。。。另外附上我的代码,有大神愿意帮我看看的话我就感激不尽了。。。
#include "stm32f10x.h"
#include"stdio.h"
#include"math.h"

#define maxn 1025

typedef   struct
{
    double    real;
    double    img;
} complex;

double  VolValue = 0.00; /* ×????á???????????????? */
u32 count = 0; /* ADC???????±???? */
double    pp[maxn];
u32 i,j;


complex   x[maxn],   W[maxn];/*??????*/
u32   size_x=256;/*???????,??2?N??*/
double    I=3.1415926;

void RCC_Configuration(void);  //?±?????????????????è?±??;
void GPIO_Configuration(void);  //IO????????????????????
void USART_Configuration(void);

void tim4(void);  //?¨?±?÷tim4??????????
void nvic(void);  //????????????????
void exti(void);  //????????????

/*FFT?à???ù?÷*/

void   fft(); /*???????*/
void   initW();
void   change();
void   add(complex   ,complex   ,complex   *);   /*????*/
void   mul(complex   ,complex   ,complex   *);   /*????*/
void   sub(complex   ,complex   ,complex   *);   /*????*/
void   divi(complex   ,complex   ,complex   *);/*????*/

////////////////////////////////////////////////////////////////////////////////////////////
void   initW()
{
    int   i;
  //  W=(complex   *)malloc(sizeof(complex)   *   size_x);
    for(i=0; i<size_x; i++)
    {
        W.real=cos(2*PI/size_x*i);
        W.img=-1*sin(2*PI/size_x*i);
    }
}

void   change()
{
    complex   temp;
    u32   i=0,j=0,k=0;
    double    t;
    for(i=0; i<size_x; i++)
    {
        k=i;
        j=0;
        t=(log(size_x)/log(2));
        while(   (t--)>0   )
        {
            j=j<<1;
            j|=(k   &   1);
            k=k>>1;
        }
        if(j>i)
        {
            temp=x;
            x=x[j];
            x[j]=temp;
        }
    }
}

void   add(complex   a,complex   b,complex   *c)
{
    c->real=a.real+b.real;
    c->img=a.img+b.img;
}

void   mul(complex   a,complex   b,complex   *c)
{
    c->real=a.real*b.real   -   a.img*b.img;
    c->img=a.real*b.img   +   a.img*b.real;
}
void   sub(complex   a,complex   b,complex   *c)
{
    c->real=a.real-b.real;
    c->img=a.img-b.img;
}
void   divi(complex   a,complex   b,complex   *c)
{
    c->real=(   a.real*b.real+a.img*b.img   )/(
                b.real*b.real+b.img*b.img);
    c->img=(   a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img);
}

void   fft()
{
    int   i=0,j=0,k=0,l=0;
    complex   up,down,product;
    change();
    for(i=0; i<   log(size_x)/log(2)   ; i++)
    {
        l=1<<i;
        for(j=0; j<size_x; j+=   2*l   )
        {
            for(k=0; k<l; k++)
            {
                mul(x[j+k+l],W[size_x*k/2/l],&product);
                add(x[j+k],product,&up);
                sub(x[j+k],product,&down);
                x[j+k]=up;
                x[j+k+l]=down;
            }
        }
    }
}




void RCC_Configuration(void)  //???????????????è?±????±????????à?????±??
{
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1, ENABLE);   //????APB2???????è???±????°ü?¨GPIOA, ?????????±??AFIO????
                                                                              //????°ü?¨?????è???ê???????????á??×?
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //????APB1???????è???±?????¨?±?÷tim4?????????è?ê?????á

}


void GPIO_Configuration(void)  //??????io???????????±??????±???????????????
{
   GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOC , &GPIO_InitStructure);


    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //?§??STM32 JTAG????????????????SWD????????????·???PA15??PB????·?IO??
}


void ADC_Configuration(void)
{
/* ?¨?? ADC ???????á???? ADC_InitStructure */
ADC_InitTypeDef ADC_InitStructure;
/* ????ADC?±??·??? */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ?è?? ADC1 ????1×????¨????×??????ò1?????ù?±???? 55.5 ???? */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
/* ???? ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* ???? ADC1 ????×??????÷ */   
ADC_ResetCalibration(ADC1);
/* ???? ADC1 ??×??????÷?????ê?? */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ???? ADC1 ??×? */
ADC_StartCalibration(ADC1);
/* ???? ADC1 ??×??ê?? */
while(ADC_GetCalibrationStatus(ADC1));
/* ???? ADC1 ×??? */ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

void tim3()   //????TIM3???ù±??¨?±?÷???? ????100kA
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   //?¨????????TIM_TimeBaseInitTypeDef???á????????×???TIM_TimeBaseStructure  

   TIM_TimeBaseStructure. TIM_Period =49;   //??????????????9???????±??×?????????????·?????
  TIM_TimeBaseStructure.TIM_Prescaler =71;    //  ?±???¤·????????????à??
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // ?±??·???±???
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // ????·??????ò??????

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  //  ??????tim3
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //????TIM3????????±ê??
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //  ????TIM3???????ü??????
    TIM_Cmd(TIM3,ENABLE);   //    ????TIM3
}


void nvic() //??????????????
{  
     NVIC_InitTypeDef NVIC_InitStructure;  //  //   ?ü??????????±???
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //??????????Group
     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 ?????ü??????
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// ?ò??????????1???????????à???????????????à???ò????·?
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  // ?ì????????1???????????????±???????????±???±??????????????
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
 
}




void TIM3_IRQHandler(void) //   //TIM3???????ü???????ì??????
{
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //  //  ????TIM3?????????ì??????±ê????
    if (count< size_x){
 //pp[count++] =   ADC_GetConversionValue(ADC1) ;
 pp[count++] =  3.3 * ADC_GetConversionValue(ADC1) / (0X0FFF+1);
}
else
for (i=0;i<size_x;i++)
x.real=pp;
x.img=0.0;
}
initW();
        fft();
count=0;
}
}


int main(void)
{
  count = 0;
    RCC_Configuration();    
    GPIO_Configuration();
    ADC_Configuration();
  nvic(); 
  tim3();
  
 while(1) 
 {
 }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-2-22
在线时间
0 小时
 楼主| 发表于 2014-3-17 18:39:19 | 显示全部楼层
回复【楼主位】sys:
---------------------------------
嗯。。。忘了说了,这个代码是定时器中断控制采样,然后FFT
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-17 19:08:42 | 显示全部楼层
见附件

FFT.zip

6.16 KB, 下载次数: 592

回复 支持 反对

使用道具 举报

14

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-2-22
在线时间
0 小时
 楼主| 发表于 2014-3-17 21:45:24 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
回复【3楼】正点原子:
---------------------------------
原子哥,你看我代码里采样的方法可以吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-17 23:03:59 | 显示全部楼层
回复【4楼】sys:
---------------------------------
用定时器中断定时采样, 可以啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-2-22
在线时间
0 小时
 楼主| 发表于 2014-3-18 17:57:35 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
嗯,明白了多谢原子哥
回复 支持 反对

使用道具 举报

9

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2014-8-18
在线时间
52 小时
发表于 2014-11-16 17:03:25 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥的FFT能执行2048点吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 18:21:21 | 显示全部楼层
回复【7楼】FZH:
---------------------------------
没试过,你看下代码吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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