用快速傅里叶变换分析音频信号

快速傅里叶变换 FFT STM32 信号
xukejing
发布时间: 2018-08-05
阅读: 4644

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

 mbed-diso.jpg

  

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

MC老徐.jpg

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

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

   

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

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

201610101123136755.jpg

  

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

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

  

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

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

    

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

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

 timg.jpg

  

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

 中央C.JPG

  

程序代码是这样的。

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

定义fft参数.JPG

   

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

绘图坐标和颜色.JPG

   

接着绘制按钮

绘制按钮.JPG

   

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

把音频数据给sn变量.JPG

   

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

显示音频波形.JPG

    

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

fft计算并显示频谱.JPG

    

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

编译过程.JPG

    

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

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

 打开audition.jpg

  

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

440Hz.jpg

    

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

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

 440.JPG

  

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

1kHz.jpg

   

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

 1k.JPG

  

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

3kHz.jpg

  

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

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

3k.JPG

   

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

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

1K基频的大三和弦.jpg

   

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

大三和弦频谱.JPG

    

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

和弦.JPG

   

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

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

完美.JPG


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (1)
xukejing 擅长:其他应用
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)