当前位置: 首页 > 知识库问答 >
问题:

如何计算最小周期正弦波有整数N个周期在缓冲器?

裴曜灿
2023-03-14

我发现一个类似的问题张贴,但没有一个合适的答案。

我想有正弦波缓冲器,做音频合成,并想为缓冲器设计一个最佳大小,以避免在采样中测量的正弦波周期是非整数的伪影。

例如,正弦频率为4440.0Hz,采样率为44100,每1/440*44100个采样,或每100.22727272727272727272个采样重复一次。如果您简单地创建一个100(或101)个样本的循环缓冲区来包含一个正弦周期,那么回放会对不相交产生明显的影响。

freq = 440.0
rate = 44100
period = 1.0 / freq * rate 
ratio = period.as_integer_ratio()
from fractions import gcd
divisor = gcd(*ratio)

我做错了吗?还有别的解决办法吗?

注在实践中,我发现将缓冲区大小设置在正弦实际周期的1000x左右可以消除裸眼的伪影,但我希望降低内存使用量,因此希望根据任意频率从数学上确定更小的允许缓冲区大小。

共有1个答案

曹涵润
2023-03-14

返回1的gcd(*ratio)告诉您的是,您用period.as_integer_ratio()获得的分数已经被简化了,而不是“需要无限周期的频率才能找到整数个样本来完美地存储正弦”。

但是,考虑到计算period=1.0/freq*rate时的舍入错误,这种简化可能不会那么大。您最好使用:

divisor = fractions.gcd(rate, freq)
ratio = (rate/divisor, freq/divisor)

此时,由于比率是一个简化的分数(在特定情况下(2205,22)),所以比率[1]循环可以容纳整数个样本(更具体地说是比率[0]*比率[1]或在特定情况下48510样本)。

 类似资料:
  • 我正在实现正弦波在秒内从逐渐变化到: 此波形是在酷编辑中产生的。开始频率,结束频率,持续时间秒。正弦波在给定的时间内逐渐从一个频率变化到另一个频率。 我的问题是,如何使用FOR循环准确地找到每个循环的开始时间(用红点突出显示)?

  • 问题 你需要查找星期中某一天最后出现的日期,比如星期五。 解决方案 Python的 datetime 模块中有工具函数和类可以帮助你执行这样的计算。 下面是对类似这样的问题的一个通用解决方案: #!/usr/bin/env python # -*- encoding: utf-8 -*- """ Topic: 最后的周五 Desc : """ from datetime import dateti

  • 我在配置中错过了什么? “无限”复选框需要勾选还是不勾选?

  • 我有一个数字 1 到 n 的排列,在每个回合中,一个排列函数用于将当前排列映射到新的排列。 该函数由定义,它将当前置换的每个元素映射到新置换中的一个位置。由于这个函数是内射和满射的,可以证明我们总是再次得到第一个置换。(这实际上是排列图中的一个循环) 例如

  • 问题内容: 我如何知道JavaScript的周数和年份来计算日期?对于第20周和2013年以获得5/16/2013,我正在尝试这样做: 问题答案: function getDateOfWeek(w, y) { var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week 这使用简单的周定义,即2013年的第20周是5月14日

  • 问题内容: 给定一个星期数,例如,您如何计算从星期一开始的那一周中的天数? 第40周的rfc-3339输出示例: 问题答案: PHP 下面的帖子是因为我是个白痴,没有正确阅读问题,但是会获得从星期一开始的一周中的日期,给出的是日期,而不是星期数。 在PHP中 ,改编自PHP日期手册页上的这篇文章 来自的输出: