【问题标题】:c# waveform - how to display microphone datac#波形 - 如何显示麦克风数据
【发布时间】:2015-10-02 15:11:46
【问题描述】:

我正在尝试显示波形(我在麦克风中记录了自己)。

将数据保存在 byte 数组中。

另外我的采样率为 44100,采样大小为 16bit

我的数组只包含正值,但在某些示例中,我看到这些值介于 -1.0 到 1.0 之间。这是为什么? 此外,如果我的样本大小是 16 位并且我使用的是字节数组 - 我需要进行转换。 到目前为止,这是我尝试做的:

    double[] x = new double[Arc.Buffer.Count / 2];
    byte[] y = new byte[2];

                for (i = 0; i < Arc.Buffer.Count; i++)
                {
                    Array.Copy(Arc.Buffer.ToArray(), 2*i, y, 0, 2);
                    x[i] = (double)((y[1] << 8) | (y[0] & 0x00FF));
                }                

但在这段代码之后,我的 x 数组包含巨大的值(而不是 -1.0 到 1.0)。

我是这个主题的新手,如果有任何帮助,我将不胜感激! (:

【问题讨论】:

  • 我不知道为什么你会得到巨大的值,但是为了以曲线显示数据,我可以推荐 Oxyplot。我以前用过它,它有很多很酷且性能良好的功能
  • 我有一个库供展示。我只想知道我的逻辑是否错误......在我的示例中,我将每 2 个字节(因为我使用 16 位的样本大小)转换为两倍。我说的对吗?
  • 很抱歉,我没有任何使用字节的经验。您是否调试了代码以查看究竟发生了什么?
  • 嗯,归根结底你必须知道数据是如何存储在字节数组中的。它可以是shorts 或无符号short 或压缩类型的小范围浮点或其他。将原始字节数据转换为double 可能会或可能不会将您带到您需要到达的位置,具体取决于原始数据的外观。如果我不得不猜测,可能不会。在您弄清楚原始数据格式之前,我们无法为您提供很多建议。

标签: c# audio typeconverter waveform


【解决方案1】:

假设这是 PCM 数据,则可能有多种 WAV/RIFF 格式。如果您的样本大小为 16 位,则您读取的值将被签名,介于 -32,768 和 32,767 之间。

出现了关于解析数字音频数据的“wav riff 格式”的快速搜索 a resource

【讨论】:

    【解决方案2】:

    由于您正在处理 16 位有符号样本,因此值将介于 -32768 和 32767 之间。要获得 -1.0 到 1.0 双精度范围,您需要除以 32768.0

    double[] x = new double[Arc.Buffer.Count / 2];
    byte[] y = new byte[2];
    
    for (i = 0; i < Arc.Buffer.Count; i++)
    {
        Array.Copy(Arc.Buffer.ToArray(), 2*i, y, 0, 2);
        x[i] = ((y[1] << 8) | (y[0] & 0x00FF)) / 32768.0;
    }          
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多