关于WAV文件的PCM数据。

awapopeye 2003-04-16 08:31:02
WAV文件的数据段存放的是波形数据,也就是PCM数据。那PCM这个数据在系统里面是怎样表示的呢?是不是已经被抽象为离散序列?如果不是,怎么把PCM数据抽象为离散序列?

谢谢!
...全文
540 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
awapopeye 2003-05-02
  • 打赏
  • 举报
回复
看来是偶需要点解了..........多谢大家指导.看来是我自己有些地方没有理解对头.

散分了...........感谢大家的帮忙.
BlueSky2008 2003-04-30
  • 打赏
  • 举报
回复
就是PCM数据就是量化的采样数据
azuretttc 2003-04-30
  • 打赏
  • 举报
回复
PCM数据就是原始数据啊,你可以借本信息论或者讲信号处理的书看看。
awapopeye 2003-04-29
  • 打赏
  • 举报
回复
偶现在是对PCM数据的具体形态不熟悉。我是想实现一些DSP的简单算法,比如波形倒置,反向等。DSP具体算法过程已经通过数学模型解决了。但是,偶不知道PCM数据是怎么表示序列的。这里一直都卡着,可能是一直曲解了某个地方。
awapopeye 2003-04-27
  • 打赏
  • 举报
回复
Does anyone else???
azuretttc 2003-04-27
  • 打赏
  • 举报
回复
看来你的概念还是不清楚啊,有一个叫香农定律,只要你采样的间隔达到数据率的两倍,精度就够了,所以,如果是40MHZ的音频,理论上说就是以80MHZ的速度采样,也就是0.1微妙采一次样就可以记录下完整的、精度足够的音频数据了。
fenglianghuai 2003-04-18
  • 打赏
  • 举报
回复
比较早的游戏一般采用midi加上单个wav文件的方式,例如《天使帝国》,早期的“三国志”等等,这些游戏一般以midi作背景音乐。遇到人物走路、打架或天灾人祸时用一些波形文件衬托一下气氛,只是Midi文件在早期声卡上表现实在单薄,以一个发烧友的眼光来看实在不堪入耳。后来采用CD+单个wav的声音方式,音质有了明显改善,例如《仙剑奇侠传》。但由于wav在同一时刻只能播放一个,毕竟单薄。很难想象两人打架只有一人发出“嘿嘿”的声音。因此多波形混音成了游戏编程主流,大家看“红色警报”中坦克的轰鸣声,人物的哭叫声,飞机的咆啸声,电塔的滋滋声与出色的背景音乐溶合一起,令人心旷神怡情不自禁。想要编出这样的程序,就要掌握波形混音的原理。

 

什么是Wav文件:

Wav文件直接反映了一个声音在每个时刻的大小值,比如说以下一段波形:

我们按每人0.1秒取一点,得到的wav文件数值就是0,1,1,-1,0,1。因此,假如我们能把许多Wav文件的数据直接相加,你听到的就是所有的声音,这就是混音器的原理。

下面我们分析一下Wav文件结构:

我们可以打开一个Wav文件直接看其二进制码:

C:\user\wave\22.wav

00000000 5249 4646 9CB6 1E00 5741 5645 666D 7420

00000010 1000 0000 0100 0200 2256 0000 44AC 0000

00000020 0200 0800 6461 7461 78B6 1E00 7F7F 7F7F

00000030.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000040.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000050.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000060.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000070.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000080.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

00000090.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

000000A0.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F

大家可以看到wav文件存储格式如下:

 

"RIFF"

×××× 文件大小

"WAVE"

"fmt"

×××× PCMWAWFORMAT——数据结构大小

××××

…… 数据结构“PCMWAVEFORMAT”

××××

data

×××× 数据大小

∶ 数据

 

