0

我正在开发 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,之后为 -10dBs。所以问题是:为什么我们会犯这些错误?

4

1 回答 1

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);
    }
    });
于 2017-02-14T01:39:05.010 回答