我正在嘗試使用NAudio編寫峯值音量表。我的代碼與http://channel9.msdn.com/coding4fun/articles/NET-Voice-Recorder非常相似,但是我的代碼和鏈接的錄音機項目都遇到了問題。NAudio峯值音量表
當播放恆定頻率和音量的聲音時,音量表開始時會處於合理的水平,但會衰減到非常小的值。我不確定爲什麼會出現這種情況,因爲NAudioDemo中的峯值音量計不會這樣做。我試圖在我的程序中複製NAudioDemo中的代碼,但是我無法找到包含峯值音量表代碼的代碼文件。
有人可以指導我創建一個峯值音量表的替代解決方案,或幫助我確定爲什麼我的解決方案(和鏈接上提供的)都無法工作?
public MainWindow()
{
int waveInDevices = WaveIn.DeviceCount;
for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
{
WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
Console.WriteLine("Device {0}: {1}, {2} channels",
waveInDevice, deviceInfo.ProductName, deviceInfo.Channels);
WaveIn waveIn = new WaveIn();
waveIn.DeviceNumber = 0; //TODO: Let the user choose which device, this comes from the device numbers above
waveIn.DataAvailable += waveIn_DataAvailable;
int sampleRate = SAMPLE_RATE; // 8 kHz
int channels = 1; // mono
waveIn.WaveFormat = new WaveFormat(sampleRate, channels);
waveIn.StartRecording();
}
}
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
for (int index = 0; index < e.BytesRecorded; index += 2)
{
short sample = (short)((e.Buffer[index + 1] << 8) |
e.Buffer[index + 0]);
float sample32 = sample/32768f;
ProcessSample(sample32);
}
}
void ProcessSample(float sample1)
{
samplenumber += 1;
if (sample1 > maxval)
{
maxval = sample1;
}
if (sample1 < minval)
{
minval = sample1;
}
//Run updateView every few loops
if (samplenumber > (double)SAMPLE_RATE/DISPLAY_UPDATE_RATE)
{
samplenumber = 0;
updateView(); //needs to be fast!
}
}
void updateView()
{
Console.WriteLine(maxval);
Console.WriteLine(minval);
progressBar1.Value = (maxval - minval)*50;
maxval = 0;
minval = 0;
}
我還沒有檢查過該項目,但它可能不是實際的峯值計。有幾種類似「VU」的算法。 – Brad
什麼是「VU」類算法? –
VU儀表(http://www.transitchicago.com/farechanges/)用於測量信號電平。針跟蹤水平的方式不是瞬時的......它稍微滯後一點,平均了一些峯和谷。有些算法試圖模擬這種行爲。還有其他用於計量信號的算法。峯值計總是顯示出您的樣品組的最高水平。您鏈接到的項目可能會使用某種Delta算法,這就是爲什麼當沒有變化時它會下降。這只是一個猜測,但我沒有看過代碼。 – Brad