如何获得特定频率音频信号的幅度实时android

时间:2017-02-11 23:03:36

标签: java android audio fft tarsosdsp

我正在开发lumiere应用程序。我有一定频率的载波信号(如果要更精确,则为19.2 kHz),我需要在播放音频时获得它的幅度。 我搜索了一些关于音频处理的信息,发现为了获得频谱,你必须使用FFT算法。

我尝试过TarsosDSP库及其FFT类。

TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false);
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format);

float[] buff = new float[bufferFloatSize];
final float[] amps = new float[fftSize];

converter.toFloatArray(tmpBuffer, buff);

FFT fft = new FFT(bufferFloatSize, new HannWindow());
fft.forwardTransform(buff);
fft.modulus(buff, amps);

然后我得到频带指数并计算其幅度

int amp = (int) (10 * Math.log10(amps[index]);

但我的幅度错了。 我有一个19.2kHz信号的音频文件,其幅度恒定为0 dB,但19207 Hz幅度的结果值在-39 dB到-46 dB之间变化。我检查了相邻的频率,可能有一些有0 dB,但没有。 我还检查了-36 dB和-60 dB的文件,但结果分别是-39到-48 dB和-44到-61 dB。

正如我们可以看到最后一个文件它是接近的,但它不是恒定的,我无法预测何时是正确的以及何时出错。

如果有人遇到此问题,请帮助我。 如果你知道任何其他好的FFT库是可行的 - 告诉我

更新: 好的,我添加了TSG的功能,并在我的fft.forwardTransform()之前调用它,之后比较结果; 结果是: 对于0 dB 19.2kHz音频文件: 之前:-39 dB 之后 - 10 dB

用于-36 dB 19.2kHz音频文件: 之前:-75 dB 之后:-46 dB

为-60 dB 19.2kHz音频文件: 之前:-97.7 dB 之后:-69 dB

现在结果是不变的,不随时间变化或尝试。 我们也可以看到结果中存在某种模式。在fft之前,结果与右边的结果不同,为-39 dBs,之后为-10 dBs。 所以问题是:为什么我们会犯这些错误?

1 个答案:

答案 0 :(得分:0)

    In the TarsosDSP manual , the following example was given sound pressure level in db  where  ,

 db=audioEvent.getdBSPL(); or Amplitude=audioEvent.getRMS() //root mean square of the signal.



    float[] buffer = audioEvent.getFloatBuffer();



    private double soundPressureLevel(final float[] buffer) {
    double power = 0.0D;
    for (float element : buffer) {
    power += element*element;
    }

    double value = Math.pow(power, 0.5)/ buffer.length;;
    return 20.0*Math.log10(value);
    }
    });