• 制作频谱灯


    最近研究了下傅里叶变换,用它可以通过采集声音信号由时域转换到频域内,从而得到声音的频谱信息,可以做个频谱灯。

    主要使用ESP32来实现了他,实现效果如下:

    频谱

    为了可以带出去露营,我把它做的很大,这样露营的时候效果会更好!

    总体架子是木头设计的,高度60cm,如果用3d打印,这么大会挺费钱。

     

     

    电路部分,主要使用Esp32板子,加上声音传感器模块Max4466,还有灯条ws2812B,用了128个灯,每列16个,共八列。

    Arduino里写的代码如下: 需要先加载两个库,一个是FFT,如下图第二个

    还有个FastLed 

    频谱灯源码如下,4口输入声音电压信号,22口输出控制led信号

    1. #include
    2. #include
    3. #include "arduinoFFT.h"
    4. /********************FFT相关定义**********************************/
    5. #define CHANNEL 4 //选择音频输入IO口序号为4
    6. arduinoFFT FFT = arduinoFFT(); //创建FFT对象
    7. const uint16_t samples = 64; //采样点数,必须为2的整数次幂
    8. const double samplingFrequency = 4000; //Hz, 声音采样频率
    9. unsigned int sampling_period_us;
    10. unsigned long microseconds;
    11. double vReal[samples]; //FFT采样输入样本数组
    12. double vImag[samples]; //FFT运算输出数组
    13. int16_t vvalue; //fft后的值
    14. int16_t volume[8]; //保存下降数据
    15. static uint32_t t=0, dt = 70;
    16. static uint8_t flag=0;
    17. //FFT参数,保持默认即可
    18. #define SCL_INDEX 0x00
    19. #define SCL_TIME 0x01
    20. #define SCL_FREQUENCY 0x02
    21. #define SCL_PLOT 0x03
    22. /********************FFT相关定义*********************************/
    23. /*******************灯板参数定义*********************************/
    24. #define LED_PIN 22 //灯板输入IO口选择
    25. #define NUM_LEDS 128 //灯珠数量
    26. #define BRIGHTNESS 10 //默认背光亮度
    27. #define LED_TYPE WS2812 //灯珠类型
    28. #define COLOR_ORDER GRB //色彩顺序
    29. CRGB leds[NUM_LEDS]; //定义LED对象
    30. /*******************灯板参数定义*********************************/
    31. void drawBar(int idx, int16_t value, uint8_t *flag) //绘制函数,按序号和幅度值绘制条形块
    32. {
    33. //static
    34. constrain(value,0,16); //幅度限制在0-8范围内
    35. if(volume[idx] < value) //采集到的数据比之前大则更新,实现上冲效果
    36. volume[idx] = value;
    37. //if(idx%2){ //余2运算判断序号是否为奇数
    38. // for(int i = 0;i<16-volume[idx];i++) leds[idx*16+i] = CRGB::Black;
    39. //}else{
    40. for(int i = volume[idx];i<16;i++) leds[idx*16+i] = CRGB::Black;
    41. // }
    42. //for(int i = volume[idx];i<16;i++) leds[i]=CRGB::Black;
    43. if(*flag){
    44. volume[idx] -= 1; //达到时间则减小1,表示下落
    45. if(idx == 7) *flag = 0; //第0-7列均更新完毕则清除标记
    46. }
    47. }
    48. void setup(){
    49. sampling_period_us = round(1000000*(1.0/samplingFrequency)); //计算采样频率
    50. pinMode(CHANNEL,INPUT); //初始化麦克风接口为输入模式,表示读取麦克风数据
    51. FastLED.addLeds(leds, NUM_LEDS);//初始化LED灯带
    52. FastLED.setBrightness( BRIGHTNESS ); //LED亮度设置,取值范围为0-255
    53. //Serial.begin(9600);
    54. }
    55. void loop()
    56. {
    57. /*采样*/
    58. microseconds = micros();
    59. for(int i=0; i
    60. {
    61. vReal[i] = analogRead(CHANNEL); //读取模拟值,信号采样
    62. vImag[i] = 0;
    63. while(micros() - microseconds < sampling_period_us){
    64. //empty loop
    65. }
    66. microseconds += sampling_period_us;
    67. }
    68. /*FFT运算*/
    69. FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /* Weigh data */
    70. FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */
    71. FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */
    72. fill_rainbow((leds), 128/*数量*/, 0/*开始色值*/, 2/*递增值*/); //设置彩虹渐变,先填充满,然后根据取值大小填充黑色,表示熄灭灯
    73. for(int i = 0; i < 8; i++){ //循环遍历八列LED
    74. vvalue=(vReal[i*3+2]+vReal[i*3+3]+vReal[i*3+4])/3/100;
    75. //if(i==6)
    76. //{
    77. //Serial.println(vvalue);
    78. //}
    79. vvalue=vvalue-2;
    80. if(vvalue>16) vvalue=16;
    81. drawBar(i, vvalue, &flag); //选取频谱中取平均后的8个值,传递时间标志到绘制函数
    82. }
    83. FastLED.show(); //显示灯条
    84. if((millis()-t) > dt){ //读取时间,判断是否达到掉落时长
    85. flag = 1; //达到则标记为1
    86. t = millis(); //更新时间
    87. }
    88. }

  • 相关阅读:
    Sui基金会与沙迦美国大学宣布合作开设区块链学院
    【从零开始学习深度学习】6.使用torchvision下载与查看图像分类数据集Fashion-MNIST
    AI绘画:SD绘画变现及实操过程-斗罗大陆-唐雅-高清壁纸
    【深度学习】模型过拟合的原因以及解决办法
    微信小程序发布遇到的一些问题记录
    Python算法例8 将整数A转换为B
    UML精简概述
    springboot集成minio,docker部署
    【科普分享】linux服务器文件挂载技术介绍——mount
    java计算机毕业设计红色主题旅游网站MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/Isaac320/article/details/133243078