使用 Bass.dll、C# 和 Arduino 制作音频频谱分析仪 - 第 2 部分。






4.86/5 (12投票s)
使用 C# 和 Arduino 制作炫酷音频频谱分析仪的简短教程。
- 上一篇文章链接
- 开发用 GitHub 仓库链接
- 独立控制器应用(适用于 .NET 4.5)下载 Spectrum_Daemon.zip
- Arduino 代码、原理图、电路板设计(需要 Eagle)下载 BassSpectrumHw.zip
引言
我之前关于用 Arduino 制作频谱分析仪的文章展示了一个概念验证代码,用于获取音频频谱数据并将其渲染到屏幕和 Arduino 硬件上。自那篇原始文章发布以来,我一直在开发一个改进版本。如果你还没有阅读过原文,我强烈建议你先阅读。
傅里叶变换背景知识
在上一篇文章中,我没有过多地讨论频谱分析的过程。频谱数据是通过傅里叶变换获得的,该变换基于傅里叶定理。用通俗的话来说,傅里叶定理指出,任何波都可以被再现为一系列简单的正弦波。因此,傅里叶变换可以找出组成波的正弦波的频率及其振幅。在本文所用的显示方法中,频率是在 0Hz 到 22KHz 的对数基础上指定和固定的,这与我们耳朵的工作方式相对应。之后,振幅会以条形图的形式表示。
对于傅里叶变换,几乎所有的实现都使用 FFT(快速傅里叶变换)算法,因为它足够快。Bass.dll 和 Bass.WASAPI.dll 库内置了 FFT 变换的方法。
你可以在这篇维基百科文章中阅读更多关于傅里叶变换的内容。
修改与改进
原始硬件设计的问题在于它只是一个原型,因此,如果你想在周末完成这个项目,那是不可能的。
如果你想制作它,还需要额外的工作,比如设计一个 PCB。对于初次设计 PCB 的人来说,这可能会令人沮丧和困难。为了克服这个问题并使组装更容易,我为它设计了 PCB 和电路图。
但这并不是唯一的改进。最初我使用了一对 MAX7221 恒流 LED 驱动器,它们很不错,但要获得不错的分辨率至少需要 8 个,而且布线会很麻烦。幸运的是,你可以在 e-bay 上花几美元买到基于 HT1632C 的 LED 显示屏。HT163C 也是一个恒流 LED 驱动器,但它是专门为 LED 矩阵设计的,所以一个芯片可以驱动 8x32 像素,这很棒。此外,它使用类似 SPI 的串行传输,所以 8x32 像素的 LED 阵列只需要 5 根线。为了获得不错的垂直分辨率,我使用了两个显示屏,所以最终的显示矩阵是 16 像素高,32 像素宽。
幸运的是,有一个用于 HT163C 的 Arduino 库,所以不需要重复造轮子。在软件开发过程中,我发现该
库提供的例程在绘制频谱数据时速度很慢,因此我修改了库,增加了允许直接修改显示缓冲区的新方法。修改后的库代码当然也包含在发布文件中。
另一个改动是项目使用了 Arduino Nano 而不是 Uno。Nano 和 Uno 拥有相同的微控制器,但尺寸更小,并且使用 mini USB 接口而不是 USB-B。此外,在 e-bay 上花几美元就能买到。
当我完成新的硬件原型时,我发现它有点无聊,所以我让它变得更有趣了。一个 16x32 的显示屏有很多可能性,
我还有一个热敏电阻和一个 RTC(实时时钟)板,已经有一段时间没用了,所以我把它们也整合到了最终设计中。这样,当设备通电但不用作音频频谱显示时,它会显示当前的时间和温度。
RTC 是一个 MAX DS1307 板,也可以在 ebay 上买到。热敏电阻只是一个温度敏感的电阻器,它被接成一个分压器,从而在不同温度下产生不同的电压。访问和使用 DS1037 并不困难,因为它也有一个非常好的 Arduino 库,可以在这里找到。(注意:所有必需的库都已包含在代码中,你不需要单独下载)
电路板设计
电路板和原理图是使用 Eagle 创建的。Eagle PCB 是目前行业领先的 PCB 设计软件之一,最初的 Arduino 板就是用 Eagle 设计的。该电路板和原理图遵循知识共享署名-相同方式共享 4.0 国际许可协议的条款发布。
通俗地说,这意味着只要你注明原始设计的出处,你就可以对这个设计做任何你想做的事情。
不幸的是,我不是 PCB 设计专家,所以我的朋友兼同事 Zsolt Molnár 帮助设计了电路板。设计规范之一是它需要能够在家中制作和组装。
许多开放硬件设计因使用 SMD(表面贴装)元件而缺乏这一特性。焊接 SMD 元件对初学者来说可能非常困难,并且需要特殊工具。这个电路板只使用通孔元件和单面 PCB,可以在家里进行蚀刻。关于家庭 PCB 蚀刻或铣削的教程可以在各种网站上找到。在“兴趣点”部分,我提到了一些。但我警告你,这并不像听起来那么容易。掌握这项技能需要大量的练习 :)
或者,你可以使用提供的文件从本地 PCB 制造商那里订购 PCB。
代码与通信
代码分为两部分。一个微控制器程序和一个 PC 软件。PC 软件基于上一篇文章中介绍的实现,但进行了重构。
第一个主要区别是移除了频谱条以降低 CPU 需求。之前的程序使用 WPF 进度条,导致单核 CPU 占用率达到 100%。在未来的版本中,我可能会添加一个基于 WritableBitmap 的显示。
第二个主要区别在于通信方式,它基于数据包,而不是计算接收到的字节数。
这是必需的,因为显示器支持多种模式,如频谱、反向频谱、电平模式和时间配置。
每条消息为 34 字节。第一个字节决定显示模式,然后是 33 字节的数据和一个值为十六进制 0xFF 的结束字节。
Arduino 代码分为三个文件,目前由于全局变量的存在有点混乱,但一旦我有更多时间,我会进行清理。
代码可以在 GitHub 上找到,具体在 https://github.com/webmaster442/BassPlayer 仓库中。这是我正在开发的音乐播放器的仓库。它也使用了 Bass.dll 组件,因此播放器和频谱分析仪共享部分代码库。该播放器有一些不错的功能,但也有一些问题,因为我还没有时间修复它们。
视频演示
这是几个月前我开发原型时制作的视频演示。它展示了除了反向频谱之外的所有模式,因为反向频谱是上周才添加的。
零件清单
-
DS1307 RTC 板 - 1 个
[Ebay 链接] -
HT1632 显示模块 - 2 个
[Ebay 链接] -
10K 0.3W 电阻 - 3 个
-
10K 热敏电阻 - 1 个
-
16V, 4700µF 电容 - 1 个
-
Wago PCB 接线端子,型号:W237-102 - 5 个
-
10K 或 100K 电位器 - 1 个(用于控制显示亮度)
关注点
- 电路技巧:电路板蚀刻 (Youtube)
- 廉价、友好且精确的 PCB 蚀刻 (Make)
- DIY PCB 蚀刻 (Fritzing)
- Eagle 教程 1:原理图设计 (Youtube)
- Eagle 教程 2:印刷电路板布局 (Youtube)
- Bass.net 网站
- Bass.dll 组件网站
历史
- 2015-07-21:初版发布