亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

FHT 音频频谱可视化工具

组件和用品

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED 矩阵
× 1
电阻 4.75k ohm
× 3
电阻 100k ohm
× 2
电阻 10k ohm
× 2
通孔电阻,390 ohm
× 1
1N4007 – 高电压、高额定电流二极管
即使是 1N4004 也可以
× 1
电容 100 nF
× 2
电容 1000 µF
× 1
SparkFun 按钮开关 12mm
如果您打算将电路插入一个框中,或者两个面板按钮
× 2
4x6 cm 通用原型板
× 1
PCB 立体声 RCA 母插头
× 1

必要的工具和机器

烙铁(通用)
3.5 毫米音频插孔电缆至立体声 RCA 连接器

关于这个项目

Arduino FHT 库

FHT 的工作与更知名的 FFT 完全相同,但与此不同的是它只使用真实数据,而 FFT 处理复杂数据,因此 FHT 使用一半的处理能力和一半的系统内存。

该库使用单个数组进行数据采样,而不是两个,一个用于实值,一个用于虚值,由 FFT 库使用,它还简化了复杂的数学计算,避免了复杂浮点对数计算的循环,而是使用了一些数值表.

缺点是它总是返回用于执行采样的数组大小的一半值,这导致音频范围两端的分辨率和精度有一定的损失。但具体情况下,我们不需要开发测量仪器而是一个简单的小工具,我们不需要极端的精度,我们只需要在音乐节奏中打开几个LED即可。

当然,这里不是讨论 FHT 库的模态操作的合适地方,任何想要了解更多信息的人都可以参考 Open Music Lab 网站,在那里他们会找到所有必要的文档来了解所使用的技巧,以及对 FHT 库的详细解释已经为 Arduino 编写的各种函数和一些通用示例。

FFT 库速度很快,以至于需要在代码中插入延迟以减少闪烁。您会立即注意到最终结果,与使用 FFT 库的版本相比,它的显示速度更快、响应更快,而后者通常似乎落后于音乐。较少使用系统资源使我们能够添加一些代码行来管理其他功能。

新版本

项目和之前的版本完全一样,已经做了上一个的只需要加一个按钮和一个10K电阻,更新代码即可。

除了FHT库的实现,这个版本还有以下附加功能:

  • 有一个额外的亮度调节按钮;
  • 允许在 EEPROM 中保存颜色和亮度设置,以便下次打开时重新加载;
  • 在按下按钮和打开(可以禁用)时显示颜色和亮度设置级别。

代码

  • FHT 代码版本
