搜索
bottom↓
回复: 85

你做FFT音乐频谱的时候栽坑了吗? [附: 讲解视频]

  [复制链接]

出0入0汤圆

发表于 2016-12-22 10:06:56 | 显示全部楼层 |阅读模式
本帖最后由 kayatsl 于 2016-12-22 17:42 编辑

早在好多年前, 试水stm32的时候, 做过一次音乐频谱, http://www.amobbs.com/forum.php? ... =5437297#pid5662844

后面很多人也问我要资料, 没给的原因主要有俩:
1. 代码实在太烂, 基本不具备参考价值, 势必误人子弟
2. 我觉得其中仍存在很多问题, 没有参透应该如何实现才具备观赏性.



视频中介绍一般初学者和进阶同学在做 FFT 音乐频谱时, 需要留意和很可能会踩到的坑

http://v.youku.com/v_show/id_XMTUzMDA2ODk3Ng==.html

视频嵌入失败, 经验坛友介绍下方法.?

如果你们也踩坑了, 不妨下面回复留言讨论.!~
如果你有更好的方法, 或者觉得视频中有错误的地方, 也欢迎指正.!~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2016-12-22 10:07:33 | 显示全部楼层
本帖最后由 kayatsl 于 2016-12-22 17:40 编辑

先占个楼, 留个坑给自己后面踩.


这里列一下最终方案 :

1. 前端使用 MAX9814 , 带AGC的MIC放大芯片, 放大后的信号可直接输ADC
2. DMA + ADC,  fs = 180khz 过采样, ADC精度: 12bit , DMA长度 8192
3. DMA buffer 满了以后, 做去直流分量运算 同时转换数据成浮点数组. (免得FFT后第一根谱线一直有高分量)
4. 传到 FIR Decimate 做 纯浮点低通滤波 + 4倍下变频.  fc = 18khz, fstop = 22khz, A = -60db
    fs = 180khz --- 4 decimator---> 45khz
    有效信号频率 f = fs/2 = 22.5khz
5. 将数据做 纯浮点 2048点 FFT 运算.
6. 利用 tanh 函数, 将数据前段线性, 后段非线性扫描上屏幕.
7. 刷新屏幕, 屏幕刷新率 = 180k / 8192 约 22fps

出0入0汤圆

发表于 2016-12-22 10:24:08 | 显示全部楼层
http://v.youku.com/v_show/id_XMT ... m=a2hzp.8244740.0.0
直接这样吧

出0入0汤圆

发表于 2016-12-22 11:14:43 | 显示全部楼层
学习

出0入0汤圆

发表于 2016-12-22 11:42:05 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2016-12-22 12:27:19 | 显示全部楼层
学习了 !

出0入0汤圆

发表于 2016-12-22 14:03:43 | 显示全部楼层
给米大神顶贴

出0入0汤圆

发表于 2016-12-22 14:11:27 | 显示全部楼层
给米大神顶帖,跟顶

出0入0汤圆

 楼主| 发表于 2016-12-22 17:57:24 | 显示全部楼层

谢谢!~     .

出0入0汤圆

发表于 2016-12-22 18:05:13 来自手机 | 显示全部楼层
顶大神   学习

出10入10汤圆

发表于 2016-12-22 19:22:35 | 显示全部楼层
很棒的经验总结,学习了

出0入0汤圆

发表于 2016-12-22 20:01:25 | 显示全部楼层
学习学习

出0入0汤圆

 楼主| 发表于 2016-12-23 10:01:41 | 显示全部楼层
很多人看了视频, 回复甚少啊..

出0入0汤圆

发表于 2016-12-23 10:26:02 | 显示全部楼层
gujiamao_love 发表于 2016-12-22 10:24
http://v.youku.com/v_show/id_XMTUzMDA2ODk3Ng==.html?spm=a2hzp.8244740.0.0
直接这样吧

你的也没贴成功

出0入0汤圆

 楼主| 发表于 2016-12-24 08:55:43 来自手机 | 显示全部楼层
