Obter frequência de mic Android

votos
0

Eu sei que esta pergunta foi feita, mas não tem uma resposta distinta. Então, o que eu encontrei é alguns exemplos aqui: análise de espectro FFT Onde posso transformar minha matriz de duplas com 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);

então agora eu não sei como obter uma frequência

Eu escrevi esse 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;
}

I tentar implementar uma fórmula, mas isso não me retornar nada bom - alguns números selvagens

Tentei zero, passando assim:

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

Mas no método de passagem zero, se eu jogar nota A no piano ele me mostra 430 por um momento (que é perto de A) e, em seguida, começar a mostrar alguns números selvagens quando o som se desvanece - 800+, 1000+, etc.

Alguém pode me ajudar como obter mais ou menos frequência real do microfone?

Publicado 19/12/2018 em 14:08
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

O que você ouve a partir de um piano é um passo, e não apenas uma freqüência espectral. Eles não são a mesma coisa. Campo é um fenômenos psico-acústica, dependendo mais em periodicidade, não apenas o pico espectral. A FFT nua relata magnitudes de freqüência de espectro, que podem ser compostas de tons, harmônicos e outros artefatos, e pode ou não incluir a frequência fundamental campo.

Então o que você pode querer usar em vez de um FFT é um algoritmo de detecção / estimativa de campo, que é um pouco mais complicado do que apenas escolher uma magnitude de pico fora de uma FFT.

Respondeu 19/12/2018 em 22:39
fonte usuário

votos
0

Você deve testar a sua solução usando um fluxo gerado em vez de um microfone, em seguida, testar se a frequência detectado é o que você espera. Então você pode fazer testes reais com microfone, você deve analisar os dados recolhidos pelo microfone por si mesmo em caso de quaisquer problemas. Não poderia haver sons não audíveis em seu ambiente que podem fazer com que alguns resultados estranhos. Quando o som desaparece poderia haver alguns sons harmônicos e esses harmonicals pode se tornar Lauder do que o som base. Há um monte de coisas a serem considerados durante o processamento de sons de ambiente real.

Respondeu 19/12/2018 em 14:27
fonte usuário

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