C++ 绘制.wav文件的波形
我想根据特定的绘图宽度绘制.wav文件的波形 我应该使用哪种方法来显示正确的波形图C++ 绘制.wav文件的波形,c++,c,C++,C,我想根据特定的绘图宽度绘制.wav文件的波形 我应该使用哪种方法来显示正确的波形图 欢迎提供任何建议、教程和链接……几乎任何类型的绘图都是特定于平台的。也就是说,.wav文件是Windows上最常用的文件,所以您可能主要(或完全)对Windows代码感兴趣。在这种情况下,主要取决于您的速度要求。如果您想要一个相当静态的显示,您可以使用MoveTo和(大部分)LineTo进行绘制。如果速度不够快,您可以通过使用类似于多段线的方法获得一点速度 如果您希望大大加快速度,那么最好的选择就是使用OpenG
欢迎提供任何建议、教程和链接……几乎任何类型的绘图都是特定于平台的。也就是说,.wav文件是Windows上最常用的文件,所以您可能主要(或完全)对Windows代码感兴趣。在这种情况下,主要取决于您的速度要求。如果您想要一个相当静态的显示,您可以使用MoveTo和(大部分)LineTo进行绘制。如果速度不够快,您可以通过使用类似于多段线的方法获得一点速度 如果您希望大大加快速度,那么最好的选择就是使用OpenGL或DirectX图形。这两种方法中的任何一种都完成了图形卡的大部分实际工作。考虑到你正在谈论绘制声波图,即使是一个低端图形卡,只要在优化图形方面做了很少或根本没有做任何工作,它也很可能很容易跟上你可能会抛出的任何东西 编辑:就读取.wav文件本身而言,非常简单。大多数.wav文件都是未压缩的PCM样本,因此绘制它们只需读取标题以计算样本大小和通道数,然后缩放数据以适合您的窗口 Edit2:处理左声道和右声道有两种选择。一种是在两个单独的图中绘制它们,通常一个在另一个上面。另一种方法是将它们叠加在一起,但颜色不同。哪一个更合适取决于你想完成什么——如果它主要是为了看起来很酷,一个叠加的多色绘图可能会很好地工作。如果您想让用户真正详细地检查其中的内容,您可能需要两个单独的绘图。基本算法:
绘制像素(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];
}