我一直对能够实时响应声音的彩色显示器着迷。能够看到声波令人着迷,当声波被分解成其组成部分时会更好。查看声音数据的一种方法是使用频率分析仪,其中从左到右的条形图根据给定频带的幅度扩展和收缩。我想重新创造这种效果,但要有所改变——让它变得线性且更加丰富多彩。
这个项目的主处理器是一个 Teensy 4,它负责接收传入的声音数据并进行处理。在音频被分解成频率箱后,它会沿着一串 LED 输出,从而创建一个灯光秀。至于灯本身,我选择了一条 240 个 WS2812 LED。
在 Teensy 4 中,内置的音频库提供了几种获取音频输入的方法。其中一些包括 ADC、I2S 甚至 TDM。但是,我选择了 SD 卡 WAV 音频,因为它在传输音乐时简单易用。然后,Teensy 4 获取 WAV 文件并通过 I2S 将其发送到用于辅助输出的音频屏蔽,以及通过 USB。这使得 Teensy 显示为音频输入,类似于 USB 麦克风。
USB 音频输入类允许将其两个通道(左声道和右声道)“修补”到其他块中。可以使用 Teensy 音频系统设计工具查看此布局。对于这个项目,WAV 文件输入进入混频器,在此流被均匀放大,然后输出到 1024 bin FFT 分析仪、峰值模块,最后是 I2S 输出模块。1024 bin FFT 分析仪使用快速傅里叶变换从单个波形中分离出某些频率,然后将幅度放入 1024 bin。然后通过赋予较低频率的权重比较高的频率更多的权重,将这些组合成 16 个 bin。此外,读取电流波形的峰值,这决定了 LED 的亮度(声音越大 = 越亮)。
WS2812 的工作原理是读取一系列脉冲,将它们解析为颜色信息,然后传递其余的信息。由于我想快速更新字符串而不阻塞其他所有内容,因此我使用了 WS2812Serial 库。它通过使用直接内存访问 (DMA) 与 Teensy 4 配合使用,该直接内存访问 (DMA) 使用专用硬件将数据从缓冲区发送到串行端口,同时绕过 CPU。这释放了一些急需的循环,这些循环可用于处理更多的音频信息和分析。
音频库将听觉数据直接从 wav 流阅读器发送到 FFT1024 对象和 Peak 对象。峰值分析仪测量声波的当前整体幅度,并用 设置 LED 灯条的亮度WS2812Serial.setBrightness()
。给定 bin 的值(缩放后)的范围为 0 到 8。由于一个 bin 中有 15 个 LED,因此 0 表示不亮,1 表示中间的一个亮,2 表示中间的和紧邻左右亮灯等
当 Teensy 通电并启动时,颜色是随机确定的,因此两个灯光秀几乎不可能相同。
这是一个非常有趣的项目,而且观看起来更有趣。还有很多其他方法可以将此项目修改为更好的东西,例如添加效果开关库、其他输入音频的方法以及更多灯光。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !