【问题标题】:How to find Peak values from Wav Data Using C#如何使用 C# 从 Wav 数据中查找峰值
【发布时间】:2017-08-02 17:02:38
【问题描述】:

我有来自(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 P>

这是 linux 中的峰值生成器示例。

https://github.com/benallfree/wavesurfer-peakbuilder

请建议如何计算峰值

谢谢

【问题讨论】:

    标签: c# algorithm wav


    【解决方案1】:

    对于您要生成的每个条,条的高度应与该条的时间间隔中字节的 RMS(均方根)值成比例。

    因此,如果轨道是 4:00,频率为 44.1kHz,则每个通道上有 4*60*44.1*1e3 = 10584000 个样本。如果您想要 100 个条形图,则每个条形图每个通道 10584000 / 100 = 105840 个样本。

    您需要知道波形文件中的字节顺序。通常这是通道交错的小端。因此,取对应于样本的 2 个字节并组装它们。 (类似于(input[1] << 8) | input[0]。)您最终应该得到两个整数数组,每个数组有 10584000 个样本。然后从 Wikipedia 获取 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
    

    【讨论】:

    • 时间间隔是多少?曲目的持续时间?您能否添加任何示例计算。
    • 很好的解释,同时我发现另一个链接可以创建每 44100 像素的组/批次并从批次中获取最大值。 stackoverflow.com/questions/13629277/…
    猜你喜欢
    • 2014-02-06
    • 2017-07-05
    • 2018-02-09
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多