比较简单的~算是个半成品,还要和TDA2030功放机结合的~
源程序:
/*
* MusicSpectrum.c
*
* Created: 2013/4/30 19:34:05
* Author: 詹磊
*/
#include
#include
#include "../Include/main.h"
#include "../Include/ADC.h"
#include "../Include/TFT.h"
#include "../Include/FFT.h"
compx Data[16];
void DrawingColumnar(uchar x,uchar y,uchar Wide,uchar High,int Data,int FullData,uint ColumnarColor)
{
uint i,tempData1,tempData2;
uchar tempData;
tempData=High-(uint)High*Data/FullData;
tempData1=tempData*Wide;
tempData2=((uint)High)*Wide;
y=159-y;
TFT_RamAddSet(x,y-High,x+Wide-1,y);
for (i=0;i
{
TFT_WriteByteDAT(BackgroundColor>>8); //高八位
TFT_WriteByteDAT(BackgroundColor); //低八位
}
for (i=tempData1;i
{
TFT_WriteByteDAT(ColumnarColor>>8); //高八位
TFT_WriteByteDAT(ColumnarColor); //低八位
}
}
int main(void)
{
uint temp;
uchar i;
ADCInit();
TFT_Init();
FFT_Init();
TFT_putstr(0,0,"--ZHAN LEI--n--MusicSpectrum--n--2013/04/30--",DataRed);
while(1)
{
if (
time==0)
{
for (i=0;i<16;i++)
{
///*
Data[i].real=255+sin(PI*2*i/FFT_N)*20
+sin(PI*2*i/FFT_N*2)*40
+sin(PI*2*i/FFT_N*3)*80
+sin(PI*2*i/FFT_N*4)*120
+sin(PI*2*i/FFT_N*5)*110
+sin(PI*2*i/FFT_N*6)*100
+sin(PI*2*i/FFT_N*7)*90
+sin(PI*2*i/FFT_N*7.9)*20;
//*/
Data[i].imag=0;
/*
Data[i].real=(ADC_Buffer[i]-448)<<3;
*/
}
FFT(Data);
for (i=0;i<16;i++)
{
DrawingColumnar(8*i,0,2,63,Data[i].real,1023,DataGreen);
}
ADCSRA |=(1<
}
}
}
/*
* FFT.h
*
* Created: 2013/5/1 0:15:37
* Author: zhanddkk
*/
#ifndef FFT_H_
#define FFT_H_
#include "../Include/main.h"
#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值
#define FFT_N 16 //频谱分数
#define FFT_m 4 //最大级数(2^FFT_m=FFT_N)
typedef struct COMPX
{
float real;
float imag;
}compx;
extern void FFT_Init();
extern void FFT(compx *xin);
#endif /* FFT_H_ */
/*
* FFT.c
*
* Created: 2013/5/1 0:16:05
* Author: zhanddkk
*/
#include
#include "../Include/FFT.h"
float sin_tab[FFT_N],cos_tab[FFT_N];
//-------------------------------------------//
//函数名:FFT初始化函数
//入口:void
//出口:void
//功能:建立sin()、cos()表
//-------------------------------------------//
void FFT_Init()
{
uchar i;
for (i=0;i
{
sin_tab[i]=sin(PI*2*i/FFT_N);
cos_tab[i]=cos(PI*2*i/FFT_N);
}
}
//-------------------------------------------//
//函数名:FFT运算函数
//入口:compx *xin:需要计算的FFT数据表结构体指针
//出口:void
//功能:FFT运算,最后得到峰值功率频谱
//-------------------------------------------//
void FFT(compx *xin)
{
uchar i,j=0,k;
uchar L,b,p;
uchar Nv2,Nm1;
float TR,TI;
//float tempData;
float tempData_rc,tempData_is,tempData_rs,tempData_ic;
float t;
Nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
Nm1=FFT_N-1;
//--倒序运算--//
for(i=0;i
{
if(i
{
t=xin[j].real;
xin[j].real=xin[i].real;
xin[i].real=t;
}
k=Nv2;
while(k<=j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
//--基2的FFT蝶形运算--//
for (L=1;L<=FFT_m;L++) /* Loop_1 L是L级蝶形运算 (2^FFT_m=FFT_N)*/
{
b=1<<(L-1); /* b=2^(L-1) b是进行蝶形运算的两个数据的距离 */
for (j=0;j
{
p=1<<(FFT_m-L); /* p=2^(FFT_m-L) 旋转因子计算 */
p*=j;
for (k=j;k
{
TR=xin[k].real;
TI=xin[k].imag;
tempData_rc=xin[k+b].real*cos_tab[p];
tempData_is=xin[k+b].imag*sin_tab[p];
tempData_rs=xin[k+b].real*sin_tab[p];
tempData_ic=xin[k+b].imag*cos_tab[p];
/*
tempData=xin[k+b].real;
xin[k].real=xin[k].real+xin[k+b].real*cos_tab[p]+xin[k+b].imag*sin_tab[p];
xin[k].imag=xin[k].imag-xin[k+b].real*sin_tab[p]+xin[k+b].imag*cos_tab[p];
xin[k+b].real=TR-xin[k+b].real*cos_tab[p]-xin[k+b].imag*sin_tab[p];
xin[k+b].imag=TI+tempData*sin_tab[p]-xin[k+b].imag*cos_tab[p];
*/
///*
xin[k].real=xin[k].real+tempData_rc+tempData_is;
xin[k].imag=xin[k].imag-tempData_rs+tempData_ic;
xin[k+b].real=TR-tempData_rc-tempData_is;
xin[k+b].imag=TI+tempData_rs-tempData_ic;
//*/
}
}
}
//--功率峰值计算--//
for (i=0;i
{
xin[i].real=sqrt(xin[i].real*xin[i].real+xin[i].imag*xin[i].imag);
}
}
15
评分
-
参与人数1 |
威望+10 |
+10 |
积分+20 |
收起理由 |
电子眼 |
+ 10 |
+ 10 |
+ 20 |
原创技术先锋,加分鼓励! |
查看全部评分
|