如何获得一定频率的音频信号的幅度实时android
问题描述:
我正在开发lumiere应用程序。我有一个特定频率的载波信号(如果要更精确一些,则为19.2 kHz),我需要在播放音频时获得它的幅度。 我搜索了一些关于音频处理的信息,发现为了获得频谱,你必须使用FFT算法。如何获得一定频率的音频信号的幅度实时android
我试过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 LIB是可行肯定的 - 告诉我
UPDATE: 好吧,我加入了霍芬海姆的功能,我fft.forwardTransform(之前叫)后,比较的结果; 结果为: 0分贝为19.2kHz的音频文件: 前:-39分贝 后 - 10分贝
为-36分贝为19.2kHz的音频文件: 前:-75分贝 后:-46分贝
为-60分贝为19.2kHz的音频文件: 前:-97.7分贝 后:-69分贝
现在的结果是恒定的,不随时间或者尝试改变。 我们也可以看到结果中有一定的模式。在fft之前,结果与-39 dB和-10dB之后的结果不同。 所以问题是:我们为什么会有这些错误?
答
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);
}
});
请问您能解释一下,为什么在20.0乘以20 * Math.log10(value);因为我已经看到相同的表达式乘以10:10 * Math.log10(value); –
0 dB 19.2kHz音频文件的功能结果在调用FFT之前为-39 dB,在调用FFT之后为-10 dB。 Log.d(“测试”,“功率级别之前:”+ soundPressureLevel(buff)+“dB”); fft.forwardTransform(buff); fft.modulus(buff,amps); Log.d(“测试”,“功率水平之后:”+ soundPressureLevel(buff)+“dB”); –
我也检查过,所有三个文件的结果都是一样的,什么更好,因为我们有恒定的值(没有像以前那样的变化),正确的结果和错误之间的差异大约是39 dB(fft之前的结果) 。它应该是0dB,它是-39dB,它应该是-36dB,它是-75dB,它应该是-60dB,它是-98dB。 –