我正在开发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信号的音频文件,其具有0dB的恒定振幅,但是19207Hz振幅的结果值从-39dB到-46dB变化。我检查了相邻的频率,可能其中一些有0 dB,但没有。
我还检查了-36 dB和-60 dB的文件,但结果分别是-39到-48 dB和-44到-61 dB。
正如我们可以看到最后一个文件很接近,但它不是恒定的,我无法预测什么时候它是正确的,什么时候是错误的。
如果有人遇到这个问题,请帮助我。
如果你知道任何其他可行的好的FFT库 - 告诉我
更新:
好的,我添加了TSG的函数,并在我的fft.forwardTransform()之前和之后比较结果;
结果是:
用于0 dB 19.2kHz音频文件:
之前:-39分贝
之后 - 10分贝
为-36 dB 19.2kHz音频文件:
之前:-75分贝
之后:-46分贝
为-60 dB 19.2kHz音频文件:
之前:-97.7分贝
之后:-69分贝
现在结果是不变的,不会随着时间改变或尝试。
我们也可以看到结果中存在一定的模式。在fft之前,结果与-39 dB和-10dB之后的结果不同。
所以问题是:为什么我们会犯这些错误?