完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我最近在研究EasyMXPro for STM32 dev,正在尝试使用DAC创建一个简单的单声道波表合成器,可播放的通道。但是,我有一个MIDI键盘,我有以下问题: 我有一个循环遍历波表值(以MCU时钟的速度)循环。程序在阵列中循环的速率显然使我的频率与波表中正弦波的基频不同。对于数组中的每个样本,延迟/加快程序执行的最佳方法是什么,因为我需要以不同的速率循环访问数组以获得键盘上的不同音符?我尝试过使用简单的延迟,但是对于音符频率的每次变化,延迟量必须特别改变。是否有一种更简单的方法可以做到这一点,我没想过(也许使用计时器)? 在此先感谢任何有用的答案! |
|
相关推荐
6个回答
|
|
你也猜想过计时器了,你可以尝试一下看看结果会怎样
|
|
|
|
是否可以在程序里将入中断或者延时呢?
|
|
|
|
大多数基于实际表格的合成器使用固定的回放采样率,以及分数相位增量和累加器寄存器。
基本上,计算所需输出频率的每个采样周期的相位增量,并预先乘以2的大功率,比如1024或甚至更高 - 使用ARM MCU,您可能只需乘以2 ^ 16。 每个周期将该相位增量添加到累加器寄存器。 累加器将比输入到波形查找表中的地址更宽(具有更高的精度),因此只需忽略低位并仅使用与查找表具有地址位一样多的高位。因此,您可能正在以32位精度计算时间,但仅使用高16位来查找65536元素表中的样本。 结果是,虽然给定样本的索引时间是近似的,但累积时间具有许多精度。这很容易获得亚Hz分辨率,而根本不需要改变定时器或DAC时钟。这一点很重要,因为通常DAC中的清理电路和其输出后的电路仅针对少量采样率设计。 请注意,如果您的查找表包含具有对称性的正弦波或其他波形,您可以缩小其大小 - 对于正弦,您实际上只需要存储四分之一波,因为您可以通过反转相位或幅度来获得其他三个象限。 虽然这个问题具体说明单声道输出,但这种技术可以扩展到复音输出。现代处理器在执行相当数量的此类查找并将它们相加以在典型的音频采样率下馈送到DAC时几乎没有问题。 |
|
|
|
楼上这种是否可以被称为“ 直接数字合成 ”
|
|
|
|
即便是2.5MHz的Z-80也可以在9 kHz的采样率下处理4个语音波表合成(尽管只有8位).
|
|
|
|
我尝试使用以下链接中的代码作为模板来实现此方法:链接我遇到的问题是我在16Mhz使用MCU,但是,当我在链接中的等式中使用16Mhz时(为了确定步长,我获得了不到所需频率输出的一半。使用8Mhz我得到一个更接近的输出值,但仍然不是一个精确的输出值。这个等式是否存在问题,或者问题更可能与我使用的时钟值有关?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:44 , Processed in 0.878670 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号