找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2899|回复: 2
打印 上一主题 下一主题
收起左侧

音谱程序怎么写,哪位大神帮帮忙

[复制链接]
跳转到指定楼层
楼主
ID:69187 发表于 2014-12-3 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做的8*16LED音谱但不知道怎么实现功能!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-12-3 16:25 | 只看该作者
单片机频谱显示的详细资料:http://www.51hei.com/bbs/dpj-19371-1.html
回复

使用道具 举报

板凳
ID:67796 发表于 2014-12-3 22:43 | 只看该作者
本帖最后由 exv 于 2014-12-3 22:48 编辑

胡老师给的是电路图,楼主问的是算法。

以下是Reliable的代码,仅供学习交流,严禁用于商业用途。楼主不妨参考下。

请自行看懂以下代码的 107~126 行 关于 BUTTERFLY 的诠释,更多请见 Introduction to Algorithms 第三版的第三十章。


  1. //------------------------------------
  2. //  fft.cpp
  3. //  The implementation of the
  4. //  Fast Fourier Transform algorithm
  5. //  (c) Reliable Software, 1996
  6. //------------------------------------
  7. #include "fft.h"
  8. #include "recorder.h"

  9. // log (1) = 0, log(2) = 1, log(3) = 2, log(4) = 2 ...

  10. #define PI (2.0 * asin(1.0))

  11. // Points must be a power of 2

  12. Fft::Fft (int Points, long sampleRate)
  13. : _Points (Points), _sampleRate (sampleRate)
  14. {
  15.     _aTape = new double [_Points];
  16. #if 0
  17.     // 1 kHz calibration wave
  18.     for (int i = 0; i < _Points; i++)
  19.         _aTape[i] = 1600 * sin (2 * PI * 1000. * i / _sampleRate);
  20. #else
  21.     for (int i = 0; i < _Points; i++)
  22.         _aTape[i] = 0;
  23. #endif
  24.     _sqrtPoints = sqrt((double)_Points);
  25.     // calculate binary log
  26.     _logPoints = 0;
  27.     Points--;
  28.     while (Points != 0)
  29.     {
  30.         Points >>= 1;
  31.         _logPoints++;
  32.     }

  33.     _aBitRev = new int [_Points];
  34.     _X = new Complex[_Points];
  35.     _W = new Complex* [_logPoints+1];
  36.     // Precompute complex exponentials
  37.     int _2_l = 2;
  38.     for (int l = 1; l <= _logPoints; l++)
  39.     {
  40.         _W[l] = new Complex [_Points];

  41.         for ( int i = 0; i < _Points; i++ )
  42.         {
  43.             double re =  cos (2. * PI * i / _2_l);
  44.             double im = -sin (2. * PI * i / _2_l);
  45.             _W[l][i] = Complex (re, im);
  46.         }
  47.         _2_l *= 2;
  48.     }

  49.     // set up bit reverse mapping
  50.     int rev = 0;
  51.     int halfPoints = _Points/2;
  52.     for (i = 0; i < _Points - 1; i++)
  53.     {
  54.         _aBitRev[i] = rev;
  55.         int mask = halfPoints;
  56.         // add 1 backwards
  57.         while (rev >= mask)
  58.         {
  59.             rev -= mask; // turn off this bit
  60.             mask >>= 1;
  61.         }
  62.         rev += mask;
  63.     }
  64.     _aBitRev [_Points-1] = _Points-1;
  65. }

  66. Fft::~Fft()
  67. {
  68.     delete []_aTape;
  69.     delete []_aBitRev;
  70.     for (int l = 1; l <= _logPoints; l++)
  71.     {
  72.         delete []_W[l];
  73.     }
  74.     delete []_W;
  75.     delete []_X;
  76. }

  77. void Fft::CopyIn (SampleIter& iter)
  78. {
  79.     int cSample = iter.Count();
  80.     if (cSample > _Points)
  81.         return;

  82.     // make space for cSample samples at the end of tape
  83.     // shifting previous samples towards the beginning
  84.     memmove (_aTape, &_aTape[cSample],
  85.               (_Points - cSample) * sizeof(double));
  86.     // copy samples from iterator to tail end of tape
  87.     int iTail  = _Points - cSample;
  88.     for (int i = 0; i < cSample; i++, iter.Advance())
  89.     {
  90.         _aTape [i + iTail] = (double) iter.GetSample();
  91.     }
  92.     // Initialize the FFT buffer
  93.     for (i = 0; i < _Points; i++)
  94.         PutAt (i, _aTape[i]);
  95. }

  96. //
  97. //               0   1   2   3   4   5   6   7
  98. //  level   1
  99. //  step    1                                     0
  100. //  increm  2                                   W
  101. //  j = 0        <--->   <--->   <--->   <--->   1
  102. //  level   2
  103. //  step    2
  104. //  increm  4                                     0
  105. //  j = 0        <------->       <------->      W      1
  106. //  j = 1            <------->       <------->   2   W
  107. //  level   3                                         2
  108. //  step    4
  109. //  increm  8                                     0
  110. //  j = 0        <--------------->              W      1
  111. //  j = 1            <--------------->           3   W      2
  112. //  j = 2                <--------------->            3   W      3
  113. //  j = 3                    <--------------->             3   W
  114. //                                                              3
  115. //

  116. void Fft::Transform ()
  117. {
  118.     // step = 2 ^ (level-1)
  119.     // increm = 2 ^ level;
  120.     int step = 1;
  121.     for (int level = 1; level <= _logPoints; level++)
  122.     {
  123.         int increm = step * 2;
  124.         for (int j = 0; j < step; j++)
  125.         {
  126.             // U = exp ( - 2 PI j / 2 ^ level )
  127.             Complex U = _W [level][j];
  128.             for (int i = j; i < _Points; i += increm)
  129.             {
  130.                 // butterfly
  131.                 Complex T = U;
  132.                 T *= _X [i+step];
  133.                 _X [i+step] = _X[i];
  134.                 _X [i+step] -= T;
  135.                 _X [i] += T;
  136.             }
  137.         }
  138.         step *= 2;
  139.     }
  140. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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