2012-01-03 4 views
0

J'extraire des échantillons d'un fichier audio pour dessiner la forme d'onde - J'ai généré un tableau avec les échantillons (waveDisplayArray dans mon code ci-dessous).Extraction du plus grand élément de mon tableau

Je souhaite extraire la plus grande valeur de cette waveDisplayArray, quelle est la meilleure façon de le faire?

(I initally défini waveDisplayArray comme ceci: int waveDisplayArray [280] = {0};
Je ne suis pas sûr que ce soit la meilleure façon d'aller à ce sujet)

merci à l'avance :)

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]); 
    } 
} 
+0

Vous pouvez trier le tableau avec les valeurs en utilisant NSSortDescriptor et prendre la première valeur parmi tous les values.NSSortDescriptor * desc = [[[NSSortDescriptor alloc] initWithKey: @ "nom de fichier" croissant: OUI sélecteur: @ selector (sortByFilenames :)] autorelease]; [myMutableArray sortArrayUsingDescriptors: [NSArray arrayWithObject: desc]]; – shivangi

Répondre

1

J'ai édité et affiché seulement la partie pertinente pour trouver la plus grande valeur.

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); 
+0

Merci Aadhira, cela fonctionne bien et me donne la plus grande valeur. Le problème que j'ai maintenant est quand j'essaye de diviser chaque élément dans le tableau par la plus grande valeur. J'ai mis en place une nouvelle boucle pour gérer cela int k; \t \t \t \t pour (k = 0; k Octave1

+0

Voir 'waveDisplayArray' est un tableau d'entiers. Quel que soit l'élément, si vous essayez de diviser les éléments avec la plus grande valeur du tableau, il deviendra zéro. Par exemple, si vous avez un tableau avec des éléments 2,4,6,3. Si vous divisez chaque élément avec 6 et que vous revenez en arrière, tous les éléments deviendront nuls. – Ilanchezhian

+0

Je suppose que si vous aviez un tableau 'float', les choses pourraient être différentes. J'espère que cela t'aides. – Ilanchezhian

1

Avez-vous déjà pensé à utiliser des pommes Accelerate framework pour cela? Il y a par exemple une fonction qui calcule la valeur maximale d'un vecteur entier (votre tableau). Une ligne remplace votre boucle for: vDSP_maxmgv(&maxValue, 1, waveDisplayArray, 280);

Il existe également des fonctions utiles pour calculer la moyenne, min ou autre. Cela devrait être beaucoup plus rapide.

Questions connexes