PCM数据格式,音频处理

音频文件

1. 节奏简单介绍

   音频文件是对声音进行数字转换之后寄放的数据文件,通晓音频数据必须先知道多少个关键概念。

 

1. 采集样本:对声新闻息录入时,行进的微小操作单位,平时三次采集样板具备左右2个声道,每种声道用1或2个字节来存款和储蓄;

经不乏先例到那样的汇报: 44100HZ 16bit stereo 还是 22050HZ 8bit mono 等等.

如此那般采集样本的量化位数是8位,或15人(样板位宽),量化位数越高声音音质越好;就像是12个人电话号码表示的号子比7位要多得多;

44100HZ 16bit stereo: 每分钟有 44100 次采样, 采集样板数据用 十三人(2字节)记录, 双声道(立体声);

2. 采集样本频率:每秒采集样板次数,单位Hz,日常的音频文件有11.025kHz、22.05kHz、44.10kHz等;鲜明,这种模-数音讯的调换,每秒采集样板次数越来越多,声音就越正确;

22050HZ 8bit  mono: 每分钟有 22050 次采集样板, 采集样板数据用 8 位(1字节)记录, 单声道;

3. 码率:每秒编码的bit数,单位是kb/s;计算方式:位宽×声道数×采集样本频率;(单位是bit不是字节)

 

4. 声道数,固定值为1-单声道,恐怕2-双声道,双声道时,种种采集样板样本中隐含左声道、右声道的韵律数据,由此双方的多寡是驰骋排列的;

无可反对也足以有 16bit 的单声道或 8bit 的立体声, 等等。

 

 

 (一)Wave 格式

采样率是指:声音讯号在“模→数”转变进程中单位时间内采集样本的次数。采集样本值是指每贰次采集样本周期内声音模拟确定性信号的积分值。

    WAVE是微软支付的声音文件格式,用于保存Windows平台的音频音信能源,文件后缀名*.wav;帮衬八种压缩算法、多样节奏位数、采样频率和声道;

 

    标准的wav文件选拔44.1kHz采集样板频率,十三位量化位数,声音文件品质几与CD极其;Wave格式不对源数据做别的管理,如若源数据是无毒的,编码后的Wav文件也是无毒的;即使源数据是有损的,编码后的Wav文件也会有损的;

