midi - 正弦 LUT VHDL 无法模拟低于 800 Hz 的频率

标签 midi vhdl lookup-tables trigonometry

我使用 256 个元素为 VHDL 制作了一个正弦 LUT。

我使用 MIDI 输入,因此值范围为 8.17Hz(注释 #0)到 12543.85z(注释 #127)。

我有另一个 LUT,用于计算必须发送多少值到 48 kHz 编解码器才能播放声音(8.17Hz 频率需要 48000/8.17 = 5870 值)。

我还有另一个包含索引因子的 LUT,即 256/num_Values ,用于调用 sin 表中的值(例如:100*256/5870 = 4(带整数舍入))。

我将此索引因子发送到另一个 VHDL 文件,该文件用于计算应发回哪个值。 (例如:index = index_factor*step_counter)

当我得到这个索引时,我将它除以 100,然后调用 sineLUT[index]以获得以所需频率生成正弦波所需的值。

问题是,似乎只有最后 51 个音符对我有用,我不知道为什么。在低于该频率(<650赫兹)的任何情况下,它似乎都会卡在一个恒定的音符上,并且每次我尝试降低音符时音量都会减小。

如果您需要我的部分代码,请告诉我。

最佳答案

只是猜测,我怀疑您的 step_counter 没有经历足够的周期,因此您的索引(进入正弦 lut)对于较低频率不会经历完整的 360 度。

为了获得更多帮助,您可能需要发布代码。

顺便说一句,您为什么不使用更像传统 DDS 的东西呢? Analog Devices 有一篇关于基础知识的精彩文章:DDS Tutorial

关于midi - 正弦 LUT VHDL 无法模拟低于 800 Hz 的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345053/

相关文章:

java - 如何将 midi 从 java 程序发送到 OSX 上的 IAC 总线

windows - 使用 MME 和 DirectMusic 时的 ANSI 或 OEM 代码页?

c - 将数据读入 VHDL

message - ModelSim 消息查看器为空

domain-driven-design - 查找值是否应该建模为聚合根?

c++ - 使用查找表的可选帮助进行对象查找,如果未使用则必须优化掉

可以使用dls或sf2文件的java合成器

java - Java 中的 midi 文件问题

c - 我无法从 UART/Nios 读取

c# - 在 C# 中完成查找的最快方法以及如何处理 double 值的不精确性?