尝试绘制波形但不绘制任何数据

Posted

技术标签:

【中文标题】尝试绘制波形但不绘制任何数据【英文标题】:Trying to draw wave form but not drawing any data 【发布时间】:2014-07-13 12:59:04 【问题描述】:

我正在尝试根据此答案从 WAV 文件中绘制波形: https://***.com/a/1215472/356635

不幸的是,它每次都会产生一个大的黑色方块。我正在努力找出为什么会这样,有人能够发现问题吗? normalisedData 中的所有值都在 -1 and +1 之间。 test.wav 文件是一个 Windows wav 文件,播放 5 秒的警报声。

这是我的代码:

using System;
using System.Drawing;
using System.IO;

public partial class _Default : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        const string rootDir = "C:\\inetpub\\wwwroot\\";
        if (File.Exists(rootDir + "test.png"))
        
            File.Delete(rootDir + "test.png");
        

        var stream = new MemoryStream(File.ReadAllBytes(rootDir + "test.wav"));
        var data = stream.ToArray();
        stream.Dispose();
        var normalisedData = FloatArrayFromByteArray(data);

        // Get max value in data
        var maxValue = 0f;
        for (var i = 0; i < normalisedData.Length; i++)
        
            if (normalisedData[i] > maxValue) maxValue = normalisedData[i];
        

        // Normalise data
        for (var i = 0; i < normalisedData.Length; i++)
        
            normalisedData[i] = (data[i] / maxValue) * 100f;
               

        // Save picture
        var picture = DrawNormalizedAudio(normalisedData, Color.LimeGreen);
        picture.Save(rootDir + "test.png", System.Drawing.Imaging.ImageFormat.Png);
        picture.Dispose();
    
    public static Bitmap DrawNormalizedAudio(float[] data, Color color)
    
        Bitmap bmp;
        bmp = new Bitmap(500,500);

        int BORDER_WIDTH = 5;
        int width = bmp.Width - (2 * BORDER_WIDTH);
        int height = bmp.Height - (2 * BORDER_WIDTH);

        using (Graphics g = Graphics.FromImage(bmp))
        
            g.Clear(Color.Black);
            Pen pen = new Pen(color);
            int size = data.Length;
            for (int iPixel = 0; iPixel < width; iPixel++)
            
                // determine start and end points within WAV
                int start = (int)((float)iPixel * ((float)size / (float)width));
                int end = (int)((float)(iPixel + 1) * ((float)size / (float)width));
                float min = float.MaxValue;
                float max = float.MinValue;
                for (int i = start; i < end; i++)
                
                    float val = data[i];
                    min = val < min ? val : min;
                    max = val > max ? val : max;
                
                int yMax = BORDER_WIDTH + height - (int)((max + 1) * .5 * height);
                int yMin = BORDER_WIDTH + height - (int)((min + 1) * .5 * height);
                g.DrawLine(pen, iPixel + BORDER_WIDTH, yMax,
                    iPixel + BORDER_WIDTH, yMin);
            
        
        return bmp;
    

    public float[] FloatArrayFromByteArray(byte[] input)
    
        float[] output = new float[input.Length / 4];
        System.Buffer.BlockCopy(input, 0, output, 0, input.Length);
        return output;
    

【问题讨论】:

不考虑文件头之类的吗? 啊,这可以解释! 【参考方案1】:

WAV 文件的格式比您的代码所假设的要复杂。它们具有描述音频的标题和其他元数据。音频数据通常存储为带符号的 16 位或 8 位整数值,但其他格式也是可能的。您需要找到将 WAV 文件解码为可在应用程序中使用的浮点值的库,或找到将 WAV 文件转换为原始浮点格式文件的使用实用程序。

您的规范化代码也不正确。由于样本值可能为负,因此您需要找到样本绝对值的最大值。您不应乘以 100,因为这会将它们归一化在 -100,100 范围内。

【讨论】:

以上是关于尝试绘制波形但不绘制任何数据的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制波形?

如何在 PyQtGraph 中绘制音频波形

通过 Plotly 在 Shiny 应用程序中绘制的缺失数据

在iOS中绘制录音音频波形图

在iOS中绘制录音音频波形图

Monogame不绘制png图像