web-dev-qa-db-fra.com

Comment calculer la fréquence sonore dans Android?

Je veux développer une application pour calculer la fréquence sonore dans Android. Android L'appareil prendra le son du microphone (c'est-à-dire le son extérieur) et j'ai un écran de fond d'une couleur dans l'application. Sur les changements de fréquence sonore, je dois changer la couleur de fond de l'écran.

Ma question est donc "Comment puis-je obtenir la fréquence du son"?

existe-t-il une Android API disponible?

Veuillez m'aider à sortir de ce problème.

17
Ashish Wadatkar

Votre problème a été résolu ici EDIT: archivé ici . Vous pouvez également analyser la fréquence en utilisant FFT .

EDIT: FFTBasedSpectrumAnalyzer (exemple de code, le lien du commentaire)

6
ymn

Merci pour la réponse, je l'ai fait en utilisant un échantillon sur
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html

Modifiez simplement votre code pour calculer la fréquence du son en utilisant la méthode ci-dessous

 // sampleRate = 44100 

public static int calculate(int sampleRate, short [] audioData){

    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;
}
4
Ashish Wadatkar

Les autres réponses montrent comment afficher un spectrogramme. Je pense que la question est de savoir comment détecter un changement de fréquence fondamentale. Cela est demandé si souvent sur Stack Exchange que j'ai écrit une entrée de blog (avec du code!) À ce sujet:

http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

Certes, le code est en C, mais je pense que vous le trouverez facile à porter.

Bref, vous devez:

  1. passe-bas du signal d'entrée afin que les harmoniques de fréquence plus élevée ne soient pas confondues avec la fréquence fondamentale (cela peut ne pas sembler être un problème dans votre application, car vous recherchez juste un changement de hauteur, mais je recommande de le faire quand même pour des raisons trop complexes pour être abordés ici).

  2. fenêtre le signal, en utilisant une fonction de fenêtrage appropriée. Pour obtenir la sortie la plus réactive, vous devez chevaucher les fenêtres, ce que je ne fais pas dans mon exemple de code.

  3. Effectuez une FFT sur les données de chaque fenêtre et calculez la fréquence à l'aide de l'indice de la valeur de crête absolue maximale.

Gardez à l'esprit pour votre application que vous souhaitez probablement détecter le changement de hauteur avec précision et rapidement, la méthode FFT que je décris peut ne pas être suffisante. Vous avez deux options:

  1. Il existe des techniques pour augmenter la spécificité du suivi de hauteur en utilisant des informations de phase, pas seulement le pic absolu.

  2. Utilisez une méthode de domaine temporel basée sur l'autocorrélation. Le Yin est un excellent choix. (google pour "yin pitch tracking")

0
Bjorn Roche