Obtenez la fréquence de micro Android

voix
0

Je sais que cette question a été posée, mais il n'a pas de réponse distincte. Alors, ce que j'ai trouvé est ici quelques exemples: Analyse FFT du spectre où je peux transformer mon tableau de double avec classe FFT

RealDoubleFFT transformer;
int blockSize= */2048;
short[] buffer = new short[blockSize];
double[] toTransform = new double[blockSize];
         bufferReadResult = audioRecord.read(buffer, 0, blockSize);

                            for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                                toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
                            }

                            transformer.ft(toTransform);

alors maintenant je ne sais pas comment obtenir une fréquence

J'ai écrit cette méthode:

public static int calculateFFTFrequency(double[] audioData){
    float  sampleRate = 44100;
    int numSamples = audioData.length;
    double max = Double.MIN_VALUE;
    int index = 0;
    for (int i = 0; i< numSamples -1; i++){
        if (audioData[i] > max) {
            max = audioData[i];
            index = i;
        }
    }
    float freq = (sampleRate / (float) numSamples * (float) index) * 2F;
    return (int)freq;
}

J'essaie de mettre en œuvre une formule, mais il ne me retourne pas quelque chose de bon - quelques jokers

J'ai essayé zéro passant ainsi:

 public static int calculateFrequency(short [] audioData){

        int sampleRate = 44100;
        int numSamples = audioData.length;
        int numCrossing = 0;
        for (int p = 0; p < numSamples-1; p++)
        {
            if ((audioData[p] > 0 && audioData[p + 1] <= 0) ||
                    (audioData[p] < 0 && audioData[p + 1] >= 0))
            {
                numCrossing++;
            }
        }

        float numSecondsRecorded = (float)numSamples/(float)sampleRate;
        float numCycles = numCrossing/2;
        float frequency = numCycles/numSecondsRecorded;

        return (int)frequency;
    }

Mais la méthode de passage à zéro si je joue « A » note sur le piano, il me montre 430 pour un moment (qui est proche de A), puis commencer à montrer quelques jokers lorsque le son disparaît - 800+, 1000+, etc.

Quelqu'un peut-il me aider comment obtenir plus ou moins la fréquence réelle du micro?

Créé 19/12/2018 à 14:08
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Ce que vous entendez à partir d'un piano est un terrain, non seulement une fréquence spectrale. Ce n'est pas la même chose. Emplacement est un phénomène psycho-acoustique, en fonction de plus sur la périodicité, et pas seulement le pic spectral. Une grandeurs de fréquences spectrales nues rapports FFT, qui peuvent être composées d'harmoniques, les harmoniques, et d'autres objets, et peut ou peut ne pas inclure la fréquence de pas fondamentale.

Alors, que vous pouvez utiliser à la place d'une FFT est un algorithme de détection / d'estimation de hauteur, ce qui est un peu plus compliqué que de choisir simplement une magnitude de pointe sur une FFT.

Créé 19/12/2018 à 22:39
source utilisateur

voix
0

Vous devez tester votre solution en utilisant un flux généré plutôt que d'un micro, puis tester si la fréquence détectée est ce que vous attendez. Ensuite, vous pouvez faire des tests réels de la vie avec micro, vous devez analyser les données recueillies par micro par vous-même en cas de problèmes. Il pourrait y avoir des sons non audibles dans votre environnement qui pourraient causer des résultats étranges. Quand le son disparaît, il pourrait y avoir des sons et ces harmoniques harmonicals peut devenir lauder que le son de base. Il y a beaucoup de choses à considérer lors du traitement des sons de l'environnement réel.

Créé 19/12/2018 à 14:27
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more