现在很少人玩这个?  还是自己顶一下吧~

出0入0汤圆

发表于 2016-12-24 10:31:15 来自手机 | 显示全部楼层
很棒,很多概念解释的很好。最后的效果很漂亮

出0入0汤圆

发表于 2016-12-24 10:32:48 来自手机 | 显示全部楼层
非常好  看过很多频谱总觉得差点儿味儿 楼主这个不错

出0入0汤圆

 楼主| 发表于 2016-12-24 13:07:09 来自手机 | 显示全部楼层
kenshudemayi 发表于 2016-12-24 10:32
非常好  看过很多频谱总觉得差点儿味儿 楼主这个不错

我比较喜欢对人声频域范围的那种细节诠释~

出0入0汤圆

发表于 2016-12-24 13:25:31 | 显示全部楼层
kayatsl 发表于 2016-12-22 10:07
先占个楼, 留个坑给自己后面踩.

第6点是什么作用,不是很明白

出0入0汤圆

发表于 2016-12-24 13:59:25 | 显示全部楼层
楼主说得很好啊,我之前做的都踩了楼主所说的坑,还得继续改进,对了,MAX9814好像是用于麦克风的,可以用在这里吗?

出0入0汤圆

 楼主| 发表于 2016-12-24 14:05:48 来自手机 | 显示全部楼层
binbinDIY 发表于 2016-12-24 13:59
楼主说得很好啊,我之前做的都踩了楼主所说的坑,还得继续改进,对了,MAX9814好像是用于麦克风的,可以用 ...

看你的音源, 我的音源就是麦克风, 他会有个偏值电压, 如果你的音源是line in的话, 可以用电容耦合

出0入0汤圆

 楼主| 发表于 2016-12-24 14:07:47 来自手机 | 显示全部楼层
pazulin 发表于 2016-12-24 13:25
第6点是什么作用,不是很明白

因为屏幕只有128列, 而数据有2048列, 可以再看一次视频末段~

出0入0汤圆

发表于 2016-12-24 18:00:33 | 显示全部楼层
感谢楼主的视频,末尾看起来效果很棒啊……这里有几个问题想请教一下楼主

1.您用的STM32的哪个系列做的呢,主频多少?
2.完成2048点的一次FFT运算,需要多久的CPU时间呢?
3.从显示效果看,是不是越高的帧率越好看呢?

出0入0汤圆

 楼主| 发表于 2016-12-24 18:12:17 来自手机 | 显示全部楼层
wz18th 发表于 2016-12-24 18:00
感谢楼主的视频,末尾看起来效果很棒啊……这里有几个问题想请教一下楼主:

1.您用的STM32的哪个系 ...

stm32f446, 主频 180mhz
2048点 浮点FFT还好, 耗时也就2ms多点.
大部分时间在于fir

帧率以符合视觉残留为宜, 不需要追求过快的帧率, 再说, 屏幕控制器也不一定支持那么高的帧率~

出0入0汤圆

发表于 2016-12-24 18:35:27 | 显示全部楼层
顶!d=====( ̄▽ ̄*)b一下,讲的很好

出0入0汤圆

发表于 2016-12-24 19:11:50 | 显示全部楼层
楼主是真爱,顶一下:)
随便说说自己的看法,
做音频dft如果以音乐视觉效果为标准,感觉根本用不着显示20KHZ的带宽,4k就够了。
因为99%的乐器,人声的基频都在4K以内,之所以声音回放20K的范围,是为了人耳可听范围内尽可能展现谐波,谐波是体现乐器特色的,但换成视觉反应,谐波恰恰是不必要的。
事实上,音乐是有标准的,标准钢琴从27.5~4186HZ,才88个频率点,其他人声乐器也一样,必须遵守这个原则,否则就是噪音,如何准确表示这88个音个人觉得是重点。
没有实践过,仅供参考,再赞一下楼主:)

