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

如何有效地确定用于循环的预渲染正弦波音频缓冲器的最小必要大小?

斜昊空
2023-03-14

我目前解决这个问题的方法是强力:我尝试所有可能的循环计数,看看其中是否有任何循环计数导致缓冲区大小包含整数个样本。我认为这种做法不能令人满意,原因如下:

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;
}

共有1个答案

何越
2023-03-14
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()方法时,工作线程就用正弦波数据填充一个缓冲区。一旦缓冲区被填满,它会警告输出线程数据已准