gpt4 book ai didi

audio - 如何计算正弦波的最小周期以在缓冲区中有整数 N 个周期?

转载 作者:行者123 更新时间:2023-12-02 23:39:54 25 4
gpt4 key购买 nike

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

我想要正弦波缓冲区,进行音频合成,并希望确定缓冲区的最佳大小以避免在样本中测量的正弦波周期为非整数的伪影。

例如,A4、440.0 Hz、采样率为 44100 的正弦信号每 1/440 * 44100 个样本或每 100.22727272727272 个样本重复一次。如果您只是创建一个包含 100 个(或 101 个)样本的循环缓冲区来包含一个正弦周期,则播放会对不相交产生明显的伪影。

基于对上一个发布者版本的响应,建议的解决方案是将周期表示为一个整数分数,并找到最大公约数以找到所需的周期数和样本数。然而在实践中,我一直在寻找最大公约数计算为 1 的比率,这在我看来直觉上似乎不太可能。

使用上面的示例,在 Python 中:

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

除数等于 1,显然意味着没有公约数,这意味着它需要无限循环的频率才能找到整数个样本来完美地存储正弦。

我做错了吗?还有其他解决方案吗?

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

最佳答案

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

然而,考虑到计算 period = 1.0 / freq * rate 时的舍入误差,这种简化可能不会那么好。 .你最好使用:

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

那时起 ratio是简化分数(在您的特定情况下 (2205, 22) ), ratio[1]循环将适合整数个样本(更具体地说 ratio[0]*ratio[1] 或在您的特定情况下 48510 样本)。

关于audio - 如何计算正弦波的最小周期以在缓冲区中有整数 N 个周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40078417/

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