校正基于STM32的MIDI合成器的音符频率

2019-07-14 17:20发布

我最近在研究EasyMXPro for STM32 dev,正在尝试使用DAC创建一个简单的单声道波表合成器,可播放的通道。但是,我有一个MIDI键盘,我有以下问题:我有一个循环遍历波表值(以MCU时钟的速度)循环。程序在阵列中循环的速率显然使我的频率与波表中正弦波的基频不同。对于数组中的每个样本,延迟/加快程序执行的最佳方法是什么,因为我需要以不同的速率循环访问数组以获得键盘上的不同音符?我尝试过使用简单的延迟,但是对于音符频率的每次变化,延迟量必须特别改变。是否有一种更简单的方法可以做到这一点,我没想过(也许使用计时器)?在此先感谢任何有用的答案!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
xiaolu511
1楼-- · 2019-07-15 00:34
是否可以在程序里将入中断或者延时呢?
uvysdfydad
2楼-- · 2019-07-15 05:49
大多数基于实际表格的合成器使用固定的回放采样率,以及分数相位增量和累加器寄存器。

基本上,计算所需输出频率的每个采样周期的相位增量,并预先乘以2的大功率,比如1024或甚至更高 - 使用ARM MCU,您可能只需乘以2 ^ 16。

每个周期将该相位增量添加到累加器寄存器。

累加器将比输入到波形查找表中的地址更宽(具有更高的精度),因此只需忽略低位并仅使用与查找表具有地址位一样多的高位。因此,您可能正在以32位精度计算时间,但仅使用高16位来查找65536元素表中的样本。

结果是,虽然给定样本的索引时间是近似的,但累积时间具有许多精度。这很容易获得亚Hz分辨率,而根本不需要改变定时器或DAC时钟。这一点很重要,因为通常DAC中的清理电路和其输出后的电路仅针对少量采样率设计。

请注意,如果您的查找表包含具有对称性的正弦波或其他波形,您可以缩小其大小 - 对于正弦,您实际上只需要存储四分之一波,因为您可以通过反转相位或幅度来获得其他三个象限。

虽然这个问题具体说明单声道输出,但这种技术可以扩展到复音输出。现代处理器在执行相当数量的此类查找并将它们相加以在典型的音频采样率下馈送到DAC时几乎没有问题。
ZQW发烧友
3楼-- · 2019-07-15 06:25
 精彩回答 2  元偷偷看……
asgfafa
4楼-- · 2019-07-15 09:59
即便是2.5MHz的Z-80也可以在9 kHz的采样率下处理4个语音波表合成(尽管只有8位).
doublelove
5楼-- · 2019-07-15 10:07
我尝试使用以下链接中的代码作为模板来实现此方法:链接我遇到的问题是我在16Mhz使用MCU,但是,当我在链接中的等式中使用16Mhz时(为了确定步长,我获得了不到所需频率输出的一半。使用8Mhz我得到一个更接近的输出值,但仍然不是一个精确的输出值。这个等式是否存在问题,或者问题更可能与我使用的时钟值有关?

一周热门 更多>