出0入0汤圆

 楼主| 发表于 2016-12-24 20:12:55 来自手机 | 显示全部楼层
teddeng 发表于 2016-12-24 19:11
楼主是真爱,顶一下:)
随便说说自己的看法,
做音频dft如果以音乐视觉效果为标准,感觉根本用不着显示20K ...

难得的长评论, 说得不错~

我之前做的时候也试过你说的方案, 只扫4k频率范围到屏幕上, 而结果就是有些耳朵听得到, 但屏幕看不到谱线的现象发生, 视觉效果不和谐.

所以最终还是将全频段都扫, 只是将后面的频域大力压缩.

出0入0汤圆

发表于 2016-12-25 01:54:13 来自手机 | 显示全部楼层
kayatsl 发表于 2016-12-24 20:12
难得的长评论, 说得不错~

我之前做的时候也试过你说的方案, 只扫4k频率范围到屏幕上, 而结果就是有些耳 ...

非线性显示有没有一个什么函数?代码共享一下就好了

出0入0汤圆

 楼主| 发表于 2016-12-25 09:30:51 来自手机 | 显示全部楼层
deadline2012 发表于 2016-12-25 01:54
非线性显示有没有一个什么函数?代码共享一下就好了

第6点,
其实非线性函数有不少,
比如 -1/x  ,  log,   sqrt(x) 等~
但是这些函数都有缺点, 就是线性段很短, 而且特殊解的时候, 斜率不为1, 这就导致在斜率>1的时候, 屏幕上同一根谱线会扫描很多列, 效果不好看~

所以最终选 arctan(x) 函数, 主要几个特性:
1. 在 x 的过零点时, y的解也为0
2. 在 x 过零点, 函数的导数解为1, 也就是斜率为1
3. 斜率为线性的过渡段比较长.
4. 当 x 趋向无限大时, y无限逼近某个固定值

下面附上函数图像给你感受一下.

代码不重要, 重要的是思想, 思想理解到位了, 代码也就是一两行的事情~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入101汤圆

发表于 2016-12-25 10:15:02 | 显示全部楼层
看起来很专业

出0入0汤圆

发表于 2016-12-25 12:01:02 | 显示全部楼层
kayatsl 发表于 2016-12-25 09:30
第6点,
其实非线性函数有不少,
比如 -1/x  ,  log,   sqrt(x) 等~


我看了下标准的钢琴键与频率的对应关系线,发现频率是一个等比数列,可能也许横坐标用对数的方式更好。

Y轴的幅值你是用了dB还是直接的数据呢?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-12-25 12:17:41 | 显示全部楼层
还有个想法,既然高于4kHz的频率分量是前面基频的高次谐波,那么就只显示低于4k的部分,然后将高次谐波的能量和基波相加

出0入0汤圆

发表于 2016-12-25 12:21:54 | 显示全部楼层
谢谢楼主帮忙填坑

出0入0汤圆

 楼主| 发表于 2016-12-25 12:42:13 来自手机 | 显示全部楼层
deadline2012 发表于 2016-12-25 12:01
我看了下标准的钢琴键与频率的对应关系线,发现频率是一个等比数列,可能也许横坐标用对数的方式更好。

...

纵坐标跟横坐标一样是 atan, 因为屏幕分辨率不高, 所以没用对数

横坐标用对数, 看着不大舒服, 毕竟屏小~

出0入0汤圆

 楼主| 发表于 2016-12-25 12:44:02 来自手机 | 显示全部楼层
deadline2012 发表于 2016-12-25 12:17
还有个想法,既然高于4kHz的频率分量是前面基频的高次谐波,那么就只显示低于4k的部分,然后将高次谐波的能 ...

这个点, 我也没想到, 可以分析一下~

不错的建议!~ 谢谢~

出0入0汤圆

 楼主| 发表于 2016-12-25 13:08:24 来自手机 | 显示全部楼层
deadline2012 发表于 2016-12-25 12:17
还有个想法,既然高于4kHz的频率分量是前面基频的高次谐波,那么就只显示低于4k的部分,然后将高次谐波的能 ...

