我发现了一个类似的问题,但没有找到合适的答案。如何计算正弦波的最小周期在缓冲区中有整数N个周期?
我想有正弦波缓冲剂,做音频合成,和想要计算最佳尺寸为缓冲器,以避免伪像其中样品中测得的正弦波的周期是一个非整数。
例如,正弦在A4,440.0赫兹,具有44100的采样率,重复每四百四十零分之一* 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,显然这意味着不存在公约数,这意味着它需要的频率的无限循环到曾经发现样品的整数倍,以完美存储正弦。
我做错了吗?还有其他解决方案吗?
在实践中注意到,我发现将缓冲区大小设置在1000x左右,正弦的实际周期消除了裸耳的伪像,但是我想降低我的内存使用量,所以想在数学上确定较小的基于任意频率的容许缓冲区大小。
你只是想避免昂贵的电话'罪'?在这种情况下,你可能会考虑错误的方法。您可以存储一个正弦值表格,以适当的频率进行采样,然后通过内插表格中的相邻值为任意值生成“sin”近似值。 – paddy
paddy缓冲区*是*查找表。即时通过在每帧中添加许多正弦波来创建泛音系列,然后在合成器中演奏的每个音符进行合成。复制缓冲区的速度比在每次传递时计算每个样本要快得多 –
当然,复制速度很快,但不容易产生任意频率。你是否建议你为每一个你想添加的谐波都有不同的缓冲区?这听起来像是你正在以样本域映射到时域的形式思考这个问题,而不是相反。保持“播放头”确切地告诉你当前样本在波浪周期中的位置并不昂贵,然后在表格中查找幅度值。 – paddy