C 确定音高的自相关法:输入数据形式是什么?

C 确定音高的自相关法:输入数据形式是什么?,c,audio,signal-processing,C,Audio,Signal Processing,我读过一个使用自相关方法确定音高的代码。有人能告诉我这里的输入数据(作为参数传递给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 leng

我读过一个使用自相关方法确定音高的代码。有人能告诉我这里的输入数据(作为参数传递给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;
}
双检测点(短*数据)
{
int sampleRate=2048;
//创建正弦波
double*buffer=malloc(1024*sizeof(短));
双振幅=0.25*32768;//0.25*短路的最大长度
双频=726.0;
对于(int n=0;n<1024;n++)
{
缓冲器[n]=(短)(振幅*sin((2*3.14159265*n*频率)/采样器);
}
doHighPassFilter(数据);
printf(“来自正弦波的节距:%f\n”,DetectPitch计算(缓冲区,50.0,1000.0,1,1));
printf(“话筒音高:%f\n”,检测音高计算(数据,50.0,1000.0,1,1));
返回0;
}

看起来您至少需要更改:

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

致:


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

看起来您至少需要更改:

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

致:

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

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

关于

似乎“数据”的使用方式与本地分配的“缓冲区”完全相同,因此我认为它类似于
短数据[1024]
,即-32768和32767之间的1024个信号样本(计算“振幅”的方式假设“短”类型为16位)。 顺便说一下,作为“MaxLength of short”(如评论所述),我预计是32767,而不是32768(理论上存在最大正值的溢出)


关于

您的问题非常模糊-请明确说明您在这里遇到的问题。您可能还需要发布detectPitchCalculation的代码。您的问题非常模糊-请明确说明您在这里遇到的问题。您可能还需要发布detectPitchCalculation的代码。正如Paul R所指出的,“缓冲区”的类型可能是“short*”+1:关于输入数据的第一部分您是对的,但关于溢出的最后一部分不是问题-它只是一个振幅计算,正弦波值将在+/-8192之间变化。对,我的注释只是关于“short的最大长度”的注释,因为从理论角度来看,通常使用32767更安全。正如Paul R所指出的,“缓冲区”的类型可能是“short*”.+1:关于输入数据的第一部分您是对的,但关于溢出的最后一部分不是问题-它只是一个振幅计算,正弦波值将在+/-8192之间变化。对,我的注释只是关于“最大长度短”的注释,因为从理论上看,使用32767通常更安全。