主题:哪位搞音频或者语音的,请教一个基本概念 -- 黑猫夜行
wav文件,或者pcm文件里面每个采样点的数据究竟是什么啊,为了把问题简化,我们假设,44.1k、16bit的线性pcm。我狗了一通,没找到详细解释,人人都说那是个采样后“量化”的数据,依靠什么量化的,怎样量化的呢?
我把某一个wav的data chunk里所有采样点都减少或者增加一个常量后生成新的wav,要么裁减得太狠了干脆不出声要么就跟原来的听上去没什么区别。所以我想wav在经过声卡D/A转换再到speaker时一定不是一个点一个点独立的。
那么究竟是怎么回事呢?
声音信号有两种分析方法,时域上的和 频域上的。
人的声音是个模拟信号。 它在频域上的带宽是无限的。就是说你想用数字
方法储存,---- 单论理论上说是存储空间是要求无限大的。
其次上其实用不了那么大。因为人耳能听到的带宽是 50Hz -22000Hz,
其他的频率分量是无用的。所以基本只要储存这些模拟信号即可。
根据香农(不是咖啡的香浓)定理,保存这些模拟信号,可以通过数字
抽样的数据保存,但必须比它的最大频率大两倍,即是要求数字抽样信号
的频率是 44kHz。否则会有叠频的问题。造成差错。
大于 44khz,就可以把这个模拟的声音信号在每一 1/44000 秒的声值
大小抽取出来保存成数字信号,以便用于恢复模拟声音信号。这叫抽样。
数字抽样是如何抽呢? 就是说,在某一瞬间抽样取得声音大小分级数
也是问题,分级太多,储存量极大,分级太少,大小声音无法区分,
16bit 是个权衡值,相当于是2 的16 次方,取了1024 个级别。
声音可能是 1 级,2 级,7 级, 19 级,一直到 1024 为最大音量。
线形 pcm 就是指这些分级是线形的,而非某些优化算法非线性。
7级和8级的区别 和 1022 和 1023 的区别是一样大的。
这样抽出来数字抽样信号带有了模拟信号的信息,是一连串的 7, 9 ,
1022, 13, 989,。。。。。等等等等的数字。它记录的是一秒钟
44K 次,记录的是声音每前进 1/44000 秒的声强大小。用它就可以完整
记录声音的信息,而且因为 44000 >= 2*22000,不会出现差错。
你把每个声音采样点都减少或者增加一个常量确实感觉怪怪的,这
相当于是频域增加了无数的随机信号,频域的变化是-------
我且要算上一会儿看看表示是什么呢。不过一般是不这么做的。
你要想把信号减小或者增大,应该在时域--- 采样点都按比例的
减小或者增大,才是音量等比例减小或增大,--- 而音调不变,否则
频域比例一变,肯定是变调了。
你拿本教材就看到了。放狗是很难搜出来的。因为这些
有图的话你就看的更清楚了。可是图很难上网。
信息理论的一个基本定理是nyquist thereom,当数据采样以后,再恢复出来的信号,其频率最高只能是采样频率的一半, 也就是说,如果要保留带宽为 2k, 那么理论上的采样频率至少要是 4k.
Wiki的简介
是很难用耳朵听出区别的, 建议你使用高精度的数字采集卡然后配上Matlab或者NI的Labview来分析. 哈哈, 看起来一时半会也凑不齐这些装备来.
上过大学物理应该做过示波器实验,音频就相当于示波器屏幕上显示的波形。
这个波形X轴是时间,Y轴是电压。
采样频率的高低决定了时间采样的精细度,频率越高能还原出的音频频率就越高;
每个采样点的数值代表了这个时间点的电压值(相对值),位数越多还原出的电压值就越准确。
数字音频就等于用直方图来代替曲线图,很明显,直方图每一个长方条越细,高度的分辨率越高,长方条的顶点连成的曲线与原曲线就越接近。
16bit就是每个采样点量化(用A/D转换器)后的数值是个16位二进制数,分辨率为65536。楼下说的1024是10位二进制数。
音频电压是交流的,正负电压都有,所以这个16位数要能表示出正负来。为了处理方便,一般使使数值向上平移。
为表示方便以下以10位为例:
音频瞬间电压的绝对值并不重要,重要的是相对值,所以以下的具体电压变一下可无妨,只要所有点按同样比例变就行。
10位二进制数分辨率为1024,如果表示一个0-10V的电压,数值0=0V,512=5V,1024=10V,其他按比例算。
如果表示一个-5-+5V的电压,可以把512定为0V,1024就是+5V,0就是-5V。其他同样按比例算。
因为是交流信号,我们要还原的是各点数值在X、Y值上连成的相对曲线,所以这个曲线只要不变形,向上、下平移一段距离对还原没有影响,就象示波器看波形上下移动扫描基线一样。你把某一个wav的data chunk里所有采样点都减少或者增加一个常量后生成新的wav,实际上就是把音频曲线向下(减少)或向上(增加)平移一点。而实际把音频电压量化成数字信号时为了保证不失真都不会用满,所以少量平移不会影响原来的音质。但移的多了造成超出范围(就象示波器把波形一部分移出屏幕外),所有超出范围的点都变成最低电压或最高电压(这有个术语叫削顶,在示波器上看就是最高的部分或最低的部份变成平直线),这就造成失真,如果移的太多就会变成最高电压或最低电压的一条直线,还原出就是直流电压,这就没了声音。
你看起来是个软件专家,所以对电路什么的有点晕。
所以你在改变数据以后,可以用播放器看看效果,当然那个比较粗糙。
另外WAV文件的数据结构我估计是有的,你看一些编程的书里面应该提及,或者是与WAV相关的函数什么的。
我离开技术已经很远了,从常识上说些想法供参考。
44.1K是取样速率,就是每一秒钟取44.1k个数据,每一个数据是16bit,左右两个声道数据量就加倍。由于动态范围的原因,可能还有一个常数来描述音量的基准值或峰值。另外也可能先把信号标准化,再取样,就是先变成峰值1V的信号。
你可以先在data chunk里把左右声道先分开,看哪些数据是哪个声道的,然后注意每一个点是16bit,有两个Bytes。
也不知道帮不帮得上忙,凑合看看吧。
里面告诉你每个取样的那16bit是怎么安排的。。。
如果你的编码不同,找到相应的标准即可。
njyd老兄的平移的说法能够解释我的疑问。
再深究下去,恐怕得跑到电声学去了。各位的回答都很有启发,我埋头学习一阵子再说。
就是信号系统的基础概念。找一本信号系统的教材,把采样以及相关的时域和频域的关系看看就差不多了。楼下 landkid 已经解说了一些。njyd 给出了时域上的分析。不牵涉到电路什么的,都是些数学的东西,变来变去的。只要你有一定的数学底子,不是太难的。
时域、频域;加窗、过零率、mfcc、fft、hmm之类的也略有耳闻。但是我就是对一个采样点数据对应实际振动的过程感到理解困难,这些个采样点是如何还原成既有声强又有频率还有包络的声波?所以我猜可能涉及到电声学。
就像电路、数字电路课一样,当年也算学过,可是我从来就没明白过三极管怎么就能放大。
一个周期为 1s 的正弦波(想象一个以时间为x轴的正弦波形, 其周期为一秒),如果你一秒钟只采样一个点(均匀采样),那么你在时域得到的波形将是一条直线,如果要恢复这个波形(即便你已经知道是正弦波),你至少要在一个周期内采样稍多于两个点, 也就是说采样频率要大于你要恢复的频率的两倍.
这里面的确都是数学的东西,可以完全不要懂电路.
我对采样率没有疑问,两倍采样率,为了不发生漏掉的情况。
这个跟我理解困难的地方有点不一样啊。
信号的强度, 恢复成声波的办法就是滤波阿,
最简单的情形, 如果在采样点t1的幅度是 A1, 采样点t2的幅度是A2, 那么系统设置 t1-t2时间段的幅度为 A1 + (t-t1)/(t2-t1) * (A2-A1) , 这是线形插值,当然实际的情形要更复杂一些.
至于取得包络的方法也是滤波, 滤掉高频成分就可以了.