如果只是针对特定乐器, 比如你说的钢琴, 有固定频点, 是有可能实现的~
但如果做普通的音乐频谱的时候, 你不知道原始乐器, 甚至可能是人声~
这时候, 当你获得高频分量的时候, 你是无法知道他是哪个基波频率的n次谐波, 甚至他可能是多个基波的谐波分量叠加~

出0入0汤圆

 楼主| 发表于 2016-12-25 13:09:24 来自手机 | 显示全部楼层
fengyunyu 发表于 2016-12-25 10:15
看起来很专业

没有啦!~ 只是做的过程中的一些小感悟~

出0入0汤圆

发表于 2016-12-25 14:43:30 | 显示全部楼层
kayatsl 发表于 2016-12-24 18:12
stm32f446, 主频 180mhz
2048点 浮点FFT还好, 耗时也就2ms多点.
大部分时间在于fir

感谢回复!

我打算把读取的wav文件直接做频谱图显示出来,一般音频文件的采样率是44100或者48000Hz,那么这样的话有做FIR滤波的必要吗?

出0入0汤圆

 楼主| 发表于 2016-12-25 15:45:12 来自手机 | 显示全部楼层
wz18th 发表于 2016-12-25 14:43
感谢回复!

我打算把读取的wav文件直接做频谱图显示出来,一般音频文件的采样率是44100或者48000Hz,那 ...

可以不做, 我是因为没加硬件滤波器, 所以才需要用过采样, 再通过软件滤波

出0入0汤圆

发表于 2016-12-25 20:02:28 | 显示全部楼层
讲的真的很精彩和透彻深入!学习了

出0入0汤圆

发表于 2016-12-26 16:21:48 | 显示全部楼层
再顶顶米大师

出0入0汤圆

发表于 2016-12-26 17:23:26 | 显示全部楼层
好东西,可以学习dsp处理了

出0入0汤圆

发表于 2016-12-26 17:38:22 | 显示全部楼层
mark一下回去看

出0入0汤圆

发表于 2016-12-27 21:31:07 | 显示全部楼层
厉害了,米神 ~

出0入0汤圆

发表于 2016-12-28 06:31:55 | 显示全部楼层
讲的真的很精彩

出0入4汤圆

发表于 2016-12-28 17:05:46 | 显示全部楼层
kayatsl 发表于 2016-12-22 10:07
先占个楼, 留个坑给自己后面踩.


透彻,理论 +工程实践都透彻,挺厉害

出0入0汤圆

 楼主| 发表于 2016-12-29 14:40:27 | 显示全部楼层
acmilannast 发表于 2016-12-28 17:05
透彻,理论 +工程实践都透彻,挺厉害

谢谢评价..!~  

        过奖...!~~

出0入0汤圆

发表于 2016-12-29 15:22:55 来自手机 | 显示全部楼层
视频说的很透彻。感谢楼主分享。

出0入0汤圆

发表于 2016-12-29 15:23:28 来自手机 | 显示全部楼层
下一步就看楼主啥时候准备开源代码了。谢谢楼主

出0入0汤圆

 楼主| 发表于 2016-12-31 00:14:36 来自手机 | 显示全部楼层
FireHe 发表于 2016-12-29 15:23
下一步就看楼主啥时候准备开源代码了。谢谢楼主

回复的人还是太少了, 没什么动力~~~

出0入0汤圆

发表于 2016-12-31 00:46:18 来自手机 | 显示全部楼层
楼主声音采集用mic吗

出0入0汤圆

 楼主| 发表于 2016-12-31 00:47:32 | 显示全部楼层
桂电小手 发表于 2016-12-31 00:46
楼主声音采集用mic吗

是的                  

出0入0汤圆

发表于 2016-12-31 01:20:20 | 显示全部楼层
kayatsl 发表于 2016-12-31 00:14
回复的人还是太少了, 没什么动力~~~

