gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:47:48 27 4
gpt4 key购买 nike

我正在开发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分贝
之后-10 dB

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

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

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

最佳答案

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

关于java - 如何获得一定频率的音频信号幅度的实时android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182266/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com