×
嵌入式 > 嵌入式开发 > 详情

需要知道用快速傅里叶变换分析音频信号

发布时间:2020-05-15 发布时间:
|

今天给大伙们带来一款开发板,名字叫STM32F746DISCO,是云汉社区送给我评测的,我用它做了个音频信号分析器。

其实,我在云汉还有另一个昵称,叫做MC老徐,就是业余时间喜欢玩点freestyle,比如瞎弹或者瞎唱个调调。

当然,这些调调都是我现场即兴瞎编的。比如这个萤火虫板子的这个测试http://www.ickey.cc/e/video/detail/107.html

你会发现2分40秒时候,背景音乐竟然从《千本樱》变成了《极乐净土》,然后4分00秒又变成了《aLIEz》

我老婆说我唱歌虽然习惯性跑调,但是嗓音很有磁性。

我觉得老婆说得对。。。。。

但是“磁性”这个词语太玄幻,我们应该用一个更准确的标准来定义这个“磁性”。我觉得我这种特殊的嗓音是来自喉腔管道引入的高次谐波失真。

“高次谐波失真”这个词可能太严肃了,在音乐界,这种由音腔引起的谐波失真还有个更美妙的名字,叫做泛音。比如我们夸某某乐器的声音好听,常会夸它泛音丰富。

当然,我不能这么恬不知耻地,平白无故地自己夸自己“泛音丰富”。

作为一个有节操有底线的物理博士,我需要用科学方法来自证清白。

为了证明自己嗓音真的是“泛音丰富”,我记录了自己用“啊”音唱小字一组C音(约260赫兹)时候的数据,然后用快速傅里叶算法分析了频谱。

这里非常感谢数学家和物理学家傅里叶为我们提供的好工具。

我终于把信号分析器做出来了。结果表明,我的泛音确实很丰富。除了基频260赫兹附近的根音,泛音一直延伸到了一千赫兹以上。

程序代码是这样的。

先定义(快速傅里叶变换)FFT时候需要用到的参数。

然后定义绘图坐标轴的位置和颜色

接着绘制按钮

麦克风收到的音频信号存入sn数组变量

把sn数组画一下,这个是波形图

最后做快速傅里叶变换,从时域空间转换为频域空间,并画个频谱图。

接着,我把程序编译出一个bin文件,并烧写到了板子上。

为了验证这个项目在各频段下的稳定性,我们要找个音准好一点的设备来做测试音源。

我们打开Adobe公司的专业音频处理软件Audition,先新建一段空音轨。

然后填充标准440Hz正弦波,这个是模拟小字一组的A音。这个A音正是《小星星》开头的那个“索索嘟嘟啦啦嗦”里的那个“嘟”音,唱歌时候经常会用到的。

然后让电脑的扬声器播放这段声音。板子的麦克捕获这段声音并做FFT。

我们看看分析结果。可以从图里发现440Hz那儿功率比较大。

然后,我们再生成一段1千赫兹正弦波的声音。

同样地,扬声器播放这个声音。板子的麦克风捕获,并做FFT。下图中的数据非常漂亮。

我们再试试更高的频率。生成一段3千赫兹的正弦波形。

同样的套路,电脑扬声器播放,然后板子采集并FFT。

分析结果仍然非常漂亮。很准确地捕获到3千赫兹那个信号。

如果声音更复杂一些呢,比如来个和弦。

我们以1千赫兹作为根音,做个复杂的和弦。

这次要发出来的声音复杂了。信号的波形图和频谱图是这样的。

扬声器发声。然后,板子麦克风采集并做FFT。下图是数据分析结果,很准,完全符合预期。

以上测试可以验证我们这个音频信号分析器的性能是正常的。

另外,我那个被测出来嗓音“泛音丰富”的结果,也真实有效。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC 如何设置更省电