Автокорреляционный метод определения шага: какова форма входных данных? - PullRequest
0 голосов
/ 14 марта 2010

Я прочитал код для определения высоты тона, используя метод автокорреляции. Кто-нибудь может сказать, какие будут входные данные (передаваемые в качестве аргумента функции 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;
}

Ответы [ 2 ]

2 голосов
/ 14 марта 2010

Кажется, что «данные» используются точно так же, как локально размещенный «буфер», поэтому я предполагаю, что это что-то вроде short data[1024], т. Е. 1024 выборки сигнала между -32768 и 32767 (способ вычисления «амплитуды» предполагает, что «короткий» тип здесь равен 16 битам). Кстати, в качестве «максимальной длины короткого замыкания» (как говорится в комментарии) я бы ожидал 32767, а не 32768 (теоретическое переполнение с максимальными положительными значениями).

Привет

2 голосов
/ 14 марта 2010

Похоже, вам нужно как минимум изменить:

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

до:

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

...