关于音乐频谱FFT程序的求助

2019-07-16 00:42发布

本帖最后由 Happy.Q 于 2013-5-12 09:28 编辑

sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;
sbit led4 = P2^4;
sbit led5 = P2^5;
sbit led6 = P2^6;
sbit led7 = P2^7;
uint8 COUNT=15,COUNT1=0,ADC_Count=0,LINE=15,G=0,T;
uint8 i,j,k,b,p,anum,led=0;                 
int Temp_Real,Temp_Imag,temp;                // 中间临时变量  
uint16 TEMP1,max=0;
int xdata Fft_Real[128];
int xdata Fft_Image[128];               // fft的虚部
uint8 xdata LED_TAB[64];    //记录FFT计算出的各点幅值大小
void FFT()//基2fft
{                 
    for( i=1; i<=7; i++)                            /* for(1) */
    {
        b=1;
        b <<=(i-1);                                 //碟式运算,用于计算隔多少行计算例如 第一极 1和2行计算
        for( j=0; j<=b-1; j++)                      /* for (2) */
        {
            p=1;
            p <<= (7-i);            
            p = p*j;
            for( k=j; k<128; k=k+2*b)               /* for (3)  */
            {
                Temp_Real=Fft_Real[k];
    Temp_Imag=Fft_Image[k];
    temp=Fft_Real[k+b];
                Fft_Real[k]=Fft_Real[k]+((Fft_Real[k+b]*COS_TAB[p])>>7)+((Fft_Image[k+b]*SIN_TAB[p])>>7);
                Fft_Image[k]=Fft_Image[k]-((Fft_Real[k+b]*SIN_TAB[p])>>7)+((Fft_Image[k+b]*COS_TAB[p])>>7);
                Fft_Real[k+b]=Temp_Real-((Fft_Real[k+b]*COS_TAB[p])>>7)-((Fft_Image[k+b]*SIN_TAB[p])>>7);
                Fft_Image[k+b]=Temp_Imag+((temp*SIN_TAB[p])>>7)-((Fft_Image[k+b]*COS_TAB[p])>>7);          // 移位.防止溢出. 结果已经是本值的 1/64               
                Fft_Real[k] >>= 1;            
                Fft_Image[k] >>= 1;
                Fft_Real[k+b] >>= 1;                 
                Fft_Image[k+b] >>= 1;                                                               
            }     
        }
    }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
Happy.Q
2019-07-16 01:48
本帖最后由 Happy.Q 于 2013-5-12 09:29 编辑

for(j=0;j<64;j++)//64分频            
{                     
  TEMP1=((((Fft_Real[j+1]* Fft_Real[j+1]))+((Fft_Image[j+1]*Fft_Image[j+1])))>>1);//求各频段幅值
  if(TEMP1<1)TEMP1=0;
  LED_TAB[j]=TEMP1;
  if(LED_TAB[j]>max)max=LED_TAB[j];
}
if(max>64)//分级量化
{
   max/=64;
   for(j=0;j<64;j++)LED_TAB[j]/=max;
}      
}
void delay2us(void)   //2us延时
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=3;a>0;a--);
}
void Init()
{  
     P1ASF = 0x02;                 //0000,0010, 将 P1.1 置成模拟口
     AUXR1 &=0xFB;                 //1111,1011, 令 ADRJ=0
  EADC=1;        //AD中断打开
  ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;//1110 1001   1打开 A/D (ADC_POWER)转换电源;11速度为90周期一次;
                                                      //0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);
  
  P2M0=1;
    TMOD=0X12;        
  TH0=0xb0;                                       
  TL0=0xb0;
  TH1=0xfe;               
  TL1=0Xd4;
  ET0=1;            //定时器0 打开
  TR0=0;            //关闭定时器
  ET1=1;
  TR1=1;
  PT1=0;
  PT0=1;
    IPH=PADCH;
  IP=PADC;        //中断优先级
  EA=1;         //总中断打开
}

一周热门 更多>