Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绘制.wav文件的波形_C++_C - Fatal编程技术网

C++ 绘制.wav文件的波形

C++ 绘制.wav文件的波形,c++,c,C++,C,我想根据特定的绘图宽度绘制.wav文件的波形 我应该使用哪种方法来显示正确的波形图 欢迎提供任何建议、教程和链接……几乎任何类型的绘图都是特定于平台的。也就是说,.wav文件是Windows上最常用的文件,所以您可能主要(或完全)对Windows代码感兴趣。在这种情况下,主要取决于您的速度要求。如果您想要一个相当静态的显示,您可以使用MoveTo和(大部分)LineTo进行绘制。如果速度不够快,您可以通过使用类似于多段线的方法获得一点速度 如果您希望大大加快速度,那么最好的选择就是使用OpenG

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

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


欢迎提供任何建议、教程和链接……

几乎任何类型的绘图都是特定于平台的。也就是说,.wav文件是Windows上最常用的文件,所以您可能主要(或完全)对Windows代码感兴趣。在这种情况下,主要取决于您的速度要求。如果您想要一个相当静态的显示,您可以使用MoveTo和(大部分)LineTo进行绘制。如果速度不够快,您可以通过使用类似于多段线的方法获得一点速度

如果您希望大大加快速度,那么最好的选择就是使用OpenGL或DirectX图形。这两种方法中的任何一种都完成了图形卡的大部分实际工作。考虑到你正在谈论绘制声波图,即使是一个低端图形卡,只要在优化图形方面做了很少或根本没有做任何工作,它也很可能很容易跟上你可能会抛出的任何东西

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

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

基本算法:

  • 查找要放入绘图窗口的样本数
  • 确定每个像素应显示多少个样本
  • 计算采样块中每个像素的RMS(或峰值)值。平均不适用于音频信号
  • 绘制值
  • 假设n(采样数)=44100,w(宽度)=100像素:

    然后每个像素应表示44100/100==441个样本(块大小)

    (x=0;x 绘制像素(x\u偏移+x, y_基线-均方根值(&mono_样本[x*blocksize],blocksize)); 要尝试不同视觉效果的内容出现:

    • rms vs来自块的最大值
    • 重叠块(块大小x,但每个像素前进x/2等)

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

    您所说的波形到底是什么意思?你是否在试图绘制信号a.k.a频谱中频率成分的水平,最常见于musci可视化仪、汽车音响和音箱?如果是这样,您应该使用。FFT是将时域信号分解为各个频率的标准技术。有很多好的FFT库例程可用

    在C++中,你可以使用库来设置一个WAV音乐播放器,提取FFT并画出它。 也可以与库一起使用来执行相同的操作。我已经试过了,而且很简单


    处理甚至支持OpenGL,使用起来很简单。

    要么使用RMS,块大小取决于放大的距离

    float RMS = 0;
    for (int a = 0; a < BlockSize; a++)
    {
        RMS += Samples[a]*Samples[a];
    }
    RMS = sqrt(RMS/BlockSize);
    
    float RMS=0;
    对于(int a=0;a
    或最小/最大(这是cool edit/Audition使用的)

    float Max=-10000000;
    浮动最小值=1000000;
    对于(int a=0;aMax)Max=样本[a];
    如果(样本[a]
    我已经解析了wav文件。但我不知道我是否将窗口大小样本平均为单个值。如何处理左通道和右通道采样值。我没有添加任何关于如何降低采样的内容,因为在我看来,kauppi已经相当合理地涵盖了这一点。在立体声采样的情况下该怎么办?立体声采样通常是交错的,所以您只需从采样阵列中获取偶数/奇数编号的采样。绘制一个波形/通道。在评估<代码> min <代码>和<代码>马克斯< /代码>时,考虑使用<代码>样本(0)< /代码>作为这些变量的初始值。
    float RMS = 0;
    for (int a = 0; a < BlockSize; a++)
    {
        RMS += Samples[a]*Samples[a];
    }
    RMS = sqrt(RMS/BlockSize);
    
    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];
    }