- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为微 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/
我有一个整数数组,我试图找到数组中所有值的 LCM(最小公倍数)。我单独写了一个lcm方法;它接受两个值作为输入,并返回 lcm。我的 lcm 方法工作得很好,但是当我用它来查找所有值的 LCM 时,
我正在为微 Controller 编写音调发生器程序。 我使用硬件计时器触发中断,并检查是否需要在特定时刻针对给定音符将信号设置为高电平或低电平。 我使用的硬件非常有限,所以我运行计时器的速度越慢,我
我今天读了一篇有趣的 DailyWTF 帖子,"Out of All The Possible Answers..."这让我很感兴趣,可以挖掘出原来的 forum post提交的地方。这让我开始思考如
我有 ubuntu 20.04,我安装了 drake 并尝试运行示例。 当我尝试运行 bazel-bin/tools/drake_visualizer & bazel-bin/examples/mul
无法理解用于分解 0 的 bool 表达式。 x,y=24,36 LCM=1 counting=True while counting: if (LCM%x and LCM%y) == 0:
有谁知道在编译时计算 C(不是 C++)中至少两个数字的 LCM(最小公倍数)和/或 GCD(最大公分母)的机制,我知道那里有模板魔法)? 我通常使用 GCC,并记得它可以在所有输入已知的情况下在编译
因此,该程序的作用是使用 Scanner 类将两个数字作为输入,并计算这两个数字的最小公倍数。一切似乎都正常,除了 lcm 方法不会返回任何内容。我可能把“break”语句弄乱了,但我不知道有什么其他
我需要找到一系列数字的最小公约数(最多 100 000 个数字,每个数字的范围为 [0, 2 000 000 000]) 我使用以下算法 lcm(a,b) = (a/gcd(a,b)) * b 对于超
下面给出的是一个求可变数量数字的最小公倍数的程序。 例如:如果我必须找到 3,9,13 的 lcm 那么它执行如下:长厘米(1,3)长厘米(3,9)lcm(9,13) 我只想知道这个程序的复杂性是多少
考虑给我们的输入为 a=21, b=36 并且 GCD (a,b) 为 d=3。 如果我们应该通过求解方程a * x + b * y = d 来实现 GCD。我们如何计算此等式中 x 和 y 的正负
我想使用分子和分母的 lcm 计算两个分数的和。这意味着我想得到简化形式的分数。我有以下 cpp 文件。 #include //need it for cin and cout #include "
我正在尝试使用 sympy 找到两个项的 LCM。我使用的代码是: import sympy s=sympy.Symbol("s") A=(s+0.0004)*(s+0.02) B=(s+0.02)
问题:查找 n 的范围:1>N; for(int i=1;i<=N;i++) ans += lcm(i,N)/i ; } 复杂度: 在 中预处理和处理查询 首先,我建立了一个表
我最近在竞争性编程竞赛中遇到了一个问题。给定一个整数数组,找出 LCM 值最小的一对数组元素的索引。 我知道有一个天真的双循环 O(n^2) 解决方案,但正如预期的那样,它给出了时间限制异常。我听说动
我环顾四周,发现其他有答案的问题,但没有一个解决这个特定问题的范围,包括 this question , 还有 this one . 我必须以高效的方式计算大范围数字的 LCM。我没有太深入地研究那些
在一组数字上计算最大公约数和最小公倍数的最简单方法是什么?可以使用哪些数学函数来查找此信息? 最佳答案 我用过Euclid's algorithm求两个数的最大公约数;可以通过迭代得到更大数字集的 G
我对 Haskell 非常陌生。 有没有简单的方法可以找到GCF还是 Haskell 中的 LCM(最小公倍数)? 最佳答案 GCF 是指最大公约数还是最大公约数?那是 gcd ,可从前奏中获得,如
我有以下汇编代码 .global _start .section .text _start: movq a, %rax movq b, %rbx imul %rbx, %rax
我想使用c++ 17 lcm函数,但即使在切换项目标准之后,编译器仍将其视为错误。也许我只是错过了一些东西,但是互联网上针对此问题的每个答案都是简单地更改这一设置而没有帮助。 例如这个程序 #incl
我有以下汇编代码 .global _start .section .text _start: movq a, %rax movq b, %rbx imul %rbx, %rax
我是一名优秀的程序员,十分优秀!