我从网上找了一个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)
{
}
}
|