我的应用程序。正在计算输入声音的噪音水平和频率峰值。 我用FFT得到的短裤[]缓冲器阵列,这是代码: BUFFERSIZE = 1024,采样率= 44100如何测试声音均方根算法
int bufferSize = AudioRecord.getMinBufferSize(sapleRate,
channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.DEFAULT, sapleRate,
channelConfiguration, audioEncoding, bufferSize);
,这是转换的代码:
short[] buffer = new short[blockSize];
try {
audioRecord.startRecording();
} catch (IllegalStateException e) {
Log.e("Recording failed", e.toString());
}
while (started) {
int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
/*
* Noise level meter begins here
*/
// Compute the RMS value. (Note that this does not remove DC).
double rms = 0;
for (int i = 0; i < buffer.length; i++) {
rms += buffer[i] * buffer[i];
}
rms = Math.sqrt(rms/buffer.length);
mAlpha = 0.9; mGain = 0.0044;
/*Compute a smoothed version for less flickering of the
// display.*/
mRmsSmoothed = mRmsSmoothed * mAlpha + (1 - mAlpha) * rms;
double rmsdB = 20.0 * Math.log10(mGain * mRmsSmoothed);
现在我想要知道这个算法是否正常工作或者我错过了什么? 我想知道它是否正确,我在移动设备上显示的dB声音如何测试? 我需要什么帮助请在此先感谢:)
我认为这将是很难产生的,因为在d/A转换器和麦克风硬件差异的绝对可靠dB值。您必须将其校准为已知响度的音频源。另外你为什么将log10乘以20.0的因子?不应该是'10'(因为它是_deci_bel)?此外,也许你需要在计算RMS之前应用增益,而不是之后,这取决于这里的“增益”意味着什么。 – Thomas 2013-04-21 09:04:34
@Thomas:在这种情况下,'20 * log10'是正确的,因为我们正在处理*电压*。 * 10 * log10'用于* power *。 (请注意,如果不采用幅度的'sqrt',然后使用'10 * log10',您也可以更高效地实现相同的结果。) – 2013-04-21 09:34:17