我最近在研究EasyMXPro for STM32 dev,正在尝试使用DAC创建一个简单的单声道波表合成器,可播放的通道。但是,我有一个MIDI键盘,我有以下问题:我有一个循环遍历波表值(以MCU时钟的速度)循环。程序在阵列中循环的速率显然使我的频率与波表中正弦波的基频不同。对于数组中的每个样本,延迟/加快程序执行的最佳方法是什么,因为我需要以不同的速率循环访问数组以获得键盘上的不同音符?我尝试过使用简单的延迟,但是对于音符频率的每次变化,延迟量必须特别改变。是否有一种更简单的方法可以做到这一点,我没想过(也许使用计时器)?在此先感谢任何有用的答案!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
基本上,计算所需输出频率的每个采样周期的相位增量,并预先乘以2的大功率,比如1024或甚至更高 - 使用ARM MCU,您可能只需乘以2 ^ 16。
每个周期将该相位增量添加到累加器寄存器。
累加器将比输入到波形查找表中的地址更宽(具有更高的精度),因此只需忽略低位并仅使用与查找表具有地址位一样多的高位。因此,您可能正在以32位精度计算时间,但仅使用高16位来查找65536元素表中的样本。
结果是,虽然给定样本的索引时间是近似的,但累积时间具有许多精度。这很容易获得亚Hz分辨率,而根本不需要改变定时器或DAC时钟。这一点很重要,因为通常DAC中的清理电路和其输出后的电路仅针对少量采样率设计。
请注意,如果您的查找表包含具有对称性的正弦波或其他波形,您可以缩小其大小 - 对于正弦,您实际上只需要存储四分之一波,因为您可以通过反转相位或幅度来获得其他三个象限。
虽然这个问题具体说明单声道输出,但这种技术可以扩展到复音输出。现代处理器在执行相当数量的此类查找并将它们相加以在典型的音频采样率下馈送到DAC时几乎没有问题。
一周热门 更多>