gpt4 book ai didi

frequency - 计算一组数字的近似 LCM

转载 作者:行者123 更新时间:2023-12-02 03:18:50 28 4
gpt4 key购买 nike

我正在为微 Controller 编写音调发生器程序。

我使用硬件计时器触发中断,并检查是否需要在特定时刻针对给定音符将信号设置为高电平或低电平。

我使用的硬件非常有限,所以我运行计时器的速度越慢,我就越有时间做其他事情(串行通信、加载下一个要生成的笔记等)。

我需要找到我应该运行计时器以获得最佳结果的频率,即生成一个足够准确的频率并且仍然有时间计算其他内容。

为了实现这一点,我需要找到我需要的所有频率的近似值(在某个百分比值内,因为频率越高,它们的值越不精确,人耳才能注意到错误)播放:这个值将是运行硬件定时器的频率。

是否有足够简单的算法来计算这样的数字? (编辑,我将澄清“足够简单”:足够快以在 8 位 AVR 微 Controller 上运行少于 50 个值的时间 t << 1 秒,最坏情况下可在几十行中实现。)

最佳答案

LCM(a,b,c) = LCM(LCM(a,b),c)

因此,您可以循环计算 LCM,一次引入一个频率。

此外,

LCM(a,b) = a*b/GCD(a,b)

通过使用欧几里德算法,无需任何因式分解即可轻松计算 GCD。

要使其成为近似 LCM 的算法,请执行一些操作,例如将较低频率四舍五入为 10 Hz 的倍数,将较高频率四舍五入为 50 Hz 的倍数。另一个更有原则的想法是首先将频率转换为 Octave (我认为公式是 f 映射到 log(f/16)/log(2)) 这会给你一个介于 0 和 10 之间的数字(或稍高一些——但任何超过 10 的数字几乎都超出了人类的听力范围,因此你或许可以四舍五入)。您可以将 0-10 分成 50 个间隔 0.0、0.2、0.4...,并为每个数字提前计算对应于该 Octave 音阶的频率(即 f = 16*2^o 其中 o 是 Octave )。对于其中的每一个——一劳永逸地手工检查并找到一个附近的整数,该整数具有许多较小的素因子。例如,如果 o = 5.4 那么 f = 675.58 -- 四舍五入为 675; if o = 5.8 then f = 891.44 -- 四舍五入到 890。将这 50 个数字组装成一个排序数组,使用二进制搜索将每个频率替换为最接近的频率在数组中。

关于frequency - 计算一组数字的近似 LCM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com