我正在开发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之后的结果不同。

所以问题是:为什么我们会犯这些错误?

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