大家只是没注意到而已

出0入0汤圆

发表于 2016-12-31 17:28:14 来自手机 | 显示全部楼层
学习了,感谢分享

出0入0汤圆

发表于 2016-12-31 20:29:03 | 显示全部楼层
确实楼主讲的坑都跳进去过!说来也忏愧,当时在学校一心想做个频谱出来,后来做出来了就没深究,现在想来楼主说的坑都踩进去了问题在于没有深刻理解信号的输入与变换后的关系。受教了!

出0入0汤圆

发表于 2016-12-31 22:19:50 | 显示全部楼层
一直想学FFT

出0入0汤圆

发表于 2016-12-31 22:40:05 | 显示全部楼层
谢谢分享!

出0入0汤圆

 楼主| 发表于 2016-12-31 23:13:40 | 显示全部楼层
laylovesb1314 发表于 2016-12-31 20:29
确实楼主讲的坑都跳进去过!说来也忏愧,当时在学校一心想做个频谱出来,后来做出来了就没深究,现在想来楼 ...

相比把一个东西做出来更可怕的是, 把一个东西做精..

不要被工程思维洗脑.

出0入0汤圆

发表于 2017-1-4 05:30:54 来自手机 | 显示全部楼层
kayatsl 发表于 2016-12-22 10:07
先占个楼, 留个坑给自己后面踩.



这个方案有现成的硬件卖吗?请给我链接。

出0入0汤圆

发表于 2017-1-4 08:40:24 | 显示全部楼层
一直认为这个东西会动就行。动了说明开始放音乐了。

出0入0汤圆

发表于 2017-1-4 08:49:02 | 显示全部楼层
mark      

出0入0汤圆

 楼主| 发表于 2017-1-4 09:33:38 | 显示全部楼层
zyw19987 发表于 2017-1-4 05:30
这个方案有现成的硬件卖吗?请给我链接。

有单独的各个模块的开发板, 自己搭咯..

出0入0汤圆

发表于 2017-1-5 00:27:46 来自手机 | 显示全部楼层
kayatsl 发表于 2017-1-4 09:33
有单独的各个模块的开发板, 自己搭咯..

怎么联系,有现成的模块吗?

出0入0汤圆

发表于 2017-1-5 21:01:36 | 显示全部楼层
上次看安富莱的帖子说要对幅值取对数,可以把中高频的细节展示出来,效果更好

出0入0汤圆

 楼主| 发表于 2017-4-10 21:36:55 | 显示全部楼层
水煮鱼 发表于 2017-1-5 21:01
上次看安富莱的帖子说要对幅值取对数,可以把中高频的细节展示出来,效果更好 ...

中高频多数是谐波成分.

看也看不出啥东西..

出0入0汤圆

发表于 2017-4-19 09:38:29 | 显示全部楼层
kayatsl 发表于 2017-4-10 21:36
中高频多数是谐波成分.

看也看不出啥东西..

楼主可以开源吗,正在学习这块,希望可以学习下。

出0入0汤圆

发表于 2017-4-19 15:18:20 | 显示全部楼层
学习了,谢谢楼主分享!

出0入0汤圆

发表于 2017-4-22 10:27:08 | 显示全部楼层
楼主,你是采用stm32f4系列做的,我想通过stm32f103,1024点来做,是否可以做出你的效果,做去直流分量运算 同时转换数据成浮点数组是怎么操作的?

出0入0汤圆

 楼主| 发表于 2017-4-25 19:07:16 | 显示全部楼层
河图洛书 发表于 2017-4-22 10:27
楼主,你是采用stm32f4系列做的,我想通过stm32f103,1024点来做,是否可以做出你的效果,做去直流分量运算  ...

hello , F1 的浮点运算能力太弱,没法在这么短时间内完成这么大量的运算,你可以转成定点运算, 也许速度能上来.  不过做这么长的点数, 取模的时候够呛.

去直流说白了就是拉一根平均线, 将偏置放到平均线上.