对此单声道声音文件,采集样板数据为陆个人的短整数(short int 00H-FFH卡塔 尔(阿拉伯语:قطر‎;

1. Wave文件的重新整合:

而对于双声道立体声声音文件,每趟采集样本数据为多个拾二位的大背头(int卡塔 尔(英语:State of Qatar),高三个人(左声道)和低伍个人(右声道)分别代表八个声道。

RIFF

 

标 志 4B

人对效用的辨认范围是 20HZ - 二〇〇一0HZ, 假若每分钟能对声音做 二〇〇三0 个采集样本, 重播时就足能够知足人耳的需要. 所以 22050 的采集样本频率是常用的, 44100已经是CD音质, 超过48000的采样对人耳已经远非意思。那和电影的每秒 24 帧图片的道理差不离。

"RIFF"

 

数量大小 4B

各类采集样本数据记录的是振幅, 采样精度决定于储存空间的大小:

-

1 字节(约等于8bit) 只好记录 256 个数, 也正是一定要将振幅划分成 256 个等第;

格式 4B

2 字节(也正是16bit) 能够细到 65536 个数, 那已经是 CD 规范了;

"WAVE"

4 字节(也正是32bit) 能把振幅细分到 4294967296 个等第, 实乃没供给了.

fmt

若果是双声道(stereo), 采集样品正是双份的, 文件也大抵要大学一年级倍.

标志 4B

 

"fmt "

那样大家就足以借助叁个 wav 文件的轻重、采集样本频率和采集样板大小推断出三个 wav 文件的播音长度。

结构体大小 4B

 

16/18

诸如 "Windows XP 运营.wav" 的文件长度是 424,644 字节, 它是 "22050HZ / 16bit / 立体声" 格式(那能够从其 "属性->摘要" 里看见),

结构体 16B/18B

那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050*16*2 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒), 
播音时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。

 

而是那还远远不足规范, 包装典型的 PCM 格式的 WAVE 文件(*.wav)中最少含有 四十五个字节的头消息, 在酌量播放时间时应有将其去掉, 
据此就有:(424644-42) / (22050*16*2/8) ≈ 4.8140816(秒). 那样就比较可信了.

data

 

标志 4B

关于声音文件还可能有一个定义: "位速", 也许有称得上比特率、取样率, 譬喻上边文件的位速是 705.6kbps 或 705600bps, 当中的 b 是 bit, ps 是每秒的情趣;

"data"

 

响声数据大小 4B

裁减的音频文件平常用位速来代表, 比方达到 CD 音质的 DVD 是: 128kbps / 44100HZ.

-

 

data

2. wave文件格式

-

 

 

2.1 概述

 

 

 

WAVE文件是Computer领域最常用的数字化声音文件格式之意气风发,它是微软特意为Windows系统定义的波形文件格式(Waveform 奥迪o卡塔尔国,由于其扩充名称为"*.wav"。

 

 

 

WAVE是录音时用的正统的WINDOWS文件格式,文件的扩充名称为“WAV”,数据小编的格式为PCM或压缩型。

 

WAV文件格式是生龙活虎种由微绵软IBM联合开垦的用来音频数字存款和储蓄的正规,它采纳中华VIFF文件格式结构,极度相同于AIFF和IFF格式。切合PIFF Resource Interchange File Format规范。全部的WAV都有一个文件头,那个文件头音频流的编码参数。

 

 

 

WAV对音频流的编码未有硬性规定,除了PCM之外,还会有大约具有扶植ACM标准的编码都得认为WAV的点子流进行编码。

 

 

 

多媒体应用中运用了多样数目,满含位图、音频数据、录制数据以致外围设备调整新闻等。EnclaveIFF为存储那几个品种的数量提供了豆蔻年华种格局,传祺IFF文件所满含的数据类型由该文件的强盛名来标志,能以LANDIFF文件存款和储蓄的数码饱含:

 

音频录制交错格式数据(.AVI) 、波形格式数据(.WAV) 、位图格式数据(.EvoqueDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动漫光标(.ANI) 、此外PAJEROIFF文件(.BND)。

 

 

 

wave文件有无数相当的小器晚成的压缩格式,所以,正确而详细地打听种种WAVE文件的内部结构是打响做到收缩和平解决压缩的底蕴,也是生成特有节奏压缩格式文件的前提。

图片 1

 

  1. Wave文件的详实结构:

    // CRUISERIFF 规范媒体流文件头 struct Riff_Header { char szRiffId[4]; // 'R','I','F','F'

     DWORD dwRiffSize;            // Size, 除了这 8 个字节之外,文件剩余大小,等于文件总字节数-8
     char szRiffFormat[4];          // 'W','A','V','E'
    

    };

    struct Fmt_Block { char szFmtId[4]; // 'f', 'm', 't',' '

      DWORD dwFmtSize;                 // Size 为 16 或 18
    
     WORD wFormatTag;       // 编码方式,一般为 0x0001
     WORD wChannels;                     // 声道数 1--单声道 2--双声道
     DWORD dwSamplesPerSec;      // 采样频率 /Hz
     DWORD dwAvgBytesPerSec;    // 每秒字节数
     WORD wBlockAlign;                 // 数据块对齐单位(每个采样需要的字节数)
     WORD wBitsPerSample;           // 每个采样需要的 bit
    

    // WO福特ExplorerD wBits; // 或者有希望没有,由dwFmtSize字段决定 };

    //Fact_Block 块,某些 wav 文件中尚无 struct Fact_Block {

    char szFactId[4];                 // 'f','a','c','t'
         DWORD dwFactSize;           //
    

    };

    //数据块 struct Data_Block {

    char szDataId[4];                //'d','a,','t','a'
        DWORD dwDataSize;          // 音频数据大小
    //data ...
    

    };

最主旨的WAVE文件是PCM(脉冲编码调制卡塔 尔(英语:State of Qatar)格式的,这种文件一直存储采集样本的动静数据未有通过别的的减削,是声卡直接扶植的多寡格式,要让声卡准确播放其余被压缩的声响数据,就相应先把减掉的数量解压缩成PCM格式,然后再让声卡来播音。

 说明:

 

(1)  牧马人IFF块里面包车型大巴 dwRiffSize 表示的是全体文件除开始8个字节之外的尺寸,0x24 0xCD 0x01 0x00,即 118,052 Byte,通过文件属性查得文件大小是118,060Byte;

2.2 Wave文件的内部结构

(2)  dwFmtSize 为 0x10 0x00 0x00 0x00,即为16;fmt块的剩下部分是叁个波形新闻结构,是微软概念的:

 

图片 2图片 3

注:由于WAV格式源自Windows/AMD情状,因此使用Little-Endian字节顺序实行仓库储存。

/*
 *  extended waveform format structure used for all non-PCM formats. this
 *  structure is common to all non-PCM formats.
 */
typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         /* format type */
    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
    DWORD       nSamplesPerSec;     /* sample rate */
    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
    WORD        nBlockAlign;        /* block size of data */
    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
    WORD        cbSize;             /* the count in bytes of the size of */
                                                                                      /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

 

WAVEFORMATEX

WAVE文件是以LacrosseIFF(Resource Interchange File Format, "能源相互文件格式")格式来协会内部结构的。

(3)  Data块:dwDataSize表示音频数据的大大小小,0x00 0x01 0xCD 0x00,即118,016,略低于118,052,表明文件末有生机勃勃对低效数据;

 

 叁个示范:

EvoqueIFF文件结构能够当作是树状结构,其主干组成是名称为"块"(Chunk卡塔 尔(阿拉伯语:قطر‎的单元,最最上部是叁个“奥迪Q5IFF”块,下边包车型客车每一种块有“类型块标志(可选)”、“标识符”、“数据大小”及“数据”等项所组成。块的构造如表1所示:

//
// 读取Wav文件头,并验证文件格式
// 成功返回文件句柄,并重定位文件指针到数据区
// 失败返回NULL
//
HANDLE ReadHeader(char* path)
{
    HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Unable to Open File!");
        return NULL;
    }
    char buffer[512];
    DWORD readByte;
    if (ReadFile(hFile, buffer, sizeof(buffer), &readByte, NULL))
    {
        Riff_Header header;
        Fmt_Block fmt;
        Data_Block data;
        memcpy(&header, buffer, sizeof(Riff_Header));
        if (strncmp(header.szRiffId, "RIFF", 4) != 0) {CloseHandle(hFile); return NULL;}

        memcpy(&fmt, buffer   sizeof(Riff_Header), sizeof(Fmt_Block));
        if (strncmp(fmt.szFmtId, "fmt ", 4) != 0) {CloseHandle(hFile);return NULL;}

        memcpy(&data, buffer   sizeof(Riff_Header) fmt.dwFmtSize 8, sizeof(Data_Block));
        if (strncmp(data.szDataId, "data", 4) != 0) {CloseHandle(hFile);return NULL;}

        memcpy(&wfx, &fmt.wFormatTag, sizeof(WAVEFORMATEX) - 2);
        wfx.cbSize = 0;

        // 重定位文件指针,到数据起始位置
        int headSize = sizeof(Riff_Header)   fmt.dwFmtSize   8   sizeof(Data_Block);
        headSize = (headSize/8   (headSize%8?1:0))*8;
        SetFilePointer(hFile, headSize, 0, FILE_BEGIN);

        return hFile;
    }
    return NULL;
}

名称

Size

备注

块标志符

4

4个小写字符(如 "fmt ", "fact", "data" 等)

数据大小

4

DWORD类型,表示后接数据的大小(N Bytes)

数据

N

本块中正式数据部分

表达:1. 那边未有思谋fact结构存在的景况;2. 调用ReadHeader()之后wfx结构同期也填充达成,可以用来展开音频设备,进行wav音频播放;

表1:基本chunk的内部结构

其调用如下:

 

#include "stdafx.h"
#include <Windows.h>
#include <mmsystem.h>
#include "WavStruct.h"

#pragma comment(lib, "winmm.lib")

const char testWave = "C:/Windows/Media/Ring02.wav";
WAVEFORMATEX wfx;

int main(int argc, char* argv[])
{
    HANDLE hFile = ReadHeader((char*)testWave);
    if (hFile == NULL) return 0;

    CloseHandle(hFile);
    return 0;
}

上边聊到的“类型块标志”只在一些chunk中用到,如 "WAVE" chunk中,那个时候表示上边嵌套有别的chunk。

结果:

 

图片 4

当使用了 "类型块标记" 时,该chunk就未有其他项(如块标识符,数据大小等卡塔 尔(阿拉伯语:قطر‎,它只看做文件读取时的三个标志。先找到那一个“类型块标记”,再以它为源点读取它下边嵌套的其余chunk。

 

 

 (二) MP3格式

各类文件最前端写入的是翼虎IFF块,每种文件唯有几个帕杰罗IFF块。从 Wave文件格式详细表达 中能够看出那一点。

     MP3格式(待续 ...)

非PCM格式的文书会最少多投入贰个 "fact" 块,它用来记录数据(注意是多少实际不是文件)解压缩后的分寸。这几个 "fact" 块常常加在 "data" 块的前头。

 

 

 

WAVE文件是由若干个Chunk组成的。依据在文书中的出现岗位满含:奥迪Q7IFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:

 

    -------------------------------------------

 

    |          RIFF WAVE Chunk                |

 

    |          ID   = "RIFF"                  |

    |          RiffType = "WAVE"              |

    -------------------------------------------

    |          Format Chunk                   |

    |          ID = "fmt "                    |

    -------------------------------------------

    |          Fact Chunk(optional)           |

    |          ID = "fact"                    |

    -------------------------------------------

    |          Data Chunk                     |

    |          ID = "data"                    |

    -------------------------------------------

          图 Wav格式包涵Chunk示例

 

 

            Fact Chunk

    =======================================

    |      |所占字节数|      具体内容       |

    =======================================

    |  ID  | 4Bytes |      "fact"         |

    ---------------------------------------

    | Size | 4Bytes |        4            |

    ---------------------------------------

    | data | 4Bytes |解压后的节拍数据的轻重(B)|

    ---------------------------------------

         图   Fact Chunk

 

 

2.3 Wave文件格式详细说明

 

别名               字节数    类型       注释

ckid                4       char      "RIFF" 标志, 大写

cksize              4       int32     文件长度。那些尺寸不包涵"猎豹CS6IFF"标识和

                                          文件长度 本人所占字节, 上边包车型客车

                                          子块大小也是这般。

  fcc type          4       char      "WAVE" 类型块标记, 大写。

    ckid            4       char      表示"fmt" chunk的启幕。此块中归纳文

                                          件内部格式消息。小写, 最终叁个

                                          字符是空格。

    cksize          4       int32     文件之中格式音信数据的大大小小。

      FormatTag     2       int16     音频数据的编码方式。1 代表是 PCM 编码

      Channels      2       int16     声道数,单声道为1,双声道为2

      萨姆plesPerSec 4       int32     采集样板率(每秒样品数), 举例 44100 等

      BytesPerSec   4       int32     音频数据传送速率, 单位是字节。其值为

                                          采集样板率×每便采集样板大小。播放软件

                                          利用此值能够猜度缓冲区的大大小小。

      BlockAlign    2       int16     每一回采集样本的轻重 = 采集样板精度*声道数/8(单

                                          位是字节); 那也是字节对齐的最

                                          小单位, 比如 16bit 立体声在此

                                          里的值是 4 字节。播放软件须求

                                          一遍拍卖多少个该值大小的字节数

                                          据,以便将其值用于缓冲区的调治。

      BitsPerSample 2       int16     每种声道的采集样品精度; 举个例子 16bit 在此

                                          里的值正是16。假设有八个声道,则

                                          每一个声道的采集样本精度大小都风度翩翩律的。

      [cbsize]      2       int16     [可选]外加数据的轻重。

      [...]         x     

  [ckid]            4       char      "fact".

 

  [cksize]          4       int32     "fact" chunk data size.

  [fact data]       4       int32     解压后的节拍数据的朗朗上口(Bytes).

 

  ckid              4       char      表示 "data" chunk的早先。此块中蕴藏

                                          音频数据。小写。

  cksize            4       int32     音频数据的尺寸

    ......                            文件声音信息数量(真正声音存款和储蓄部分)

  [......]                            其它 chunk

 

 

2.4 Windows平台上WAVEFORMAT结构的认知

 

PCM和非PCM的重中之重差别是声音数据的集团不相同,这个差别能够透过两方的WAVEFORMAT结构来区分。

上面以PCM和IMA-ADPCM来打开对照。

 

WAVE的焦点结构 WAVEFORMATEX 结构定义如下:

图片 5

 1 typedef struct
 2 {
 3     WORD  wFormatag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
 4     WORD  nChannls; //声道数,单声道为1,双声道为2;
 5  
 6     DWORD  nSamplesPerSec; //采样频率;
 7  
 8     DWORD  nAvgBytesperSec;  //每秒的数据量;
 9  
10     WORD  nBlockAlign; //块对齐;
11  
12     WORD  wBitsPerSample; //WAVE文件的采样大小;
13  
14     WORD  cbSize; // The count in bytes of the size of extra
15 // information(after cbSize). PCM中忽略此值
16  } WAVEFORMATEX;

图片 6

 

IMAADPCMWAVEFORMAT结构定义如下:

  

图片 7

1 Typedef struct
2 {
3     WAVEFORMATEX  wfmt;
4 
5     WORD  nSamplesPerBlock;
6    
7 } IMAADPCMWAVEFORMAT;

图片 8

 

IMA-ADPCM中的的wfmt->cbsize不可能忽略,平日取值为2,表示此类型的WAVEFORMAT比相通的WAVEFORMAT多出2个字节。那五个字符也正是nSamplesPerBlock。

 

"fact" chunk的个中协会

在非PCM格式的公文中,平日会在WAVEFORMAT结构前面参加二个 "fact" chunk, 结构如下:

1
2
3
4
5
6
7
8
9
typedef struct{
 
    char[4]; //“fact”字符串
 
    DWORD chunksize;
 
    DWORD datafactsize; // 音频数据转换为PCM格式后的大小。
 
} factchunk;

 

datafactsize是那一个chunk中最要紧的多寡,倘使那是某种压缩格式的声音文件,那么从此未来间就足以掌握他解压缩后的轻重。对于解压时的考虑会有十分的大的好处!

 

2.5 "data" chunk的此中协会

 

从 "data" chunk的第9个字节初阶,存款和储蓄的正是声音讯息的数额了,(前八个字节存款和储蓄的是标识符 "data" 和后接数据大小size(DWO奥迪Q5D)。那些数据足以是裁减的,也能够是未有收缩的。

 

3. PCM数据格式

 

PCM(Pulse Code Modulation)也被喻为 脉码编码调制。PCM中的声音数据还未有被减削,假使是单声道的文书,采集样板数据按期间的前后相继顺序依次存入。(它的主干组织单位是BYTE(8bit)或WOLacrosseD(16bit))

 

诚如情况下,生龙活虎帧PCM是由20四十七遍采集样本组成的( 参考 http://discussion.forum.nokia.com/forum/showthread.php?129458-请问PCM格式的音频流,每一趟读入或输出的块的大小是必须稳定为4096B么&s=e79e9dd1707157281e3725a163844c49 )。

 

只假设双声道的文本,采样数据依期间前后相继顺序交叉地存入。如图所示:

图片 9 

 

PCM的各类样品值满含在一个整数i中,i的尺寸为容纳钦赐样品长度所需的小小字节数。

先是存款和储蓄低有效字节,表示样本幅度的位放在i的高有效位上,剩下的地点为0,这样8位和14位的PCM波形样品的数码格式如下所示。

 

    样品大小      数据格式            最小值    最大值

    8位PCM       unsigned int         0       225

    16位PCM      int                -32767    32767

 

 

参谋资料:

[1]http://redsoft.ycool.com/post.2232742.html

[2]http://dev.firnow.com/course/3_program/hb/hbxl/20100803/518348.html

[3]http://hi.baidu.com/kindyb/blog/item/0a314f8859489c93a4c27297.html

[4]http://hi.baidu.com/kindyb/blog/item/353f4813df8799055aaf5397.html

[5]http://hi.baidu.com/kindyb/blog/item/2f31daa93f5ed4fb1e17a291.html

[6]http://hi.baidu.com/bigbigant/blog/item/7b91aa01e46dd4021d958317.html

本文由星彩网app下载发布于星彩网app下载,转载请注明出处:PCM数据格式,音频处理

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。