#include <stm32f10x_lib.h>
#include<math.h>
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
#include "fft.h"
#define FFT_N 128 //定义福利叶变换的点数
#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值
struct compx {float real,imag;}; //定义一个复数结构
struct compx s[FFT_N]; //FFT输入和输出:从S[0]开始存放,根据大小自己定义
float SIN_TAB[FFT_N/2]; //定义正弦表的存放空间
float mod[FFT_N]; //用于存放fft结果的模值
u16 adc_buffer[FFT_N];
u8 hight[32]; //用于存放矩形柱的高度值
//此函数的功能是将ADC转换来的整数值转换为电压值,然后存放到FFT缓存区s数组中
void adc_to_s()
{
u16 i;
for(i=0;i<FFT_N;i++) //给结构体赋值
{
s.real= (float)(adc_buffer*(3.3/4096));
s.imag=0; //虚部为0
}
}
//此函数的功能是将fft运算结果的模值转换成矩形柱的高度,用32个矩形柱来等间隔显示128点DFT值
void mod_hight()
{
u8 i;
for(i=0;i<32;i++)
hight=(u8)(mod[4*i]*100);
}
//显示矩形柱的高度
void display()
{
u8 i;
for(i=0;i<32;i++)
Show_rctgl(i, hight); //此函数是填充矩形柱,自定义
}
int main(void)
{
u16 adcx;
u16 num=0,i=0;
create_sin_tab(SIN_TAB);//创建正弦表
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LED_Init();
LCD_Init();
Adc_Init();
LCD_Clear(GBLUE);//清屏,每次清屏等效于设置背景色
  OINT_COLOR=BROWN;//设置字体为红色
while(1)
{
delay_us(5);
adcx=Get_Adc(ADC_CH0);
adc_buffer[num]=adcx;
num++; //每采样一次,num值自加一次,知道采样满128点
if(num==FFT_N)
{
num=0;
adc_to_s();//将ADC的值转换为电压值 存放到s的实部
FT(s);//做fft运算
for(i=0;i<FFT_N;i++) //求变换后结果的模值,存放于mod数组中
mod=sqrt(s.real*s.real+s.imag*s.imag);
mod_hight();//将傅里叶变换后的幅度模值转换为彩色立柱的高度
LCD_Clear(GBLUE);//清屏,每次清屏等效于设置背景色
display();//显示矩形柱
delay_ms(100);
LED0=!LED0;
}
}
}
|