搜索
bottom↓
回复: 2

51音乐频谱

[复制链接]

出0入0汤圆

发表于 2013-9-1 14:20:06 | 显示全部楼层 |阅读模式
单独使用5110可以显示,单独使用FFT()和showbar()函数用串口调试可以,为什么我把showbar()里的数值显示在5110里就不行了,郁闷啊,请教大神
  1. #include"STC12C5A60S2.h"
  2. #include"5110.h"
  3. #include"ADDA.h"
  4. #include"math.h"
  5. #define  uchar unsigned char
  6. #define  uint  unsigned int
  7. struct compx                                                                           //定义复数结构体
  8. {
  9.         float real;//实部
  10.         float imag;//虚部
  11. };
  12. xdata struct compx s[ 64 ];  //数据缓冲区                         //FFT数据缓存放在XDATA空间
  13. struct compx EE(struct compx a1,struct compx b2)         //复数乘法
  14. {
  15.         struct compx b3;
  16.         b3.real=a1.real*b2.real-a1.imag*b2.imag; //实部1乘实部2-
  17.         b3.imag=a1.real*b2.imag+a1.imag*b2.real;
  18.         return(b3);
  19. }
  20. void FFT(struct compx xin[],int N)//64点                                  
  21. {
  22.         int f;
  23.         int m;
  24.         int nv2; //
  25.         int nm1;
  26.         int i;
  27.         int k;
  28.         int j=1;
  29.         int l;
  30.         struct compx v,w,t;
  31.         nv2=N/2;
  32.         f=N;
  33.         for(m=1;(f=f/2)!=1;m++){;}
  34.         nm1=N-1;
  35.         for(i=0;i<nm1;i++)                                           //倒序操作
  36.         {
  37.                 if(i<j)
  38.                 {
  39.                         t=xin[j];
  40.                         xin[j]=xin[i];
  41.                         xin[i]=t;
  42.                 }
  43.                 k=nv2;                                                       //k为倒序中相应位置的权值
  44.                 while(k<j)
  45.                 {
  46.                         j=j-k;
  47.                         k=k/2;
  48.                 }
  49.                 j=j+k;
  50.         }
  51.          
  52.         {
  53.                 int le,lei,ip;
  54.                   float pi;
  55.                   for(l=1;l<=m;l++)
  56.                    {
  57.                 le=pow(2,l);                                                 //乘方
  58.                     lei=le/2;
  59.                     pi=3.14159265;
  60.                     v.real=1.0;
  61.                 v.imag=0.0;  
  62.                    w.real=cos(pi/lei);                                           //旋转因子
  63.                     w.imag=-sin(pi/lei);
  64.                    
  65.                 for(j=1;j<=lei;j++)                                           //控制蝶形运算的级数
  66.                      {
  67.                         for(i=j-1;i<N;i=i+le)                                         //控制每级蝶形运算的次数
  68.                               {
  69.                                 ip=i+lei;
  70.                                        t=EE(xin[ ip ],v);
  71.                                        xin[ ip ].real=xin[ i ].real-t.real;   //蝶形计算
  72.                                        xin[ ip ].imag=xin[ i ].imag-t.imag;
  73.                                        xin[ i ].real=xin[ i ].real+t.real;
  74.                                        xin[ i ].imag=xin[ i ].imag+t.imag;
  75.                               }
  76.                               v=EE(v,w);   
  77.                       }     
  78.                    }
  79.           }
  80. }
  81. void showbar(void)
  82. {
  83.         uchar i,j,dat1,dat2;
  84.         uint  tmp1=33,tmp2=33;

  85.         for(i=0;i<32;i+=4)
  86.         {
  87.                 float t0=0,t2=0;

  88.                 t0=sqrt(pow((s[i  ].real+s[i+1].real),2)+pow((s[i  ].imag+s[i+1].imag),2))/2;
  89.                 t2=sqrt(pow((s[i+2].real+s[i+3].real),2)+pow((s[i+2].imag+s[i+3].imag),2))/2;

  90.                 tmp1=(uint)(t0/3);
  91.                 tmp2=(uint)(t2/3);

  92.                 for(j=2;j>0;j--)//行处理
  93.                 {                 
  94.                         if (tmp1>=8)
  95.                             {
  96.                                      dat1=7;
  97.                                     tmp1=tmp1-8;
  98.                                 }                         //满格
  99.                         else  if(tmp1==0)
  100.                             dat1=20;                                        //空格
  101.                         else  
  102.                             {
  103.                                 dat1=tmp1-1;
  104.                                 tmp1=0;
  105.                                 }                                        //1-7格
  106.                                                
  107.                         if (tmp2>=8){dat2=7;tmp2=tmp2-8;}                         //满格
  108.                         else  if(tmp2==0) dat2=20;                                        //空格
  109.                         else  {dat2=tmp2-1;tmp2=0;}                                        //1-7格

  110.                         /*UART_Put_Num(tmp1);
  111.                         UART_Send_Str("  ");
  112.                         UART_Put_Num(tmp2);
  113.                         UART_Send_Enter(); */


  114.                         LCD_write_pinpu(i/2,j-1,dat1); //dat1为0-8之间的数
  115.                         LCD_write_pinpu(i/2+1,j-1,dat2);
  116.                 }                        
  117.                                                                      //\\\\\\\\\\  这里是显示的部分,重点是确定I(频率),J,dat(幅度) 的值
  118.                                                                         // \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\         \\\\\\\\\\\\///////////////////
  119.                                                                          //\\\\\\\\\\\\\\\\\\\\\\\\         //////////////////////////////////////////////////
  120.         }

  121. }


  122. void delay_ms()
  123. {
  124.   int i,j;
  125.   for(i=0;i<6000;i++)
  126.     for(j=0;j<200;j++);
  127. }
  128. void main()
  129. {

  130.      int N=64,i;                                                             //变量初始化,64点FFT运算
  131.          float offset;
  132.            LCD_Init();
  133.   LCD_clear();
  134.          AD_init();    //A/D转换初始化
  135.      //UART_Init(); //串口初始化
  136.         // UART_Send_Str("串口调试AD值");
  137.         // UART_Send_Enter();
  138.          offset = AD_get(1);

  139.         while(1)
  140.         {         
  141.                      for(i=0;i<N;i++)                                      //采集音频信号
  142.                           {
  143.                                 ADC_CONTR=0xC8;                                         //40.96K采样率
  144.                                 while(!(ADC_CONTR&0x10));
  145.                                    s[i].real=(AD_get(1)-offset)/4;//((((int)ADC_DATA-128)/2))*4;
  146.                                    s[i].imag=0;
  147.                           }
  148.                     FFT(s,N);                                       //调用FFT函数进行变换
  149.                           showbar();                                                        //显示频谱                  
  150.         }
  151.   /*int i;
  152.   LCD_Init();
  153.   LCD_clear();
  154.   while(1)
  155.   {
  156.      for(i=0;i<8;i++)
  157.          {
  158.        LCD_write_pinpu(1,1,i);
  159.        delay_ms();
  160.          }
  161.   }        */
  162. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-9-1 20:21:51 | 显示全部楼层
顶楼主,谢谢。

出0入0汤圆

发表于 2013-9-1 20:58:30 | 显示全部楼层
求楼主分享!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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