Uzyskaj częstotliwości z Androidem mic

głosy
0

Wiem, że to pytano, ale nie ma wyraźną odpowiedź. Więc, co znalazłem jakiś przykład tutaj: FFT Analiza widma Gdzie mogę przekształcić moją tablicę deblu z klasą 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);

więc teraz nie wiem jak uzyskać częstotliwość

Napisałem taki sposób:

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

Staram się realizować formułę, ale nie zwraca mi nic dobrego - jakieś dzikie numery

Próbowałem zerowy przejazd, a także:

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

Ale w zerowej metody mijania jeśli gram „A” uwaga na fortepianie to pokazuje mi 430 na chwilę (który jest blisko), a następnie uruchomić, aby pokazać jakieś dzikie numery gdy dźwięk zanika - 800+, 1000+, etc.

Może ktoś mi pomóc jak zdobyć więcej lub mniej od rzeczywistej częstotliwości mikrofonu?

Utwórz 19/12/2018 o 14:08
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Co słychać z fortepianem jest boisko, a nie tylko widmowa częstotliwości. To nie to samo. Boisko jest zjawiskiem psycho-akustyczny, w zależności więcej na okresowość, a nie tylko w widmie. Nagie FFT donosi widmowych amplitud częstotliwości, które mogą być złożone z podtekstami, harmonicznych i innych artefaktów, i może lub nie może zawierać podstawową częstotliwość skoku.

Więc co może chcesz używać zamiast FFT jest algorytm wykrywania / oszacowanie pitch, który jest nieco bardziej skomplikowana niż tylko zbieranie szczytową wielkość z FFT.

Odpowiedział 19/12/2018 o 22:39
źródło użytkownik

głosy
0

Należy przetestować swoje rozwiązanie za pomocą generowanego strumienia zamiast mikrofonu, a następnie testowanie jeśli częstotliwość wykrywana jest to, czego oczekują. Następnie można zrobić prawdziwe testy życia z mikrofonu, należy przeanalizować dane zebrane przez mikrofon przez siebie w razie jakichkolwiek problemów. Nie może nie być słyszalne dźwięki w swoim otoczeniu, które mogą spowodować dziwne rezultaty. Gdy dźwięk zanika mogą się pojawić pewne harmonical dźwięki i te harmonicals może stać Lauder niż dźwięk bazowej. Jest wiele rzeczy, które należy uwzględnić podczas przetwarzania dźwięków z rzeczywistym środowisku.

Odpowiedział 19/12/2018 o 14:27
źródło użytkownik

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