绘制.wav文件的波形

时间:2010-01-14 17:23:44

标签: c++ c

我想为特定的绘图宽度绘制.wav文件的波形。

我应该使用哪种方法来显示正确的波形图?

欢迎任何建议,教程,链接......

4 个答案:

答案 0 :(得分:16)

基本算法:

  1. 查找适合绘制窗口的样本数
  2. 确定每个像素应呈现的样本数
  3. 计算样本块中每个像素的RMS(或峰值)值。平均不适用于音频信号。
  4. 绘制值。
  5. 假设n(样本数)= 44100,w(宽度)= 100像素:

    然后每个像素应代表44100/100 == 441个样本(blocksize)

    for (x = 0; x < w; x++)
        draw_pixel(x_offset + x,
                   y_baseline - rms(&mono_samples[x * blocksize], blocksize));
    

    尝试不同视觉效果的东西:

    • rms vs block from block
    • 重叠块(块大小x但每个像素前进x / 2等)

    下采样可能不会起作用,因为您会丢失峰值信息。

答案 1 :(得分:3)

使用RMS,块大小取决于您放大的距离!

float RMS = 0;
for (int a = 0; a < BlockSize; a++)
{
    RMS += Samples[a]*Samples[a];
}
RMS = sqrt(RMS/BlockSize);

或Min / Max(这是很酷的编辑/试听用途)

float Max = -10000000;
float Min = 1000000;
for (int a = 0; a < BlockSize; a++)
{
    if (Samples[a] > Max) Max = Samples[a];
    if (Samples[a] < Min) Min = Samples[a];
}

答案 2 :(得分:2)

几乎任何类型的绘图都是特定于平台的。也就是说,.wav文件最常用于Windows,因此可能是一个公平的猜测,你对Windows的代码主要(或专门)感兴趣。在这种情况下,它主要取决于您的速度要求。如果你想要一个相当静态的显示,你可以用MoveTo和(大部分)LineTo绘图。如果速度不够快,可以使用PolyLine之类的东西获得速度。

如果您希望它快得多,那么您最好的选择是使用OpenGL或DirectX图形。这些中的任何一个都可以在显卡上进行大部分实际操作。鉴于您正在谈论绘制声波图,即使是在优化绘图方面很少或根本没有工作的低端显卡也可能很容易保持几乎任何您可能抛出的东西。

编辑:至于阅读.wav文件本身,the format非常简单。大多数.wav文件都是未压缩的PCM样本,因此绘制它们只需读取标题以确定样本大小和通道数,然后缩放数据以适合您的窗口。

Edit2:您有两种处理左右声道的选择。一种是在两个单独的图中绘制它们,通常一个在另一个上面。另一种是将它们叠加在一起,但是用不同的颜色。哪个更合适取决于你想要完成什么 - 如果它看起来很酷,一个叠加的多色情节可能会很好地工作。如果你想让用户真正仔细检查那里的内容,你可能需要两个独立的图。

答案 3 :(得分:0)

波形究竟是什么意思?您是否试图绘制信号中的频率成分水平a.k.a频谱,最常见于musci可视化器,汽车立体声音响,音箱?如果是这样,您应该使用Fast Fourier Transform。 FFT是将时域信号分成各个频率的标准技术。有很多好的FFT库例程可供使用。

在C ++中,您可以使用openFrameworks库为wav设置音乐播放器,提取FFT并绘制它。

您还可以将ProcessingMinim库一起使用来执行相同操作。我试过了,这很简单。

处理甚至支持OpenGL,可以轻松使用。