FHT 代码版本Arduino
/* 版权所有 (c) 2020 Janux 特此授予任何人免费获得本软件和相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括没有限制使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许软件提供给的人这样做,但须符合以下条件: 上述版权通知,并且本许可通知应包含在软件的所有副本或重要部分中。该软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或使用或其他原因引起的或与之相关的软件。基于由 Shajeeb 制作的 MAX72xx LED 矩阵和 FFT 库的原始项目。配置设置部分基于来自 Norvegian Creation 的 Ragnar Ranøyen Homb 的工作。*/#define LIN_OUT 1 //FHT 线性输出幅度#define FHT_N 128 //为 FHT 设置 SAMPLES,必须是 2 的幂 #include  #define xres 32 //显示总列数,必须<=SAMPLES/2#define yres 8 //显示总行数#define ledPIN 6 //out pint to control Leds#define NUM_LEDS (xres * yres) //矩阵中的总 LED#include #define colorPIN 5 //pin 改变 ledcolor#define 亮度PIN 10 //pin 改变亮度字节 displaycolor =0; //默认颜色值字节亮度=1; //默认亮度级别#include #define CONFIG_START 32 //内存起始位置#define CONFIG_VERSION "VER01" //配置版本 configurationtypedef struct { char version[6];字节显示颜色;字节亮度;} configuration_type;configuration_type CONFIGURATION ={ CONFIG_VERSION,displaycolor,brightness};byte yvalue;int peaks[xres];byte state =HIGH; // 从输入 pinbyte 中读取的当前读数 previousState =LOW; // 之前从输入引脚读取的数据unsigned long lastDebounceTime =0; // 最后一次切换输出引脚无符号长去抖动延迟 =100; // 去抖动时间;如果输出闪烁,则增加 data_avgs[xres]; // 采样阵列// 参数 1 =矩阵中的 LED 数量// 参数 2 =引脚编号// 参数 3 =像素类型标志,根据需要相加:// NEO_KHZ800 800 KHz 比特流(大多数 NeoPixel 产品带有 WS2812 LED )// NEO_KHZ400 400 KHz(经典的“v1”(不是 v2)FLORA 像素,WS2811 驱动程序)// NEO_GRB 像素连接到 GRB 比特流(大多数 NeoPixel 产品)// NEO_RGB 像素连接到 RGB 比特流(v1 FLORA 像素,不是v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// EQ filterbyte eq[32] ={ 60, 65, 70, 75, 80, 85, 90, 95, 100,1001001 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200}; 200 // 设置为 false 以禁用 eq//为 LED 定义 5 组颜色,0 为单个自定义颜色字节颜色[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, { 1, 5, 10, 15, 20, 25, 90, 90}, {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 110, 0}};//定义显示设置的字符byte charBitmap[] ={ 0x1C, 0x10, 0x10, 0x10, 0x10, 0x18,0x1C, 0 0x08时,0x08时,0x08时,为0x1C,0x0C,0×12,×04,0x08时,0×10,0X1E,0x0C,0×12,0×02,0×06,×12,0x0C,0x10的,为0x10,0x10的,0×14,0X1E,0x04的0X1E,0x10的,0X1E, 0×02,×12,0x0C,0X1E,为0x10,0x10的,0X1E,0×12,0X1E,0X1E,0×02,×04,0x08时,0x08时,0x08时,0x0C,0×12,0x0C,0×12,×12,0x0C,为0x1C,0×12,为0x1C,0×12, 0x12, 0x1C};void setup() { pixel.begin(); //初始化LED矩阵 //开始FFT运算 ADCSRA =0b11100101; // 将 ADC 设置为自由运行模式并将预分频器设置为 32 (0xe5) ADMUX =0b00000000; // 使用引脚 A0 和外部参考电压 // 从 EEPROM 读取配置数据 if (loadConfig()) { displaycolor =CONFIGURATION.displaycolor;亮度 =CONFIGURATION.brightness; } //设置从EEPROM加载的亮度 pixel.setBrightness(brightness * 24 + 8); //在开始时显示当前配置 //如果你不想要这个 showSettings(3, true);}void loop() { while (1) { // 减少抖动 Sampling(); // FHT 库只使用一个数据数组 RearrangeFHT(); // 重新排列 FHT 结果以匹配 no。显示列数 SendToDisplay(); // 根据测量值发送显示 colorChange(); // 检查按钮是否按下以更改颜色亮度更改(); // 检查按钮是否按下以改变亮度延迟(10); // 延迟减少闪烁(FHT 太快:D) }}void Sampling() { for (int i =0; i  peaks[i]) peaks[i] =yvalue; // 保存峰值 if> previuos peak yvalue =peaks[i]; // 选取峰值以显示 setColumn(i, yvalue); // 绘制列 } pixel.show(); // 显示列}// 根据 y 值点亮 x 列的 LED void setColumn(byte x, byte y) { int led, i; for (i =0; i  i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // 显示自定义颜色为零值在数组中 pixel.setPixelColor(led, 255, 255, 255); //withe } else { // 颜色数组中定义的标准颜色 pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } 休息; case 5://按列改变颜色 pixel.setPixelColor(led, Wheel(x * 16));休息; case 6://按行改变颜色 pixel.setPixelColor(led, Wheel(i * y * 3));休息; case 7://按...更改颜色... country :D //Italy flagh //if (x <11) pixel.setPixelColor(led, 0, 255, 0); //if (x> 10 &&x <21) pixel.setPixelColor(led, 255, 255, 255); //if (x> 20) pixel.setPixelColor(led, 255, 0, 0); //星星和条纹 if (i  debounceDelay) { displaycolor++; if (displaycolor> 7) displaycolor =0; showSettings(1, true); //如果你不想要这个saveConfig(),设置为false; lastDebounceTime =毫秒(); } previousState =reading;}void BrightnessChange() { int reading =digitalRead(brightnessPIN); if (reading ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) { 亮度++;如果(亮度> 7)亮度=0; pixel.setBrightness(brightness * 24 + 8); showSettings(2, true); //如果你不想要这个saveConfig(),设置为false; lastDebounceTime =毫秒(); } previousState =reading;}// 来自 Adafruit Neopixel 演示草图的实用程序// 输入一个 0 到 255 的值以获得颜色值。// 颜色是一个过渡 R - G - B - 回到 R.unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85;返回 pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3);轮位置-=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}// 如果是有效设置,则将 EEPROM 中的内容加载到本地 CONFIGURATION 中 int loadConfig() { if (EEPROM.read(CONFIG_START + 0) ==CONFIG_VERSION[0] &&EEPROM.read(CONFIG_START + 1) ==CONFIG_VERSION[1] &&EEPROM.read(CONFIG_START + 2) ==CONFIG_VERSION[2] &&EEPROM.read(CONFIG_START + 3) ==CONFIG_VERSION[3] ] &&EEPROM.read(CONFIG_START + 4) ==CONFIG_VERSION[4]) { // 加载(覆盖)本地配置结构 for (unsigned int i =0; i =0; x--) { for (int y =5; y>=0; y--) { if ((charBitmap[val * 6 + 5 - y]>> x) &0x01) { pixel.setPixelColor(GetLedFromMatrix(4 - x + pos, y + 1), Wheel((pos> 10) * 170));像素显示(); } } }}//作者:Janux®,2020 年 6 月 28 日最新版本。

示意图


制造工艺

  1. 32(线性)/11(伪对数)频段音频频谱分析仪
  2. 干渴警报植物警报
  3. 意大利字时钟
  4. Sigfox kWh Meter
  5. 蓝牙温度监视器
  6. 手势控制锁
  7. 伴侣 IC
  8. USB MIDI 适配器
  9. Arduino 的隔离模拟输入
  10. RGB 32-Band Audio Spectrum Visualizer
  11. Arduino TV 输出电缆
  12. 测量你的反应时间