【问题标题】:Autocorrelation method for pitch determination: what is the input data form?音高确定的自相关方法:输入数据形式是什么?
【发布时间】:2010-03-14 10:52:33
【问题描述】:

我已经阅读了使用自相关方法确定音高的代码。谁能告诉这里输入数据是什么(作为参数传递给 DetectPitch())函数:

double DetectPitch(short* data)
{
    int sampleRate = 2048;

    //Create sine wave
    double *buffer = malloc(1024*sizeof(short));
    double amplitude = 0.25 * 32768; //0.25 * max length of short
    double frequency = 726.0;
    for (int n = 0; n < 1024; n++)
    {
        buffer[n] = (short)(amplitude * sin((2 * 3.14159265 * n * frequency) / sampleRate));
    }

    doHighPassFilter(data);

    printf("Pitch from sine wave: %f\n",detectPitchCalculation(buffer, 50.0, 1000.0, 1, 1));
    printf("Pitch from mic: %f\n",detectPitchCalculation(data, 50.0, 1000.0, 1, 1));
    return 0;
}

【问题讨论】:

  • 您的问题非常模糊 - 请明确说明您在此处遇到的问题。您可能还需要发布 detectPitchCalculation 的代码。

标签: c audio signal-processing


【解决方案1】:

似乎“数据”的使用方式与本地分配的“缓冲区”完全相同,所以我想它类似于 short data[1024],即 -32768 和 32767 之间的 1024 个信号样本(“幅度”的计算方式使得这里假设“短”类型为 16 位)。 顺便说一句,作为“短的最大长度”(正如评论所说),我希望是 32767,而不是 32768(理论上存在最大正值溢出)。

问候

【讨论】:

  • 正如 Paul R 所指出的,“缓冲区”的类型可能是“短 *”。
  • +1:关于输入数据的第一部分是正确的,但关于溢出的最后一部分不是问题 - 它只是幅度计算,正弦波值将在 +/ 之间变化- 8192.
  • 对,我的笔记只是关于“短的最大长度”的评论,因为从理论上讲,使用 32767 通常更安全。
【解决方案2】:

看来你至少需要改变一下:

double *buffer = malloc(1024*sizeof(short));

到:

short *buffer = malloc(1024*sizeof(short));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2019-05-07
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多