This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:计算音频样本并将其发送到 DAC "动态& quot;

Guru**** 1831610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/579856/tm4c123gh6pm-calculating-and-sending-audio-samples-to-a-dac-on-the-fly

器件型号:TM4C123GH6PM

大家好、我 最近使用了 MAX541音频 DAC 芯片(此处提供数据表)和 TM4C123G LaunchPad。  我的音频输出工作正常、但现在我正在尝试让它播放不同的正弦波音调、这些正弦波音调是根据用户想要听到的音调"动态"计算的。

我的设计方法是设置 一 个"多次触发" SysTick 中断、每~1500个周期调用一次 ISR。  ISR 计算当前的采样值、并使用 SSI 将其发送到 MAX541 DAC 芯片。

我遇到的问题是、我听到的音调不是恒定的。  它的间距会缓慢下降。  我非常确信、我的"动态"采样计算花费的时间太长、从而导致在将采样值获取到 DAC 以供输出时出现延迟。

我非常确定这一点、因为我可以在开始音频回放之前、先将单个正弦波样本预先计算到数组中、然后在开始音频回放之后 、只需循环这些样本、 在这种情况下、将当前索引上的采样值发送到 DAC、并且间距保持恒定。

使用“动态”方法时,我认为延迟可能是由 math.h 中的 sin ()调用引起的,我在计算当前样本值时需要执行该调用。  我已经单步执行了这个函数的代码、它运行了很多指令。

我想知道、是否有人有任何想法或建议可以让它在没有延迟问题的情况下工作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我不知道故事中的"音频"部分-尽管我希望有时间来播放音频生成。 但我在信号方面有一些经验。

    有几种解决方案可以帮助你生成罪恶:存储器或动态表。

    具有如此多 sin 值的存储器表对于非常有限的 MCU 是很常见的-对于 TM4C 来说并不是很常见的-但我们的想法仍然是定义所需的"步数"(sin 输出的精细分辨率)、 只需读取序列中表的每个乘法器。

    即时计算并不坏:只需在需要前按下一个值计算即可-换言之、更改信号输出、计算下一个值、然后返回到不执行任何操作、直至有新的更改。 新的变化将立即发生。

    使用 sin 64位(C 编译器上的默认值、使用 double)和 sin 32位(使用 float - TM4C 的 FPU HW 的大小)函数来比较 CPU 所需的周期数。 确保在 MCU 中启用浮点。

    至于信号输出本身、我建议您使用 PWM 外设- sin 实际上是占空比的变化。

    谢谢

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我建议查找 CORDIC 算法、并将此 链接 作为 C 语言实现的示例

    此外、ARM 的 CMSIS 封装还具有一些快速的三角函数、即 float32或 Q15/Q31。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruno Saraiva"]

    使用 sin 64位(C 编译器上的默认值、使用 double)和 sin 32位(使用 float - TM4C 的 FPU HW 的大小)函数来比较 CPU 所需的周期数。  

    [/报价]

    Bruno -感谢您的建议。  我完全忘记了 sin (double) vs sinf (float)。  现在我只做一些快速测试,我就会看到 sinf()函数确实更快(这是有道理的)。  此外、是的、我同意、我可能只需计算所需信号的信号周期、然后对其进行缓存并循环。  再次感谢、非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Petrei"]

    您好!

    我建议查找 CORDIC 算法、并将此 链接 作为 C 语言实现的示例

    此外、ARM 的 CMSIS 封装还具有一些快速的三角函数、即 float32或 Q15/Q31。

    [/报价]

    Petrei——谢谢您提供的信息!  我不知道该 CORDIC 算法或 ARM 的 CMSIS。  我找到 此文档 是为了了解如何将其与 TI 的 Code Composer 结合使用、现在我正在阅读。