我有来自(16bit,44100hz,2个频道)wav文件的Byte []数组数据,
string WavFile = @"C:\Users\test.wav";
WaveReader wr = new WaveReader(File.OpenRead(WavFile));
IntPtr format = wr.ReadFormat();
byte[] input = wr.ReadData();
我想使用
生成如下的浮动峰值-0.00445556640625,0.010162353515625,-0.0069580078125,0.00408935546875,-0.00604248046875,0.003143310546875,-0.001953125,0.00140380859375,-0.00189208984375
这是linux中的峰值生成器示例。
https://github.com/benallfree/wavesurfer-peakbuilder
请建议如何计算峰值
谢谢
答案 0 :(得分:1)
对于要生成的每个条形,条形的高度应与该条形的时间间隔中字节的RMS(均方根)值成比例。
因此,如果轨道是44.00kHz的4:00,则每个通道上的4 * 60 * 44.1 * 1e3 = 10584000个样本。如果你想要100个柱,那么每个通道的每个通道10584000/100 = 105840个样本。
您需要知道wave文件中的字节顺序。通常情况下,这个频道是一个小尾数。因此,取对应于样本的2个字节并组装它们。 (像(input[1] << 8) | input[0]
之类的东西。)你应该得到两个整数数组,每个数组10584000个样本。然后从维基百科中获取RMS公式,并将其应用于105840个样本的块,以生成100个数字,表示条形的高度(在每个通道上)。
PCM样本的包装格式(另见http://www.neurophys.wisc.edu/auditory/riff-format.txt)
Sample 1
Channel 0 Channel 0 Channel 1 Channel 1
(left) (left) (right) (right)
low-order high-order low-order high-order
byte byte byte byte
Data Packing for 16-Bit Stereo PCM