Извлечение самого большого элемента из моего массива - PullRequest
0 голосов
/ 03 января 2012

Я извлекаю сэмплы из аудиофайла, чтобы нарисовать форму волны - я создал массив с сэмплами (waveDisplayArray в моем коде ниже).

Я хочу извлечь наибольшее значение из этого waveDisplayArray, каков наилучший способ сделать это?

(Я изначально определил waveDisplayArray следующим образом: int waveDisplayArray [280] = {0};
Я не уверен, что это лучший способ сделать это)

спасибо заранее:)

for( int y=0; y<convertedData.mNumberBuffers; y++ )
{
    NSLog(@"buffer# %u", y);
    AudioBuffer audioBuffer = convertedData.mBuffers[y];
    int bufferSize = audioBuffer.mDataByteSize / sizeof(Float32);
    Float32 *frame = audioBuffer.mData;
    NSLog(@"Buffer Size is: %i", bufferSize);

    int numberOfPixels = 280;
    int waveDisplayArray[280]={ 0 };
    int i;

    for (i = 0; i<numberOfPixels; i++)
    {
        //NSLog(@"i is: %i", i); 
        int j;
        int numberOfSamplesPerPixel = bufferSize/numberOfPixels;
        float average = 0;

        for (j=i*numberOfSamplesPerPixel; j<(i+1)*numberOfSamplesPerPixel; j++){

            average += frame[j];
            average = average/numberOfSamplesPerPixel;
        }

        waveDisplayArray[i] = average;
        NSLog(@"Average %i is %f",i,average);
        NSLog(@"waveDisplay Array %i: %f",i, waveDisplayArray[i]);
    }
}

Ответы [ 2 ]

1 голос
/ 06 января 2012

Вы когда-нибудь задумывались об использовании Apple Accelerate framework для этого? Например, есть функция, которая вычисляет максимальное значение целого вектора (вашего массива). Одна строка заменяет ваш цикл for: vDSP_maxmgv(&maxValue, 1, waveDisplayArray, 280);

Есть также полезные функции для вычисления среднего, минимального значения или чего-либо еще. Это должно быть намного быстрее.

1 голос
/ 03 января 2012

Я отредактировал и разместил только соответствующую часть, чтобы найти наибольшее значение.

int i;
float largest = 0;

for (i = 0; i<numberOfPixels; i++)
{
    //NSLog(@"i is: %i", i); 
    int j;
    int numberOfSamplesPerPixel = bufferSize/numberOfPixels;
    float average = 0;

    for (j=i*numberOfSamplesPerPixel; j<(i+1)*numberOfSamplesPerPixel; j++){

        average += frame[j];
        average = average/numberOfSamplesPerPixel;
    }

    waveDisplayArray[i] = average;

    if( largest < average )
    {
        largest = average;
    }

    NSLog(@"Average %i is %f",i,average);
    NSLog(@"waveDisplay Array %i: %f",i, waveDisplayArray[i]);

}
NSLog(@"Largest  %f",largest);
...