2011-06-12 76 views
0

我有一個pcm 16位流,我需要知道音頻何時傳遞特定的功率。 我需要這個fft嗎?或者我可以用更簡單的方法知道它嗎?如何在pcm流(c#)中找到音頻功率(db)

謝謝

+0

[C#How to Audio Decibel values with time span。](http://stackoverflow.com/questions/6196939/c-how-to-get-audio-decibel-values-with-time- span) – jgauffin 2011-06-12 07:54:22

+0

我看到了這個,但我想知道最簡單的方法,不一定NAudio。任何想法都會幫助我。 – Maya 2011-06-12 08:04:51

+0

naudio可能是最簡單的方法 – jgauffin 2011-06-12 08:22:43

回答

0

我認爲你需要FFT。

以下方法可用於FFT。 (平時)

/* Calculate normal power 

    NumSamples : Number of sample 
    pReal : Real coefficient buffer 
    pImag : Imaginary coefficient buffer 
    pAmpl : Working buffer to hold amplitude Xps(m) = | X(m)^2 | = Xreal(m)^2 + Ximag(m)^2</param> 
    */ 
    public static void NormalPower(UInt32 NumSamples, Double[] pReal, Double[] pImag, Double[] pAmpl) 
    { 
     // Calculate amplitude values in the buffer provided 
     for (UInt32 i = 0; i < NumSamples; i++) 
     { 
      pAmpl[i] = pReal[i]*pReal[i] + pImag[i]*pImag[i]; 
     } 
    } 

    /* Find Peak frequency in Hz 

    NumSamples : Number of samples 
    pAmpl : Current amplitude 
    samplingRate : Sampling rate in samples/second (Hz) 
    index : Frequency index 
    <returns>Peak frequency in Hz</returns> 
    * */ 
    public static Double PeakFrequency(UInt32 NumSamples, Double[] pAmpl, Double samplingRate, ref UInt32 index) 
    { 
     UInt32 N = NumSamples >> 1; // number of positive frequencies. (numSamples/2) 
     double maxAmpl = -1.0; 
     double peakFreq = -1.0; 
     index = 0; 

     for (UInt32 i = 0; i < N; i++) 
     { 
      if (pAmpl[i] > maxAmpl) 
      { 
       maxAmpl = (double)pAmpl[i]; 
       index = i; 
       peakFreq = (double)(i); 
      } 
     } 
     return samplingRate * peakFreq/(double)(NumSamples); 
    } 

而且你可以使用它們像這樣:

FFT.Compute(_numSamples, RealIn, null, RealOut, ImagOut, false); 
       FFT.NormalPower(_numSamples/2, RealOut, ImagOut, AmplOut); 

       double maxAmpl = (32767.0 * 32767.0); //Max power used for 16 bit audio 
       int centerFreq = (Rate/2); 
       for (int i = 0; i < NUM_FREQUENCY; ++i) 
       { 
        if (METER_FREQUENCY[i] > centerFreq) 
         _meterData[i] = 0; 
        else 
        { 
         var indice = (int)(METER_FREQUENCY[i] * _numSamples/Rate); 
         var metervalue = (int)(20.0 * Math.Log10(AmplOut[indice]/maxAmpl)); 
         _meterData[i] = metervalue; 
        } 
       } 

注意:要獲得分貝的聲音強度用以下公式:

水平= 20日誌(P2/P1)

P1 =最大功率

P2 =電流功率