当前位置: 首页 > 知识库问答 >
问题:

在C/C中读取和处理WAV文件数据

周子平
2023-03-14

我目前正在做一个非常非常重要的学校项目。我需要在C/C中提取WAVE文件的信息,并使用这些信息来获取语音信号的LPC。但是,为了做到这一点,我需要对信号进行一些预处理,例如进行过零和能量分析等。这意味着我需要符号和真实值。问题是我不知道如何获得有用的信息和正确的格式。我已经阅读了文件中的每个字段,但我不确定我做得对不对。请提出建议?

这是我目前读取文件的方式:

=fread(

提前谢谢。

共有1个答案

刘向阳
2023-03-14

我的第一个建议是使用某种库来帮助您。大多数合理的解决方案似乎都矫枉过正,所以一个简单的库(如您的问题评论中推荐的libsndfile)应该可以解决这个问题。

如果您只是想知道如何阅读WAV文件,以便您可以编写自己的文件(因为您的学校可能会对让您像其他普通人一样使用图书馆嗤之以鼻),快速的谷歌搜索将为您提供所需的所有信息加上一些已经编写了许多阅读. wav格式教程的人。

如果您仍然不明白,下面是我自己的一些代码,我在这里读取WAV/RIFF数据文件的头和所有其他块,直到到达数据块为止。它完全基于WAV格式规范。提取实际的声音数据并不困难:您可以原始读取并使用它,也可以将其转换为内部更容易使用的格式(32位PCM未压缩数据或其他)。

查看下面的代码时,替换阅读器。读取...(...)与等效的fread调用指示类型的整数值和字节大小。WavChunks是一个枚举,它是WAV文件块内ID的Little Endian值,格式变量是WAV文件格式中可以包含的Wav格式类型之一:

enum class WavChunks {
    RiffHeader = 0x46464952,
    WavRiff = 0x54651475,
    Format = 0x020746d66,
    LabeledText = 0x478747C6,
    Instrumentation = 0x478747C6,
    Sample = 0x6C706D73,
    Fact = 0x47361666,
    Data = 0x61746164,
    Junk = 0x4b4e554a,
};

enum class WavFormat {
    PulseCodeModulation = 0x01,
    IEEEFloatingPoint = 0x03,
    ALaw = 0x06,
    MuLaw = 0x07,
    IMAADPCM = 0x11,
    YamahaITUG723ADPCM = 0x16,
    GSM610 = 0x31,
    ITUG721ADPCM = 0x40,
    MPEG = 0x50,
    Extensible = 0xFFFE
};

int32 chunkid = 0;
bool datachunk = false;
while ( !datachunk ) {
    chunkid = reader.ReadInt32( );
    switch ( (WavChunks)chunkid ) {
    case WavChunks::Format:
        formatsize = reader.ReadInt32( );
        format = (WavFormat)reader.ReadInt16( );
        channels = (Channels)reader.ReadInt16( );
        channelcount = (int)channels;
        samplerate = reader.ReadInt32( );
        bitspersecond = reader.ReadInt32( );
        formatblockalign = reader.ReadInt16( );
        bitdepth = reader.ReadInt16( );
        if ( formatsize == 18 ) {
            int32 extradata = reader.ReadInt16( );
            reader.Seek( extradata, SeekOrigin::Current );
        }
        break;
    case WavChunks::RiffHeader:
        headerid = chunkid;
        memsize = reader.ReadInt32( );
        riffstyle = reader.ReadInt32( );
        break;
    case WavChunks::Data:
        datachunk = true;
        datasize = reader.ReadInt32( );
        break;
    default:
        int32 skipsize = reader.ReadInt32( );
        reader.Seek( skipsize, SeekOrigin::Current );
        break;
    }
}
 类似资料:
  • 我正在读一本书。wav文件在C中,然后我尝试使用一些QT函数播放音频文件。以下是我如何阅读该文件: 所以我的音频文件在里面。的每个元素都是无符号的16位整数。 为了播放声音,我将每个16位无符号整数分成两个字符,然后每隔3毫秒(使用计时器)向音频卡发送256个字符。假设是256个字符的字符数组,我这样做(每隔3毫秒)来播放声音: 此外,定义为: 并且定义为: 并且音频格式设置正确为: 然而,当我试

  • 问题内容: 我想阅读Java中的wav文件,我将使用K-means对它们进行分类。 如何读取Java中的wav文件并将其分配到数组或类似的内容(您可以提出想法)中以对其进行分类? 编辑: 我想使用API​​读取wav文件和K-均值。 问题答案: 官方的Java声音编程指南走过读取和写入的音频文件。 A Greensted 撰写的本文:用Java读写Wav文件应该会有所帮助。WavFile类非常有用

  • 问题内容: HTTP服务器向我发送JSON响应(字符串),如下所示: 我想将此“远程文件夹的树”与本地文件夹树(例如,包含本地文件位置的字符串向量)进行比较,因此我想在(string,vector(map(string ,string)))(我不知道是否可行)。 我正在开发一种工具来在本地文件夹和远程文件夹之间同步文件,因此我正在使用boost列出本地文件夹,并且我想将本地列表与远程列表(JSON

  • 一个HTTP服务器发送给我一个JSON响应(一个字符串),如下所示: 我想将这个“远程文件夹的树”与本地文件夹树(例如包含我的本地文件的位置的字符串向量)进行比较,所以我想在(string,vector ( map(string,string))(我不知道这是否可能)的地图上转换这个JSON。 我正在开发一个工具来同步本地和远程文件夹之间的文件,因此我正在使用boost列出本地文件夹,并且我想将本

  • 问题内容: 我在C#.net中有一个程序,它使用写入1个整数和3个字符串到文件中。 现在,我正在用Java编程(对于Android,这是Java的新手),我必须访问以前使用C#写入文件的数据。 我尝试使用和,但无法获得正确的结果。我通常会得到: java.io.UTFDataFormatException:字节21附近的输入格式错误 或者和我得到的是错误的… 这样做的正确方法是什么? 问题答案:

  • 本文向大家介绍c++读取和写入TXT文件的整理方法,包括了c++读取和写入TXT文件的整理方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇c++读取和写入TXT文件的整理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。