Holen Frequenz von Android mic

stimmen
0

Ich weiß , dass diese Frage wurde gefragt, aber es hat keine eindeutige Antwort. Also, was ich gefunden habe , ist einige Beispiel hier: FFT - Spektrum - Analyse Wo ich meine Array von Doppel mit FFT - Klasse verwandeln

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

so jetzt weiß ich nicht, wie eine Frequenz zu erhalten

Ich schrieb ein solches Verfahren:

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;
}

Ich versuche, eine Formel zu implementieren, aber es zurückgibt mir nichts Gutes - einige wilde Zahlen

Ich habe versucht, Nulldurchgang als auch:

 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;
    }

Aber in Null-Passing-Verfahren, wenn ich spiele „A“ Notiz am Klavier zeigt es mir 430 für einen Moment (die zu Ende ist) und dann fängt einige wilden Zahlen zu zeigen, wenn der Ton ausgeblendet - 800+, 1000 usw.

Kann mir jemand helfen, wie mehr oder weniger aktuelle Frequenz vom Mikrofon zu bekommen?

Veröffentlicht am 19/12/2018 um 14:08
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Was man von einem Klavier zu hören ist ein Pitch, nicht nur eine spektrale Frequenz. Sie sind nicht das Gleiche. Pitch ist ein psycho-akustische Phänomene, mehr auf Periodizität abhängig, nicht nur die spektrale Spitze. Eine nackte FFT berichtet spektralen Frequenzgrößen, die aus Untertöne zusammengesetzt sein kann, Harmonische und andere Artefakte, und kann oder kann nicht die grundlegende Teilungsfrequenz umfassen.

Also, was Sie wollen, können anstelle einer FFT verwenden, ist eine Tonhöhenerkennung / Schätzalgorithmus, der ein wenig komplizierter ist als nur einen Spitzenwert aus einer FFT-Kommissionierung.

Beantwortet am 19/12/2018 um 22:39
quelle vom benutzer

stimmen
0

Sie sollten Ihre Lösung unter Verwendung eines erzeugten Strom anstatt ein Mikrofon testen, testen dann, wenn die Frequenz erkannt ist, was Sie erwarten. Dann können Sie mit mic wirklichen Leben Tests durchführen, sollten Sie die Daten von mic selbst im Falle von Fragen gesammelt analysieren. Es könnte nicht hörbare Töne in Ihrer Umgebung, die einige seltsame Ergebnisse verursachen könnten. Wenn der Ton dort verblasst könnten einige harmonische Töne und diese harmonicals können Lauder als die Basis-Sound werden. Es gibt eine Menge Dinge in Betracht gezogen werden, wenn die Töne aus realer Umgebung zu verarbeiten.

Beantwortet am 19/12/2018 um 14:27
quelle vom benutzer

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