476浏览
楼主: 驴友花雕

[项目] 【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)

[复制链接]

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 19:19:17

  实验场景图

08.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-5 19:27:49

  实验场景图  动态图

10.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:04:04

【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯

  实验开源代码

  1. /*
  2. 【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  3.   项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯
  4.   实验接线: max9814接A0
  5.   oled模块    Ardunio Uno
  6.   GND---------GND接地线
  7.   VCC---------5V 接电源
  8.   SDA---------A4
  9.   SCL ------- A5
  10. */
  11. #include <fix_fft.h>                  
  12. #include <ssd1306.h>                  
  13. #include <nano_engine.h>              
  14. // These are user-adjustable
  15. #define LOG_OUTPUT                 // Uncomment to enable logarithmic output (exchanges absolute resoluton for more readable output; may require different below params)
  16. #define SAMPLING_FREQUENCY 15000  // Sampling frequency (Actual max measured frequency captured is half)
  17. #define TIME_FACTOR 2             // Smoothing factor (lower is more dynamic, higher is smoother) ranging from 1 to 10+
  18. #define SCALE_FACTOR 15           // Direct scaling factor (raise for higher bars, lower for shorter bars)
  19. #ifdef LOG_OUTPUT
  20. const float log_scale = 64. / log(64. / SCALE_FACTOR + 1.);    // Attempts to create an equivalent to SCALE_FACTOR for log function
  21. #endif
  22. const float coeff = 1. / TIME_FACTOR;                         // Time smoothing coefficients (used to factor in previous data)
  23. const float anti_coeff = (TIME_FACTOR - 1.) / TIME_FACTOR;
  24. const unsigned int sampling_period_us = round(1000000 * (2.0 / SAMPLING_FREQUENCY)); // Sampling period (doubled to account for overclock)
  25. int8_t data[64], buff[32];                                     // used to store FFT input/output and past data
  26. unsigned long microseconds;                                    // used for timekeeping
  27. int summ, avg;                                                 // used for DC bias elimination
  28. NanoEngine<TILE_32x32_MONO> engine;                            // declares nanoengine
  29. void setup()
  30. {
  31.   OSCCAL = 240; // Overclocks the MCU to around 30 MHz, set lower if this causes instability, raise if you can/want
  32.   ADCSRA &= ~(bit (ADPS0) | bit (ADPS1) | bit (ADPS2));       // clear ADC prescaler bits
  33.   ADCSRA |= bit (ADPS2);                                      // sets ADC clock in excess of 10kHz
  34.   ADCSRA |= bit (ADPS0);
  35.   ssd1306_128x64_i2c_init();                                  // initializes OLED
  36.   ssd1306_clearScreen();                                      // clears OLED
  37.   engine.begin();                                             // inititalizes nanoengine
  38. };
  39. void loop()
  40. {
  41.   summ = 0;
  42.   for (int i = 0; i < 64; i++) {
  43.     microseconds = micros();
  44.     data[i] = ((analogRead(A0)) >> 2) - 128;                        // Fitting analogRead data (range:0 - 1023) to int8_t array (range:-128 - 127)
  45.     summ += data[i];
  46.     while (micros() < (microseconds + sampling_period_us)) {        // Timing out uC ADC to fulfill sampling frequency requirement
  47.     }
  48.   }
  49.   // Eliminating remaining DC component (produces usable data in FFT bin #0, which is usually swamped by DC bias)
  50.   avg = summ / 64;
  51.   for (int i = 0; i < 64; i++) {
  52.     data[i] -= avg;
  53.   }
  54.   fix_fftr(data, 6, 0);                             // Performing real FFT
  55.   // Time smoothing by user-determined factor and user-determined scaling
  56.   for (int count = 0; count < 32; count++) {
  57.     if (data[count] < 0) data[count] = 0;                                         // Eliminating negative output of fix_fftr
  58. #ifdef LOG_OUTPUT
  59.     else data[count] = log_scale * log((float)(data[count] + 1));                 // Logarithmic function equivalent to SCALING_FACTOR*log2(x+1)
  60. #else
  61.     else data[count] *= SCALE_FACTOR;                                             // Linear scaling up according to SCALE_FACTOR
  62. #endif
  63.     data[count] = (float)buff[count] * anti_coeff + (float)data[count] * coeff;   // Smoothing by factoring in past data
  64.     buff[count] = data[count];                                                    // Storing current output as next frame's past data
  65.     if (data[count] > 63) data[count] = 63;                                       // Capping output at screen height
  66.   }
  67.   // Output to SSD1306 using nanoengine canvas from library
  68.   engine.refresh();                                               // Mark entire screen to be refreshed
  69.   engine.canvas.clear();                                          // Clear canvas as previous data
  70.   for (int i = 0; i < 8; i++) {
  71.     engine.canvas.drawVLine(i * 4, 31 - (data[i] + 1), 31);  // Draw to canvas data for lower-leftest sector (FFT bins 0 - 7, lower half)
  72.   }
  73.   engine.canvas.blt(0, 32);                                       // Outputs canvas to OLED with an offset (x pixels, y pixels)
  74.   engine.canvas.clear();
  75.   for (int i = 0; i < 8; i++) {
  76.     if (data[i] > 31) engine.canvas.drawVLine(i * 4, 31 - (data[i] - 31), 31); // Draw to canvas data for upper-leftest sector (FFT bins 0 - 7, upper half)
  77.   }
  78.   engine.canvas.blt(0, 0);
  79.   engine.canvas.clear();
  80.   for (int i = 8; i < 16; i++) {
  81.     engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] + 1), 31); // FFT bins 8 - 15, lower half
  82.   }
  83.   engine.canvas.blt(32, 32);
  84.   engine.canvas.clear();
  85.   for (int i = 8; i < 16; i++) {
  86.     if (data[i] > 31) engine.canvas.drawVLine((i - 8) * 4, 31 - (data[i] - 31), 31); // FFT bins 9 - 15, upper half
  87.   }
  88.   engine.canvas.blt(32, 0);
  89.   engine.canvas.clear();
  90.   for (int i = 16; i < 24; i++) {
  91.     engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] + 1), 31); // FFT bins 16 - 23, lower half
  92.   }
  93.   engine.canvas.blt(64, 32);
  94.   engine.canvas.clear();
  95.   for (int i = 16; i < 24; i++) {
  96.     if (data[i] > 31) engine.canvas.drawVLine((i - 16) * 4, 31 - (data[i] - 31), 31); // FFT bins 16 - 23, upper half
  97.   }
  98.   engine.canvas.blt(64, 0);
  99.   engine.canvas.clear();
  100.   for (int i = 24; i < 32; i++) {
  101.     engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] + 1), 31); // FFT bins 24 - 31, lower half
  102.   }
  103.   engine.canvas.blt(96, 32);
  104.   engine.canvas.clear();
  105.   for (int i = 24; i < 32; i++) {
  106.     if (data[i] > 31) engine.canvas.drawVLine((i - 24) * 4, 31 - (data[i] - 31), 31); // FFT bins 24 - 31, upper half
  107.   }
  108.   engine.canvas.blt(96, 0);
  109. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:14:35