F1 最好不要用浮点, 会算哭..

出0入0汤圆

发表于 2017-4-26 09:19:09 | 显示全部楼层
楼主加的是什么窗? 这也不属于同步采样泄露肯定明显啊

出0入0汤圆

发表于 2017-4-26 09:20:09 | 显示全部楼层
kayatsl 发表于 2017-4-25 19:07
hello , F1 的浮点运算能力太弱,没法在这么短时间内完成这么大量的运算,你可以转成定点运算, 也许速度能 ...

恩f1用Q15整点算还是挺快的

出0入0汤圆

发表于 2017-5-9 09:24:20 | 显示全部楼层
我是来学习的

出0入0汤圆

发表于 2017-5-10 02:15:41 | 显示全部楼层
mark。,。,。,

出0入0汤圆

发表于 2017-5-17 22:41:03 | 显示全部楼层
本帖最后由 thuas 于 2017-5-17 22:52 编辑

看到优酷楼主的视频,没留活动地址,花了一整晚上搜索遗迹,最后花费80大元采购一枚邀请码,终于找到你真身了。相当不容易啊
能加企鹅号交流下

还看到本论坛 Borden  也发过一篇他做的频谱显示,都非常好

出0入0汤圆

 楼主| 发表于 2017-5-18 11:23:40 | 显示全部楼层
thuas 发表于 2017-5-17 22:41
看到优酷楼主的视频,没留活动地址,花了一整晚上搜索遗迹,最后花费80大元采购一枚邀请码,终于找到你真身 ...

辛苦你了啊~~~

是有够不容易的...这都能给你找到..!~

出0入0汤圆

发表于 2017-5-19 10:21:19 | 显示全部楼层
mark                                    

出0入0汤圆

发表于 2017-6-28 12:34:55 | 显示全部楼层
kayatsl 发表于 2017-5-18 11:23
辛苦你了啊~~~

是有够不容易的...这都能给你找到..!~

后来折腾完美了吗?

出0入0汤圆

 楼主| 发表于 2017-6-28 23:29:40 | 显示全部楼层
thuas 发表于 2017-6-28 12:34
后来折腾完美了吗?

没去折腾了, 其实是一年多前弄的东西...

出0入0汤圆

发表于 2017-8-4 11:29:14 | 显示全部楼层
MARK,非常有用

出0入0汤圆

发表于 2017-10-17 10:21:18 来自手机 | 显示全部楼层
非常欣赏楼主做的频谱显示,我也是优酷看到的,然后搜索作者名字找到此论坛,花80元注册帐号进来了,楼主可以有尝分享源程序作参考吗

出0入0汤圆

发表于 2017-10-19 11:01:24 | 显示全部楼层
然后  还是没动力发码出来么?

出0入0汤圆

发表于 2017-10-21 16:33:31 | 显示全部楼层
正在学习做频谱,楼主将的太好了,启发很大,可惜本人水平太差,楼主的视频讲的再详细和具体一些就更好了!

出0入0汤圆

发表于 2018-1-30 18:46:22 | 显示全部楼层
本帖最后由 ycii 于 2018-1-31 10:40 编辑


另,楼主是否做了加窗处理?

出0入0汤圆

 楼主| 发表于 2018-2-1 16:18:02 | 显示全部楼层
ycii 发表于 2018-1-30 18:46
另,楼主是否做了加窗处理?

没有做, 对于音频来说, 感觉加窗的必要性不是很大..

出100入18汤圆

发表于 2018-2-5 12:39:49 | 显示全部楼层
最近突然对音频频谱感兴趣了,看了楼主的视频,真是大赞,如果每个人踩了坑都能像楼主一样总结,然后做出这么好的视频给大家,势必会对后来人有非常大的帮助!
感谢楼主!!!!!好人一生平安!

出0入0汤圆

发表于 2018-3-31 10:38:38 | 显示全部楼层
视频中讲的很全面,坑确实很多呀!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 12:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表