Obtener la frecuencia del micrófono Android

votos
0

Sé que esta pregunta fue hecha, pero no tiene una respuesta distinta. Por lo tanto, lo que he encontrado es algún ejemplo aquí: análisis de espectro FFT Dónde puedo transformar mi serie de dobles con la clase de 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);

por lo que ahora no sé cómo conseguir una frecuencia

Escribí dicho método:

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

Trato de poner en práctica una fórmula, pero no me devuelve nada bueno - algunos números salvajes

He intentado que pasa de cero, así:

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

Sin embargo, en el método que pasa de cero si juego nota A en el piano que me muestra 430 por un momento (que está cerca de A) y luego empezar a mostrar algunos números salvajes cuando el sonido se desvanece - 800+, 1000, etc.

¿Puede alguien ayudarme cómo conseguir más o menos frecuencia real del micrófono?

Publicado el 19/12/2018 a las 14:08
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Lo que se escucha de un piano es un terreno de juego, no sólo una frecuencia espectral. No són la misma cosa. Pitch es un fenómeno psicoacústico, dependiendo más de periodicidad, no sólo el pico espectral. Un FFT desnuda informa magnitudes espectrales de frecuencia, que pueden estar compuestos de armónicos, los armónicos y otros artefactos, y puede o no incluir la frecuencia fundamental de tono.

Entonces, ¿es posible que desee utilizar en lugar de una FFT es un algoritmo de detección / estimación de tono, que es un poco más complicado de lo que acaba de recoger una magnitud pico de una FFT.

Respondida el 19/12/2018 a las 22:39
fuente por usuario

votos
0

Debe probar su solución utilizando una corriente generada en lugar de un micrófono, y luego probar si la frecuencia detectada es lo que espera. A continuación, puede hacer pruebas de la vida real con micrófono, debe analizar los datos recogidos por el micrófono por sí mismo en caso de cualquier problema. Podría haber sonidos no audibles en su entorno que podrían causar algunos resultados extraños. Cuando el sonido se desvanece podría haber algunos sonidos armónicas y estos pueden llegar a ser harmonicals Lauder que el sonido base. Hay muchas cosas a considerar cuando se procesan los sonidos del entorno real.

Respondida el 19/12/2018 a las 14:27
fuente por usuario

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