如何在 pcm 流 (c#) 中查找音频功率 (db)
Posted
技术标签:
【中文标题】如何在 pcm 流 (c#) 中查找音频功率 (db)【英文标题】:How to find audio power (db) in pcm stream (c#) 【发布时间】:2011-06-12 07:46:08 【问题描述】:我有一个 pcm 16 位流,我需要知道音频何时通过特定功率。 我是否需要 fft 或者我可以通过更简单的方式知道它?
谢谢
【问题讨论】:
C# How to get Audio Decibel values with time span.的可能重复 我看到了这个,但我想知道最简单的方法,不一定是 NAudio。任何想法都会对我有帮助。 naudio 可能是最简单的方法 【参考方案1】:我认为你需要 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;
注意:要获得以 dB 为单位的声音强度,请使用以下公式:
级别 = 20 对数 (P2/P1)
P1=最大功率
P2=当前功率
【讨论】:
以上是关于如何在 pcm 流 (c#) 中查找音频功率 (db)的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 C# 的 MediaTranscoder 将 PCM 音频转码为 MP3