【问题标题】:Get frequency from Android mic从 Android 麦克风获取频率
【发布时间】:2019-05-20 01:10:26
【问题描述】:

我知道有人问过这个问题,但没有明确的答案。 所以,我在这里找到了一些例子:FFT spectrum analysis 我可以在哪里使用 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);

所以现在我不知道如何获得频率

我写了这样的方法:

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

我尝试实现一个公式,但它并没有给我带来任何好处——一些疯狂的数字

我也尝试过零传递:

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

但是在零传递方法中,如果我在钢琴上弹奏“A”音符,它会向我显示 430 片刻(接近 A),然后在声音减弱时开始显示一些狂野的数字 - 800+、1000+、等等

有人可以帮我如何从麦克风获得更多或更少的实际频率吗?

【问题讨论】:

    标签: java android fft android-audiorecord


    【解决方案1】:

    您应该使用生成的流而不是麦克风来测试您的解决方案,然后测试检测到的频率是否符合您的预期。然后你可以用 mic 进行实际测试,你应该自己分析 mic 收集的数据,以防万一。您的环境中可能有听不见的声音,这可能会导致一些奇怪的结果。当声音消失时,可能会出现一些泛音,这些泛音会变得比基本声音更悦耳。在处理来自真实环境的声音时,需要考虑很多事情。

    【讨论】:

    • 但我想创建一个调谐器 - 我需要一个麦克风 :)
    【解决方案2】:

    您从钢琴中听到的是音高,而不仅仅是频谱频率。它们不是同一件事。音高是一种心理声学现象,更多地取决于周期性,而不仅仅是频谱峰值。一个简单的 FFT 报告频谱频率幅度,它可以由泛音、谐波和其他伪影组成,可能包括也可能不包括基本音高频率。

    因此,您可能想要使用音高检测/估计算法来代替 FFT,这比仅从 FFT 中挑选峰值幅度要复杂一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多