如何可视化音频数据?

时间:2009-06-23 22:13:57

标签: algorithm language-agnostic math graphics audio

我想要看起来像这样的东西。两种不同的颜色并不是必需的。

audacity on mac
(来源:sourceforge.net

我已经拥有两个int数组中立体声wav的音频数据(一个样本/毫秒),每个数组分别用于左右声道。我做了几次尝试,但是它们看起来并不像我这样清楚,我的尝试得到了spikey或一个紧凑的块。

有什么好的建议吗?我在c#工作但是psuedocode没问题。

假设我们有

  • 函数DrawLine(color,x1,y1,x2,y2)
  • 两个int数组,数据右[]和左[]为lenght L
  • 32767和-32768之间的数据值

如果您做出任何其他假设,请在答案中写下来。

for(i = 0; i < L - 1; i++) {
  // What magic goes here?
}

这就是我应用the solution Han provided时的结果。 (只有一个频道)
alt text http://www.imagechicken.com/uploads/1245877759099921200.jpg

2 个答案:

答案 0 :(得分:2)

每个像素可能有超过1个样本。对于映射到单个像素的每组样本,您可以从样本组中的最小值绘制(垂直)线段到最大值。如果你放大到每像素1个样本或更少,这不再起作用了,'nice'解决方案是显示sinc插值。 因为DrawLine不能绘制单个像素,所以当最小值和最大值相同时会出现一个小问题。在这种情况下,您可以将单个像素图像复制到所需位置,如下面的代码所示:

double samplesPerPixel = (double)L / _width;
double firstSample = 0;
int endSample = firstSample + L - 1;
for (short pixel = 0; pixel < _width; pixel++)
{
    int lastSample = __min(endSample, (int)(firstSample + samplesPerPixel));
    double Y = _data[channel][(int)firstSample];
    double minY = Y;
    double maxY = Y;
    for (int sample = (int)firstSample + 1; sample <= lastSample; sample++)
    {
        Y = _data[channel][sample];
        minY = __min(Y, minY);
        maxY = __max(Y, maxY);
    }
    x = pixel + _offsetx;
    y1 = Value2Pixel(minY);
    y2 = Value2Pixel(maxY);
    if (y1 == y2)
    {
        g->DrawImageUnscaled(bm, x, y1);
    }
    else
    {
        g->DrawLine(pen, x, y1, x, y2);
    }
    firstSample += samplesPerPixel;
}

请注意,Value2Pixel将样本值缩放为像素值(在y方向上)。

答案 1 :(得分:0)

您可能需要查看R语言。我没有太多的经验,但它主要用于统计分析/可视化场景。如果他们没有一些平滑功能来摆脱你提到的极端情况,我会感到惊讶。

您应该毫不费力地将数据导入其中。您不仅可以阅读平面文本文件,而且还可以使用C轻松扩展,因此可能还有某种C#接口。