首先是字符串“RIFF”,表示此文件遵循一种标准格式名为“资源互换文件格式”(Resource Intercharge Format)。后面紧跟四个字节指明文件大小。其次是字符串“WAVE”和“fmt”,后面紧跟一个名为“PCMWAVEFORMAT”的结构,最后是字符串“data”,紧跟数据大小及所有数据。PIFF文件为一种树状结构,基本构成单位是“块”,图5.2中是wav文件中“块”关系图。
awapopeye 2003-04-18
  • 打赏
  • 举报
回复
老大啊偶不是问WAV文件的结构哦,偶是在问PCM数据抽象离散时域序列的问题啊。

Afile 2003-04-18
  • 打赏
  • 举报
回复
学习。
awapopeye 2003-04-17
  • 打赏
  • 举报
回复
既然已经确定PCM数据是已经抽象好了的,那么就有个问题,怎样得到具体的抽象表达式。因为DSP处理是以序列为基础的,固然有些DSP算法可以不用知道具体的抽象表达,如反转可以直接(-A),但是,一些其他的算法就必须要知道抽象表示了。现在知道PCM是序列,但是,却不知道是怎样一个序列?要做SPEECH处理必须是以短时域为模型的,需要把10MS-20MS中间的波形具体分析。假设现在要把一个20MS里面的波形分解为基本序列,那就无法实现。因为不知道PCM序列是怎么抽象的。

所以还要拜托各位啊!

顺便问一句,PCM数据是写入一个BYTE 数组中的。PCM数据写进数组的原理是怎么的啊?采集的数字信号是连续的,在数组里面是怎么表示的啊?一些相关信息怎么表示啊,比如每个采样点的信息是怎么表示的啊?

鞠躬了。。。
PhoenixTorbago 2003-04-17
  • 打赏
  • 举报
回复
模拟音频信号经模数转换(A/D变换)直接形成二进制序列,对于wave文件来说,去了头剩下的就是pcm裸数据了,当然也是二进制序列,离散的。
PhoenixTorbago 2003-04-17
  • 打赏
  • 举报
回复
http://hqtech.nease.net/articles/WaveFormat.htm
PhoenixTorbago 2003-04-17
  • 打赏
  • 举报
回复
WAVE文件的格式,简单地说,就是文件头加上PCM数据。PCM数据已经是音频的裸数据,我们只需要搞清楚这个文件头的格式就行了。

首先,一般是一个RIFFLIST数据结构,定义如下:
typedef struct _rifflist {
FOURCC fcc;
DWORD cb;
FOURCC fccListType;
} RIFFLIST, * LPRIFFLIST;
其中,fcc赋值为FCC('RIFF'),fccListType赋值为FCC('WAVE'),cb表示为这个数据结构后面紧跟着的所有数据的总长度(不包括当前这个数据结构的大小,以字节为单位)。

接下去,是一个RIFFCHUNK数据结构,描述音频的格式,定义如下:
typedef struct _riffchunk {
FOURCC fcc;
DWORD cb;
} RIFFCHUNK, * LPRIFFCHUNK;
其中,fcc赋值为FCC('fmt '),cb表示为紧跟在这个数据结构后面的音频格式数据块的长度,一般为sizeof(WAVEFORMATEX)。

接下去,紧跟着一个音频格式数据块,一般为WAVEFORMATEX格式,定义如下:
typedef struct waveformat_extended_tag {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
这个数据结构中的各个成员大家应该很熟悉,主要描述音频的采样频率、通道数等属性。声卡根据这些信息才能正确解释后面的PCM数据。

再往下,紧跟着另一个RIFFCHUNK数据结构,定义同上。这个数据结构的fcc赋值为FCC('data'),cb表示为这个数据结构后面紧跟着的PCM数据的长度。

最后,紧跟着的,就都是PCM数据了。

下面是一个图例,供大家参考:

azuretttc 2003-04-16
  • 打赏
  • 举报
回复
PCM已经是离散的数据了,它即是我们所说的RAW数据,里面按序存放你的音频数据,而其数据是根据你的采样率以及采样数据位数和声道情况来的,所以你在使用的时候必须知道其这些信息,这也是WAV文件头部所包含的信息。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