如何获得一定频率的音频信号的幅度实时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); 
    } 
    }); 
+0

请问您能解释一下,为什么在20.0乘以20 * Math.log10(value);因为我已经看到相同的表达式乘以10:10 * Math.log10(value); –

+0

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”); –

+0

我也检查过,所有三个文件的结果都是一样的,什么更好,因为我们有恒定的值(没有像以前那样的变化),正确的结果和错误之间的差异大约是39 dB(fft之前的结果) 。它应该是0dB,它是-39dB,它应该是-36dB,它是-75dB,它应该是-60dB,它是-98dB。 –