• Arduino--音乐频谱


    本文主要介绍基于Arduino实现的音乐频谱显示,音乐频谱原理就是声音传感器(MIC)接收音频信号后通过FFT将时域信号转换成频域信号,再将音频信号频域分量分别显示在对应的LED点阵屏上,呈现出音乐随频律动的感觉,整体效果比较赏心悦目
    完整代码见文末链接(含相关头文件)

    (1)简介

    首先介绍实现本文所需要的主要器件:
    (1)Arduino开发板:全系列均可以,本文主要以UNO为例
    (2)MAX7219 LED点阵模块
    有关于该模块的详细介绍见:https://blog.csdn.net/u011816009/article/details/124309755
    (3)声音传感器:要求能模拟量输出,理论上只要能输出模拟量的都可以,我是电子大楼随意几块钱买了个,也能正常使用
    在这里插入图片描述

    (2)接线图

    接线图相对比较简单,按照下图示意接线即可
    在这里插入图片描述

    (3)程序代码

    初始化配置

    include "LedControl.h"
    
    /* Led matrix - Max7219 Declared */
    LedControl lc = LedControl(7, 6, 5, 1);
    
    const int maxScale = 50;
    
    /* Sensor - Max9812 Declared */
    const int sensorPin = A4;
    const int sampleWindow = 50; // 50ms = 20Hz
    unsigned int sample;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    主函数如下

    void loop() {
    startMillis = millis();
    //peakToPeak = 0;
    
    signalMax = 0;
    signalMin = 255;
    
    // Get data in 50ms
    while (millis() - startMillis < sampleWindow) {
    sample = analogRead(sensorPin);
    
    if (sample < 255) {
    if (sample > signalMax) {
    signalMax = sample;
    }
    if (sample < signalMin) {
    signalMin = sample;
    }
    }
    
    // 20Hz - 64Hz - 125Hz - 250Hz - 500Hz - 1kHz (timeCycle = 1/F)(ms)
    timeCycle = millis() - startMillis;
    if (timeCycle == 1 || timeCycle == 2 || timeCycle == 4 || timeCycle == 8
    || timeCycle == 16 || timeCycle == 32 || timeCycle == 40 || timeCycle == 50) {
    signalMaxBuff[index] = signalMax;
    signalMinBuff[index] = signalMin;
    index = (index + 1) % 8;
    delay(1);
    //Serial.println(timeCycle);
    }
    }
    
    // Delete pointer to array
    index = 0;
    
    // Calculation after get samples
    for (int i = 0; i < 8; i++) { // i = row (led matrix)
    // sound level
    peakToPeak[i] = signalMaxBuff[i] - signalMinBuff[i];
    
    // Map 1v p-p level to the max scale of the display
    displayPeak[i] = map(peakToPeak[i], 0, 254, 0, maxScale);
    
    // Show to led matrix
    displayLed(displayPeak[i], i);
    
    // Led drop down
    if (displayPeak[i] >= temp[i]) {
    temp[i] = displayPeak[i];
    }
    else {
    temp[i]--;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    (4)视频效果展示

    Arduino音乐频谱

    (5)附完整代码(含所需头文件等)

    百度网盘下载:
    链接:https://pan.baidu.com/s/15uyKs5nhGCX9W46Yd7j4FA
    提取码:c457

    CSDN下载:
    https://download.csdn.net/download/u011816009/87177570

  • 相关阅读:
    双端口USB Type-C控制器 CYPD6227 (CYPD6227-96BZXI)
    【直播】-ARM异常中断答疑篇-2022/11/07
    HTML+CSS+JS+Django 实现前后端分离的科学计算器、利率计算器(附全部代码在gitcode链接)
    css样式重置看这篇就够了
    dockerfile,shell脚本,yaml文件如何配合
    awvs无法启动问题
    FPGA设计FIR滤波器低通滤波器,代码及视频
    Chapter 32 MySQL入门
    土壤养分检测仪——可以分析土地健康状况的“田间民医”
    【算法】国庆加班,火锅与Linq.AddRange的奇妙螺旋
  • 原文地址:https://blog.csdn.net/u011816009/article/details/128064407