实验场景图

11.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:36:32

【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
   项目之三:32段分频0.91寸OLED液晶可视化细条频谱灯

   实验视频剪辑

https://v.youku.com/v_show/id_XN ... hcb.playlsit.page.1



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:45:54

实验场景动态图

16.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:47:50

本帖最后由 驴友花雕 于 2021-10-6 09:12 编辑

【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
   项目之三:32段分频0.96寸OLED液晶可视化细条频谱灯

   实验视频剪辑

https://v.youku.com/v_show/id_XNTgwNzY3ODkwNA==.html?firsttime=0



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:51:27

  实验场景图

12.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-6 07:54:05

  实验场景动态图


17.gif
回复

使用道具 举报

perseverance51  学徒

发表于 2021-10-12 17:19:39

驴友花雕 发表于 2021-10-5 17:03
【花雕动手做】音乐可视化系列小项目(02)---OLED频谱灯
  项目之二:11段分频0.91寸OLED液晶屏声音可视 ...

代码不完整,arduinoFFT.h和Adafruit_SSD1306.h有库之间有冲突,同时调用,运行 arduinoFFT fft = arduinoFFT(vReal, vImag,64, 8000);初始化display.begin(SSD1306_SWITCHCAPVCC,0x3c)会报找不到硬件。
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-10-13 09:37:58

perseverance51 发表于 2021-10-12 17:19
代码不完整,arduinoFFT.h和Adafruit_SSD1306.h有库之间有冲突,同时调用,运行 arduinoFFT fft = arduin ...

可能硬件不同吧
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail