我正在尝试为正在处理的音频项目制作一个波表振荡器,但由于某种原因,我似乎无法正确地做到这一点。这是我公认的幼稚实现。

void BuildTable()
{
    table = (float*)malloc(tableSize * sizeof(float));
    for(int i = 0; i < tableSize; i++)
    {
        table[i] = sin((i * 2 * PI * frequency) / samplerate);
    }
 }

 void Process(float* buffer, int count, float frequency, int elapsedSamples)
 {
     float increment = tableSize * (frequency / samplerate);
     float position = fmodf(elapsedSamples * increment, tableSize);
     for (int i = 0; i < count; i++)
     {
        float sample = table[(int)floorf(position)];
        buffer[i] = sample;
        position += increment;
        if (position > tableSize) position -= tableSize;
     }
  }


其输出是无意义的嗡嗡声和噪音。

我究竟做错了什么?

最佳答案

问题似乎出在BuildTable上。
人们通常会使用完整的正弦波周期来初始化表格,如下所示:

for(int i = 0; i < tableSize; i++)
{
    table[i] = sin(i * 2 * PI / tableSize);
}


而不是使用特定的频率和采样率。

关于c - 试图做一个波表振荡器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23985569/

10-11 15:45