矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 9447|回复: 24

做了一g微型的音乐频谱显示器

[复制链接]
     
发表于 2019-6-18 17:49:20 | 显示全部楼层 |阅读模式
本帖最后由 csaaa 于 2019-6-18 17:54 编辑

我既是发烧友也是硬件工程师还是个程序员。
为了不浪费这几个不值得一提的头衔,我就做了一个能玩意,能把这几个提点结合在一起的。
本来想发到单片机栏目中的,不过想来想去,这个东东还是和音响有更大的关联,于是就放到这了。
我设计的是一个音乐频谱显示器,手头上的材料有ARM-M3的MCU,可以用来采样音频,运算,显示,5532的国产运放,0.96寸的IPS彩色液晶屏。
我设计的目标:
1.双声道采集;
2.带宽覆盖完整的50-20khz段;
3.彩色显示分辨率128段,64级电平指示,动态范围不低于或超越目前市面能见到的最高指标;
4.超小,微型

开始画电路图
电路图.png
画电路板
PCB.png
开始编程
编程思路是这样的:
要显示20-20KHZ的频谱范围,采样率必须要大于最高采样率的2倍,设定在40KHZ。为了减轻CPU的负担,充分利用好ARM内部的资源,需要使用DMA对音频进行采样,目前采样256点,采样定时器使用TIM2。DMA数据满后触发中断,再计算FFT。
接下来要驱动LCD,由于IO富裕,所以使用8080并口,LCD是16位真彩的,使用RGB565格式发送。
最后做成的是这样的
主图.jpg
白底1.jpg
2.jpg
有个电池在上面,在不显示音乐的时候,显示万年历。算是充分利用了。
8.jpg
大家看看还有什么可以开发的功能吗?
场景.jpg

评分

6

查看全部评分

     
 楼主| 发表于 2019-6-18 18:41:55 | 显示全部楼层
嘉善人 发表于 2019-6-18 18:36
这个小巧玲珑,很是喜欢。
我想能否还实用一点的
加上双声道的频率均衡器

这个体积恐怕再加均衡器有点困难了,需要另做一个屏幕,专门制作一个数字均衡器。所有的均衡量通过数字确定,均衡的频段通过按键选择,取消容易损坏的可调电阻和一堆的电容电感。完全通过运算来实现。目前正在考虑中。不过主要还是看需求。
回复 支持 1 反对 0

使用道具 举报

     
发表于 2019-6-18 18:05:51 | 显示全部楼层
很好,赞一个!
最好在这里科普一下FFT算法。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 18:24:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-18 18:31:49 | 显示全部楼层
qzlbwang 发表于 2019-6-18 18:05
很好,赞一个!
最好在这里科普一下FFT算法。

嗯。FFT算法是快速傅里叶变换是缩写。
怎么理解呢,以生活常识为例,就是我们听到的所有声音都是一系列单独的正弦波的叠加,正弦波的属性有频率,相位,幅度。这样组成了我们丰富多彩的声音世界。
各种声音组合叠加起来是很容易的,像我们同时说话一样,得到的声音就是组合的,但是要把这个声音再恢复成基本的正弦波单元是不太容易了,就需要运算,这种运算就是采集一段正弦波的数据再带入傅里叶方程做蝶形运算,俗称卷积和,正弦波是什么,正弦波的本质就是圆,我们这个宇宙是由各种圆组成的,即使是方的,我们也可以把它微分成无数个圆。总之最后得到的是一系列的点的对应的向量值,也就是幅值,这个一些列点其实就是由低到高的频率,幅值就是在这个频率上产生的幅度,这样就把一段声音分解成了不同频率上的幅度值,我把这个频率由做至右显示到屏幕上的x轴,再在y轴上画上这个幅值对应的长度就成了上图的频谱了。
FFT到底有什么用?,其实FFT的用处可大了,做频谱其实是大材小用了。无线电工程上经常需要测量无线电发射的驻波,必须用这个,否则你根本看不出来你的器材问题出在哪里。在军事上,在海水中检测某种船只,潜艇,需要描绘出声纹,就像指纹一样,想子弹的膛线一样,每种机械在工作时都会发出声音,我们能辨别不同的人在说话也是靠声纹,我们的大脑自动完成了这个过程不需要思考。声纹描绘的过程就是FFT运算的过程,只不过需要更强大的CPU才能更细致地描绘出每种声音的差别。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2019-6-18 18:33:30 | 显示全部楼层
以前做过,不过不是很理想
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 18:36:46 | 显示全部楼层
这个小巧玲珑,很是喜欢。
我想能否还实用一点的
加上双声道的频率均衡器
在触摸屏上能实行控制
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 18:40:47 | 显示全部楼层
csaaa 发表于 2019-6-18 18:31
嗯。FFT算法是快速傅里叶变换是缩写。
怎么理解呢,以生活常识为例,就是我们听到的所有声音都是一系列 ...

我的意思是采集的一系列数据是瞬时值(时域信号)如何通过FFT(快速傅里叶变换)转换为频域数据的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-18 18:44:54 | 显示全部楼层
本帖最后由 csaaa 于 2019-6-18 18:51 编辑
qzlbwang 发表于 2019-6-18 18:40
我的意思是采集的一系列数据是瞬时值(时域信号)如何通过FFT(快速傅里叶变换)转换为频域数据的。


这个说来话长了,那一堆公式画上去有点让人觉得故弄玄虚吧。实际制作的时候是采用了ST公司提供的DSP库来处理的,因为这个库是经过大量优化的,速度极快,否则很难保证实时性。
关于FFT的算法其实一搜一大堆啦。
这是我的FFT部分代码
void powerMag()
{         int32_t lX,lY;
                uint32_t i;
                for (i=0; i < NPT/2; i++)
                {
                        lX= (lBUFOUT1<<16)>>16; /* sine_cosine --> cos */
                        lY= (lBUFOUT1 >> 16);   /* sine_cosine --> sin */     
                        {
                                        float X=  NPT*((float)lX)/32768;
                                        float Y = NPT*((float)lY)/32768;
                                        float Mag = sqrt(X*X+ Y*Y)/NPT;  // 先平方和,再开方
                                        //Mag-=0.000001;
                                        if (Mag<filterlevel) Mag*=0.5;
                                         
                                if (i==0)
                                lBUFMAG1 = (uint32_t)(Mag*16384);                  //直流分量/2
                        //        else if(i<5)
                        //                lBUFMAG = (long)(Mag*16384);           //减弱低频
                                else
                                lBUFMAG1 = (uint32_t)(Mag*65535);            //此处倍数可控制幅度
                                lBUFMAG1>>=3;         //有放大器         值除以16
                                if (lBUFMAG1>SEGNUM) lBUFMAG1=SEGNUM;          //限幅
                                                                        //关于噪声门限
                    }   
                  }
}

main(){
...
                                                cr4_fft_64_stm32(lBUFOUT1,lBUFIN1,NPT);//调用DSP库作FFT变换
                                                powerMag();//计算频点幅值         结果是对称的,计算前一半即可

}
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 19:20:47 | 显示全部楼层
csaaa 发表于 2019-6-18 18:41
这个体积恐怕再加均衡器有点困难了,需要另做一个屏幕,专门制作一个数字均衡器。所有的均衡量通过数字确 ...

这个应该有销量的,尺寸要求在耳放面板上能放进。
最重要的是提升效果如何,去掉电容电感,效果如何?
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 19:36:36 | 显示全部楼层
楼主能否搞个手机上用的APP,这样大家的旧手机就有地方用了
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 19:49:25 | 显示全部楼层
像个双声道的音频示波器。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-18 20:15:17 | 显示全部楼层
嘉善人 发表于 2019-6-18 19:20
这个应该有销量的,尺寸要求在耳放面板上能放进。
最重要的是提升效果如何,去掉电容电感,效果如何?

提升过程虽然是计算出来的,实际上耳朵是听不出来的,最大增益在+-12db左右,可能能做到18。缺点是频点可能是死的,这个要看程序编写的难度。要快出品就写成死的,要灵活做频点就要慢慢摩算法。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 21:18:48 来自手机 | 显示全部楼层
这个太难了。在手机上实现容易多了。。。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-18 21:28:37 | 显示全部楼层
csaaa 发表于 2019-6-18 20:15
提升过程虽然是计算出来的,实际上耳朵是听不出来的,最大增益在+-12db左右,可能能做到18。缺点是频点可 ...

我的意思是代替掉体积庞大的电位器,用直流音量控制。
象QQ音乐里的自定义均衡器那样,只是效果不理想,我估计就是没有电感电容吧,是纯电子控制。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-19 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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