侵权投诉
订阅
纠错
加入自媒体

工程师用STM32F4造出最小音频合成器

2019-04-22 09:34
来源: 与非网

Noise Nugget是一款紧凑型数字合成器,基于180MHz Cortex-M4和带耳机放大器的高品质音频DAC。

我在这个项目中的目标是创造一个音频合成的“瑞士军刀”。 在最小和最便宜的板上包装最大功能。

image.png

凭借其所有连接(USB,2 x音频输出,1 x音频输入,I2C,UART,GPIO),它可用于许多不同的任务:

数字合成器,带MIDI接口或其他一些控制手段

吉他踏板或合成器的音频效果(延迟,混响,失真)

音频FX触发板,播放预先录制的声音

音频播放,从输入录制声音,然后按一下按钮即可播放

USB声音接口

硬件设计

硬件设计的主要目标是简单和占用空间小。

该系统的核心显然是STM32F446微控制器。 它基于ARM Cortex-M4内核,浮点单元运行频率为180MHz,还有大量外设。

工程师用STM32F4造出最小音频合成器

在STM32F4周围,我们有:

USB micro-B连接器

一个电源稳压器,可从USB连接器的5V提供3.3V电压

用于STM32F4时钟的晶体振荡器

一个用户按钮和一个按钮进入设备固件更新(DFU)模式

用于存储样本数据的闪存

自定义IO

一个调试头

一个耳机插孔

音频数模转换器(DAC)

我本来可以使用STM32F4的DAC,但一方面它们只有12位而16位用于正确的音频DAC,另一方面它需要额外的电路来驱动耳机。 因此,使用SGTL5000可提供更高的音质和简单性。

SGTL5000还有很多IO选项:

耳机输出

线路输出

线路输入

麦克风输入

这意味着不同应用程序有很多选项。

在Noise Nugget的rev-B上,我没有使用麦克风输入。 我认为这是一个错误,因为电路板上有一些用于MEMS麦克风的空间,这将开启更多可能性。 例如实时语音效果或样本录制。

DFU按钮的设计灵感来自Numworks开放式计算器。 如果在插入USB电缆时按下按钮,STM32F4将自动进入DFU模式。 然后,在不使用任何调试探针的情况下安装不同的固件非常容易。

软件设计

Noise Nugget的软件是用Ada编写的。 Ada编程语言都是关于功能安全的,也就是说,检测软件何时没有做到应该做的事情(错误!)。 使用Ada,您可以快速准确地知道出现了什么问题,而不是在缓冲区溢出或未初始化的驱动程序上搔痒几个小时。 这意味着减少调试时间。 由于我没有足够的时间来开发这个软件,因此每分钟都很重要。

该软件最重要的方面是生成音频样本并将其发送到DAC。

样本是16位有符号整数,表示给定时间点的音频信号的值。

DAC配置为每秒44_100个样本(CD质量)。 如果软件无法以适当的速度传送样本,音频将出现故障(响亮的砰砰声和咔嗒声)。 所以这是系统真正的实时要求。

样本不是一个接一个地发送,而是在512个样本的缓冲区中*每个样本2个字节* 2个通道(立体声),所以2048个字节。 缓冲器B在发送缓冲器A时被填充,反之亦然(触发器缓冲器)。 来自音频输入的样本以类似的方式接收。 缓冲区的传输是通过DMA完成的,因此在该操作期间不使用CPU,这意味着生成样本的时间更长。

为了确保实时要求,我使用了Ada Ravenscar运行时。 您可以将其视为集成在Ada编程语言中的实时操作系统(RTOS)。 如果你想看看它的样子,我写了一篇关于它的博客文章。

系统中有两个任务:

音频任务,它具有最高优先级,因为它负责填充音频缓冲区。 这意味着只要有要填充的音频缓冲区,就会执行此任务。

另一项任务是在轮询循环中处理USB请求。 在将来,这可以移动到并中断处理程序。

在依赖性方面,驱动程序来自Ada_Drivers_Library ,这是我几年前开始的一个项目,旨在鼓励在微控制器上使用Ada。 音频合成器基于Raphael Amiard的ada-synth-lib 。

Noise Nugget的未来

我对Noise Nugget的未来有一些想法。 其中之一是拥有一个GUI,让用户可以使用基本模块(如振荡器,滤波器,效果等)构建声音。类似于青少年音频工具,但实时,不需要为用户提供任何代码。 这可以成为一个有趣和多功能的微型合成器。

声明: 本文系OFweek根据授权转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号