极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24547|回复: 7

用Arduino显示音乐频谱

[复制链接]
发表于 2014-12-11 22:08:38 | 显示全部楼层 |阅读模式
硬件组成:Arduino UNO板,8x8的LED显示模块,麦克风模块

软件:
用到了开源的FFT库(数据采集与转换的代码基本就是他们的示例代码了),LedControl库用于驱动LED屏
自己所做的就是把这些东西整合了起来

  1. #define LOG_OUT 1
  2. #define FFT_N 256
  3. //#define DEBUG

  4. #include <FFT.h>
  5. #include <LedControl.h>

  6. #define SIZE_WIDTH  8
  7. #define SIZE_HEIGHT 8
  8. #define MAX_SPECTRUM 32
  9. #define GAIN 2.3
  10. #define FREQUENCY_INDEX(I) ((I) * 3 + 10)

  11. #define SET_SPECTRUMS() \
  12.         do { \
  13.                 for(int i = 0; i < SIZE_WIDTH; i++) { \
  14.                         g_lc.setRow(0, i, g_spectrums[i]); \
  15.                 } \
  16.         }while(0)
  17.        
  18. #define GET_SPECTRUM(VAL) 0xff << ((8 - ((VAL) > MAX_SPECTRUM ? (VAL) : ((VAL) < 0 ? 0 : (VAL))) / 8))

  19. LedControl g_lc = LedControl(7, 5, 6, 1);

  20. uint8_t g_spectrums[SIZE_WIDTH] = { 0 };
  21. uint8_t g_fft_init_log[FFT_N << 1] = { 0 };

  22. bool g_first_flag = true;


  23. void setup()
  24. {
  25.         #ifdef DEBUG
  26.         Serial.begin(115200);
  27.         #endif

  28.         TIMSK0 = 0;     // turn off timer0 for lower jitter
  29.         ADCSRA = 0xe5;  // set the adc to free running mode
  30.         ADMUX  = 0x40;  // use adc0
  31.         DIDR0  = 0x01;  // turn off the digital input for adc0
  32.        
  33.         g_lc.shutdown(0, false);
  34.         g_lc.setIntensity(0, 8);
  35.         g_lc.clearDisplay(0);

  36. }

  37. void loop()
  38. {
  39.         while(1) {
  40.                 cli();
  41.                 for (int i = 0 ; i < 256 ; i += 2) {
  42.                         while(!(ADCSRA & 0x10));
  43.                         ADCSRA = 0xf5;
  44.                         byte m = ADCL;
  45.                         byte j = ADCH;
  46.                         int k = (j << 8) | m;
  47.                         k -= 0x0200;
  48.                         k <<= 6;
  49.                         fft_input[i] = k;
  50.                         fft_input[i+1] = 0;
  51.                 }
  52.                 fft_window();
  53.                 fft_reorder();
  54.                 fft_run();
  55.                 fft_mag_log();
  56.                 sei();
  57.                 if(g_first_flag) {
  58.                         g_first_flag = false;
  59.                         memcpy(g_fft_init_log, fft_log_out, sizeof(g_fft_init_log));
  60.                 }
  61.                 else {
  62.                         for(int i =0; i < sizeof(g_spectrums); i++) {
  63.                                 int j = FREQUENCY_INDEX(i);
  64.                                 int v = (int) (GAIN * (fft_log_out[j] - g_fft_init_log[j]));
  65.                                 g_spectrums[i] = GET_SPECTRUM(v);
  66.                         }
  67.                         SET_SPECTRUMS();
  68.                 }
  69.                 #ifdef DEBUG
  70.                 Serial.write(255);
  71.                 Serial.write(fft_log_out, 128);
  72.                 #endif
  73.         }
  74. }



复制代码
回复

使用道具 举报

发表于 2014-12-11 22:41:30 | 显示全部楼层
赞一个~
把屏做大点就完美了。或者用VFD
回复 支持 反对

使用道具 举报

发表于 2014-12-12 07:48:56 | 显示全部楼层
做 fft 速度够么?
回复 支持 反对

使用道具 举报

发表于 2014-12-12 09:31:40 | 显示全部楼层
好玩                           
回复 支持 反对

使用道具 举报

发表于 2015-3-2 17:17:48 | 显示全部楼层
这个库文件貌似不是标准的fft库,有木有库文件提供一下吧
回复 支持 反对

使用道具 举报

发表于 2015-3-13 13:40:27 来自手机 | 显示全部楼层
好,很好。非常好!就是看不到?
回复 支持 反对

使用道具 举报

发表于 2017-4-13 18:56:08 来自手机 | 显示全部楼层
楼主这个可不可以利用在驱动小电机上
回复 支持 反对

使用道具 举报

发表于 2017-4-16 17:11:53 | 显示全部楼层
能上RGB就更漂亮了
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 15:57 , Processed in 0.051769 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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