瞬态音响频谱
01 最初的资料
一、前言
这是一个B站后台网友发送过来的电路图, 是早期用于音响设备中显示频谱的电路。 核心电路只使用了一颗四运放 LM324, 信号经过 10倍的幅度放大, 然后输入到SL322C集成电路, 这个芯片根据输入信号的幅值, 完成高电平信号输出。 作用在 LED阵列的行选择。 接下来, 经过一级比较器, 然后再通过RC微分电路, 触发一个单稳态电路, 产生一个频率变化的矩形脉冲信号。 脉冲信号的平均值,与频率成正比。 经过RC低通滤波之后, 再输入到另外一个 SL322C集成电路, 它完成对 LED 阵列的列选择。 因此, LED阵列就会显示当前不同频率下的不同幅度。 虽然在某一瞬间只有一颗LED点亮,但 在动态过程中,人眼视觉暂留效应就会产生一个音乐频谱变化的效果。
▲ 图1.1.1 文章开始
▲ 图1.1.2 文章中的电路图
▲ 图1.1.3 文章中间部分
留言的网友希望能够测试一下这个电路, 很可惜, 电路中的 SL322C芯片比较古老了。 我现在也没有这个芯片。 网络上看了一下, 有人再销售, 但也不便宜。 所以, 下面就是用前天搭建的 单片机电路, 对这个电路进行软件仿真, 测试一下它的工作效果。
二、软件实现
1、实现原理
相比FFT算法来讲, 通过软件模拟比较器计数和幅度测量的算法就简单多了。 首先对采集的音乐信号ADC数据取平均值。 下面通过循环来计算信号的能量和过零点的次数。 将数据减去平均值, 获得交流分量, 然后进行平方累加。 最终将累加的能量进行平均之后, 再开方, 便可以得到信号等效的交流幅度。 下面是通过对比交流分量的幅度, 看是否超过正负变化的阈值, 将变化的次数进行统计, 它便是信号的频率值。 接下来对该算法的效果进行测试。
2、测试结果
首先对一个简单的正弦信号进行测试。 信号的频率为 200Hz, 峰值为1.5V。 这是单片机采集到的 2048 个数据。 采样频率为 20kHz。 通过对采集数据的处理, 获得信号的能量以及对应的过零点次数, 将它显示在OLED上。 可以看到 过零点次数有可能在上下变化1. 这是使用 FFT 计算的信号频谱。 由于采用了矩形数据窗口, 所以显示的频谱带有杂散的高频分量。
将两种方法的结果放在一起, 可以看到使用过零点统计的结果, 没有杂散的高频分量, 使用FFT计算的结果, 出现了一些杂散的频率分量。 但两种方法所得到的频率和幅度都是相符合的。
将输入信号改为 方波信号。 使用FFT计算出的频谱, 可以看到除了基频之外, 还包含有奇次谐波分量。 使用比较器算法所得到的频谱, 则只能检测到一个频率, 无法显示信号中的谐波分量。 另外, 通过能量计算信号频率的幅度也出现了比较大的误差。
下面使用一首歌曲信号, 对比两种频谱显示方式。 这是比较器算法所得到的动态频谱。 能够看到结果的确随着音乐的变化, 但显得比较单调。 这是 FFT 计算的结果。 它能够对音乐中更加丰富的频率进行显示。 更换另外一首音乐。 比较器算法的结果还是显得单调。 快速傅里叶变化得到的结果比较丰富。
※ 总 结 ※
本文通过单片机软件测试了比较器显示音乐频谱的特点。 本质上, 这种方法只需要外部一些硬件就可以实现。 对于简单信号, 这种方法显示的频谱还是比较准确, 但是对于复杂音乐信号 。 比较器所获得的频谱信息与真实的信号频谱相差就比较大了。 但是它依然能够反映出音乐的律动。
● 相关图表链接: