2013-04-21 23 views
3

我的应用程序。正在计算输入声音的噪音水平和频率峰值。 我用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声音如何测试? 我需要什么帮助请在此先感谢:)

+0

我认为这将是很难产生的,因为在d/A转换器和麦克风硬件差异的绝对可靠dB值。您必须将其校准为已知响度的音频源。另外你为什么将log10乘以20.0的因子?不应该是'10'(因为它是_deci_bel)?此外,也许你需要在计算RMS之前应用增益,而不是之后,这取决于这里的“增益”意味着什么。 – Thomas 2013-04-21 09:04:34

+2

@Thomas:在这种情况下,'20 * log10'是正确的,因为我们正在处理*电压*。 * 10 * log10'用于* power *。 (请注意,如果不采用幅度的'sqrt',然后使用'10 * log10',您也可以更高效地实现相同的结果。) – 2013-04-21 09:34:17

回答

1

代码看起来正确的,但你应该处理这种情况的缓冲区最初包含零的情况下,这可能导致Math.log10失败,例如变化:

 double rmsdB = 20.0 * Math.log10(mGain * mRmsSmoothed); 

到:

 double rmsdB = mGain * mRmsSmoothed >.0 0 ? 
          20.0 * Math.log10(mGain * mRmsSmoothed) : 
          -999.99; // choose some appropriate large negative value here for case where you have no input signal 
+0

非常感谢您的回复,我有一个问题。我如何测试结果? ,或者我如何校准设备? – Fareed 2013-04-21 17:29:09

+0

您需要一个参考声源 - 它们相当昂贵,但您可以在一周或一个月内从电子设备租赁公司聘请他们。 – 2013-04-21 17:57:21

+0

请注意,上述评论假定您正在讨论通过麦克风输入测量dB SPL。如果您只想从线路电平输入中得出dBV或dBm,那就容易多了。 – 2013-04-21 18:05:23