我目前解决这个问题的方法是强力:我尝试所有可能的循环计数,看看其中是否有任何循环计数导致缓冲区大小包含整数个样本。我认为这种做法不能令人满意,原因如下:
1)效率很低。例如,下图所示的程序(在0Hz到48kHz之间打印480,000个可能频率值的缓冲区大小结果)在我2.7GHz的机器上需要35分钟才能完成。我想一定有更快的方法来完成这件事。
2)我怀疑结果不是100%准确,因为浮点错误。
提前感谢您的任何建议!
#include <stdio.h>
#include <math.h>
static const long long SAMPLES_PER_SECOND = 96000;
static const long long MAX_ALLOWED_BUFFER_SIZE_SAMPLES = (SAMPLES_PER_SECOND * 10);
// Returns the length of the pre-render buffer needed to properly
// loop a sine wave at the given frequence, or -1 on failure.
static int GetNumCyclesNeededForPreRenderedBuffer(float freqHz)
{
double oneCycleLengthSamples = SAMPLES_PER_SECOND/freqHz;
for (int count=1; (count*oneCycleLengthSamples) < MAX_ALLOWED_BUFFER_SIZE_SAMPLES; count++)
{
double remainder = fmod(oneCycleLengthSamples*count, 1.0);
if (remainder > 0.5) remainder = 1.0-remainder;
if (remainder <= 0.0) return count;
}
return -1;
}
int main(int, char **)
{
for (int i=0; i<48000*10; i++)
{
double freqHz = ((double)i)/10.0f;
int numCyclesNeeded = GetNumCyclesNeededForPreRenderedBuffer(freqHz);
if (numCyclesNeeded >= 0)
{
double oneCycleLengthSamples = SAMPLES_PER_SECOND/freqHz;
printf("For %.1fHz, use a pre-render-buffer size of %f samples (%i cycles, %f samples/cycle)\n", freqHz, (numCyclesNeeded*oneCycleLengthSamples), numCyclesNeeded, oneCycleLengthSamples);
}
else printf("For %.1fHz, there was no suitable pre-render-buffer size under the allowed limit!\n", freqHz);
}
return 0;
}
number_of_cycles/size_of_buffer = frequency/samples_per_second
我发现一个类似的问题张贴,但没有一个合适的答案。 我想有正弦波缓冲器,做音频合成,并想为缓冲器设计一个最佳大小,以避免在采样中测量的正弦波周期是非整数的伪影。 例如,正弦频率为4440.0Hz,采样率为44100,每1/440*44100个采样,或每100.22727272727272727272个采样重复一次。如果您简单地创建一个100(或101)个样本的循环缓冲区来包含一个正弦周期,那么回放会
问题内容: 我想在python中创建一个高效的循环缓冲区(目标是取缓冲区中整数值的平均值)。 这是使用列表收集值的有效方法吗? 什么会更有效(为什么)? 问题答案: 我会用一个arg 在文档中有一个与您想要的菜谱相似的菜谱。我断言它是最有效的,这完全取决于它是由C语言实现的,这是由一个熟练掌握了一流代码的技术人员组成的。
我在张量流中使用keras创建了一个自定义模型。我使用的版本是tensorflow nightly 1.13.1。我使用官方工具构建了tensorfflow lite模型(方法tf.lite.TFLiteConverter.from_keras_model_file)。 创建模型后,我查看了输入形状,似乎没有什么不好。 tensorflow lite模型中的输入和输出形状为: 您可以注意到输入形状
问题内容: 我有一个从文件创建MessageDigest(哈希)的方法,我需要对很多文件(> = 100,000)执行此操作。为了使性能最大化,我应该为读取文件设置多大的缓冲区? 大多数人都熟悉基本代码(以防万一,在此重复): 最大化吞吐量的理想缓冲区大小是多少?我知道这是与系统有关的,并且我很确定它与操作系统,文件系统和 HDD有关,并且可能还有其他硬件/软件。 (我应该指出,我是Java的新手
问题内容: 在Java中以任何频率生成正弦波声音的最简单方法是什么?样本大小大于2个字节会有所帮助,但这并不 重要。 问题答案: 见一个自包含的例子。 也许更简单? 如链接答案顶部所示,这51行代码段(在下面重复-分隔为单行和行内注释)大约与 生成音调一样简单(好的,您可以取出5行以上用于谐波)。 人们似乎认为这应该是工具包中内置的一种产生 纯净音调的方法。并非如此,要花一点时间就可以做到。
问题内容: 第一次海报在这里。我通常喜欢自己找到答案(通过研究或反复试验得出),但是我很困惑。 我要做什么: 我正在构建一个简单的android音频合成器。现在,我只是在实时播放正弦音,UI中的滑块会随着用户的调整而改变音的频率。 如何构建它: 基本上,我有两个线程- 工作线程和输出线程。每当调用其tick()方法时,工作线程就用正弦波数据填充一个缓冲区。一旦缓冲区被填满,它会警告输出线程数据已准