Алгоритм Гёртцеля, дающий бесконечный результат

У меня синусоида с частотой 20 Гц - 1, которую я создал с помощью программного обеспечения Audacity. Это также только 500 мс.

Я использую следующий алгоритм для определения частоты.

Все, что я хочу обнаружить, если амплитуда тона пересекает порог и дает мне положительный результат при частотных циклах 20 Гц.

static float goertzel_mag(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data)
{
    int     k,i;
    float   floatnumSamples;
    float   omega,sine,cosine,coeff,q0,q1,q2,magnitude,real,imag;

    float   scalingFactor = numSamples / 2.0;

    floatnumSamples = (float) numSamples;
    k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
    omega = (2.0 * M_PI * k) / floatnumSamples;
    sine = sin(omega);
    cosine = cos(omega);
    coeff = 2.0 * cosine;
    q0=0;
    q1=0;
    q2=0;

    for(i=0; i<numSamples; i++)
    {
        q0 = coeff * q1 - q2 + data[i];
        q2 = q1;
        q1 = q0;
    }

    // calculate the real and imaginary results
    // scaling appropriately
    real = (q1 - q2 * cosine) / scalingFactor;
    imag = (q2 * sine) / scalingFactor;

    magnitude = sqrtf(real*real + imag*imag);
    return magnitude;
}

вызвать функцию

// If there's more packets, read them
        inCompleteAQBuffer->mAudioDataByteSize = numBytes;
        CheckError(AudioQueueEnqueueBuffer(inAQ,
                                           inCompleteAQBuffer,
                                           (sound->packetDescs?nPackets:0),
                                           sound->packetDescs),
                   "couldn't enqueue buffer");
        sound->packetPosition += nPackets;

        NSLog(@"number of packets %i",nPackets);

        float *data=(float*)inCompleteAQBuffer->mAudioData;
        int nn = sizeof(data)/sizeof(float);
        float gort = goertzel_mag(nn, 20, 44100, data);
        NSLog(@"gort:%f", gort);
        if (gort == INFINITY)
             NSLog(@"positive infinity");  

точка останова внутри функции

выход

number of packets 8192
gort:36029896530591744.000000
number of packets 8192
gort:inf
positive infinity
number of packets 5666
gort:inf
positive infinity 

Почему я получаю инф результат? Я не знаю, как прочитать возвращаемое значение, я понимаю, что величина всегда должна быть положительным значением, но я создаю файл с 1 амплитудой, разве я не должен получать результаты от 0 до 1?

РЕДАКТИРОВАТЬ; Информация Aduio

afinfo 500ms.aiff
File:           500ms.aiff
File type ID:   AIFF
Num Tracks:     1
----
Data format:     1 ch,  44100 Hz, 'lpcm' (0x0000000E) 16-bit big-endian signed integer
                no channel layout.
estimated duration: 0.500000 sec
audio bytes: 44100
audio packets: 22050
bit rate: 705600 bits per second
packet size upper bound: 2
maximum packet size: 2
audio data file offset: 54
optimized
source bit depth: I16

1 ответ

Решение

Я думаю, что одна проблема с этими строками:

float *data=(float*)inCompleteAQBuffer->mAudioData;
int nn = sizeof(data)/sizeof(float);

который, я считаю, предназначен для того, чтобы сообщить вам количество образцов. У меня нет информации или ресурсов для воспроизведения вашего кода, но я могу воспроизвести ошибку следующим образом:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    float *data=malloc(sizeof(float) * 10);
    printf ("Sizeof 'data' = %d\n", sizeof(data));
    return 0;
}

Выход программы

Sizeof 'data' = 4

который в моей 32-битной компиляции соответствует размеру указателя массива, а не массива. И используя sizeof(*data) вы никуда не попадете, так как это просто говорит вам размер типа данных float, а не массив.

Вы не можете определить размер массива или количество элементов по его указателю, поэтому мой ответ, к сожалению, вам нужно больше информации, возможно, numBytes? Или же numBytes/sizeof(float)?

Другие вопросы по тегам