久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PCM編碼與Waveform音頻文件(.wav)格式詳解

 西北望msm66g9f 2020-02-06

  大家好,,我是痞子衡,,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是PCM編碼及Waveform音頻文件格式,。

  嵌入式里有時候也會和音頻打交道,,比如最近特別火的智能音箱產(chǎn)品,離不開前端的音頻信號采集、降噪,,中間的語音識別(ASR),、自然語言處理(NLP),以及后端的文語合成(TTS),、音頻播放,。音頻信號采集是處理聲音的第一步,要采集音頻就離不開PCM編碼,,音頻采集完成自然需要保存,,waveform格式(.wav)是一種最經(jīng)典的音頻文件格式。今天痞子衡就給大家詳細介紹PCM編碼以及waveform文件格式,。

一,、聲音基礎(chǔ)

  眾所周知,聲音是由物體振動產(chǎn)生的聲波,,聲音通過介質(zhì)(空氣或固體,、液體)傳播并能被人聽覺器官所感知。發(fā)音物體情況(材料,,距離,,振動強度等)不同,產(chǎn)生的聲音也不同,。為了區(qū)分不同的聲音,,我們主要用如下三個參數(shù)來描述聲音的特征:

  • 音量:人主觀上感覺到的聲音大小(也叫響度),,由“振幅”(amplitude)和人離聲源的距離決定,。

  • 音調(diào):聲音的高低(高音、低音),,由“頻率”(frequency)決定,,頻率越高音調(diào)越高。

  • 音色:音色是一種抽象的東西,,波形決定了聲音的音色,。聲音因不同發(fā)聲物體材料而具有不同特性,波形是把這個抽象特性直觀的表現(xiàn)出來,。典型的音色波形有方波,,鋸齒波,正弦波,,脈沖波等,。

  三大參數(shù)里除了音色沒有度量單位外(可以認為音色是聲音的UID,每種音色都是獨一無二的),,音量和音調(diào)均有度量單位,,這意味著音量和音調(diào)是可調(diào)整的,,也是聲音之間可對比的特征參數(shù)。

1.1 音量單位-分貝(dB)

  聲波是一種機械波(壓力波),。聲波(空氣質(zhì)點)的連續(xù)振動,,使空氣分子不斷交替的壓縮和松弛,使大氣壓迅速產(chǎn)生起伏,,這種氣壓的起伏部分,,就稱為聲壓。聲壓的振幅表示質(zhì)點離開平衡位置的距離,,反映從波形波峰到波谷的壓力變化,,以及波所攜帶的能量的多少。
  聲壓值雖然可以反映音量大小,,但人們?nèi)粘I钪杏龅降穆曇?,若以聲壓值表示,變化范圍非常大(達到六個數(shù)量級以上),,并且人體聽覺對聲信號強弱刺激反應(yīng)不是線形的,,而是成對數(shù)比例關(guān)系。因此音量并不是聲壓值來計量,,而是用分貝來計量,,首先來看分貝計算的標準公式:

NdB = 10 * log10 (Pi / Po)

  上述公式中Po為基準聲壓值,NdB即是聲壓信號Pi對基準聲壓Po的分貝值,。從公式可以看出分貝是指兩個相同類型物理量(Pi,、Po)的比較結(jié)果,它是無量綱的,。分貝又稱為被量度量Pi的'級',它代表被量度量比基準量高出多少'級',。下面列舉常見分貝值:

分貝值人耳感覺
1dB剛能聽到的聲音
1 - 15dB感覺非常安靜
20 - 40dB耳語音,,冰箱的嗡嗡聲
40 - 60dB室內(nèi)正常交談的聲音
60 - 70dB走在鬧市區(qū)的感覺,有點吵
70 - 85dB汽車穿梭在馬路上,,85dB是保護聽力的一般要求
85 - 100dB摩托車啟動,,裝修電鉆
100 - 150dB飛機起飛、燃放煙花爆竹

1.2 音調(diào)單位-頻率(Hz)

  頻率是每秒經(jīng)過一給定點的聲波周期數(shù)量,,其單位是Hz,,1KHz表示每秒經(jīng)過一給定點的聲波有1000個周期。根據(jù)頻率范圍,,我們將聲波分為如下三種:

聲波類別頻率范圍特性與應(yīng)用
次聲波低于20Hz部分動物(狗,、大象)能發(fā)出/感知,常用于自然災害監(jiān)測
可聞聲20Hz ~ 20KHz人的聽覺感知范圍
超聲波高于20KHz部分動物(狗,、蝙蝠)能發(fā)出/感知,,常用于深海探測(聲吶)、醫(yī)學檢查(B超)

  關(guān)于聲波頻率特別要提的是,聲波可以被分解為不同頻率不同強度正弦波的疊加,,這種變換(或分解)的過程,,稱為傅立葉變換(Fourier Transform)

二,、PCM編碼原理

  聲波是一種在時間上和振幅上均連續(xù)的模擬量,,在嵌入式里要想研究聲波,首先需要將聲波轉(zhuǎn)換成一連串電壓變化的模擬電信號,,麥克風器件就是一種采集聲波信號并將其轉(zhuǎn)換成模擬電壓信號輸出的裝置,。
  有了聲波的模擬電壓信號,下一步需要將模擬信號數(shù)字化,,即將模擬信號經(jīng)過模數(shù)轉(zhuǎn)換器(A/D)后變成數(shù)字信號,,說白了就是將聲音數(shù)字化。最常見的聲音數(shù)字化方式就是脈沖編碼調(diào)制PCM(Pulse Code Modulation),,PCM是70年代末發(fā)展起來的技術(shù),,最早應(yīng)用于由飛利浦和索尼公司共同推出的CD上,下圖給出了PCM編碼全過程:

  從上圖中我們可以看到PCM編碼主要有三個過程:采樣,、量化,、編碼,在這過程中主要有4個參數(shù)用于評價PCM:聲道數(shù),、采樣率,、量化位數(shù)、編碼方式,。痞子衡會在下面逐一介紹PCM編碼過程時穿插介紹這4個參數(shù):

2.1 采樣

  所謂采樣,,即按一定的采樣頻率將模擬信號變成時間軸上離散的抽樣信號的過程。原則上采樣頻率越高,,聲音的質(zhì)量也就越好,,聲音的還原也就越真實。
  采樣率即每秒從模擬信號中提取并組成離散信號的采樣個數(shù),,用赫茲(Hz)來表示,。說到采樣率有一個不得不提的著名定律,即香農(nóng)(Shannon)/奈奎斯特(Nyquist)采樣定律,,該定律表明采樣頻率必須大于或等于所傳輸?shù)哪M信號的最高頻率的2倍,,才能不失真地恢復模擬信號

最常說的“無損音頻”,,一般都是指傳統(tǒng)CD格式中的44.1kHz/16bit的文件格式,,而之所以稱為無損壓縮,是因為其包含了20Hz-22.05kHz這個完全覆蓋人耳可聞范圍的聲音頻率而得名,。

  關(guān)于聲道數(shù),,其實非常好理解,,就是采集聲音的通道數(shù),我們知道有單聲道(mono),,立體聲(雙聲道stereo),、杜比7.1環(huán)繞聲,其實就是聲音采集的通道數(shù)有差別,,聲道越多,,越能體現(xiàn)聲音的空間立體效果。

2.2 量化

  前面采樣得到的抽樣信號雖然是時間軸上離散的信號,,但仍然是模擬信號,,其采樣值在一定的取值范圍內(nèi),可有無限多個值,,必須采用“四舍五入”的方法把樣值分級“取整”,,使一定取值范圍內(nèi)的樣值由無限多個值變?yōu)橛邢迋€值,這一過程稱為量化,。
  量化位數(shù)指的是描述數(shù)字信號所使用的位數(shù),。如麥克風采集的電壓范圍為0-3.3V,8bit的量化精度為3.3V/256,,16bit的量化精度為3.3V/65536,。

2.3 編碼

  量化后的抽樣信號就轉(zhuǎn)化為按抽樣時序排列的一串十進制數(shù)字碼流,即十進制數(shù)字信號,。簡單高效的數(shù)據(jù)系統(tǒng)是二進制碼系統(tǒng),,因此,應(yīng)將十進制數(shù)字碼變換成二進制編碼,,這種把量化的抽樣信號變換成給定字長(量化位數(shù))的二進制碼流的過程稱為編碼,。
  編碼方式種類非常多,其對比可見 Comparison of audio coding formats,,PCM音頻格式編碼常見有四種:PCM(Linear PCM),、ADPCM(Adaptive differential PCM)、 A-law(A律13折線碼),、μ-law(μ律15折線碼),最簡單的當然是下圖所示的LPCM(示例為4bit),,這是一種均勻量化編碼,,廣泛用于 Audio CD, AES3, WAV, AIFF, AU, M2TS, VOB中。

  除LPCM外,,A-law和μ-law是兩種不得不提的非均勻量化編碼,,這兩種非均勻量化編碼是為了提高小信號的信噪比,其基本思想是在量化之前先讓信號經(jīng)過一次處理,,對大信號進行壓縮而對小信號進行較大的放大,,這一處理過程通常也稱為“壓縮量化”,。壓縮量化的實質(zhì)是“壓大補小”,使小信號在整個動態(tài)范圍內(nèi)的信噪比基本一致,。下面是這兩種編碼與LPCM的 對比圖,。

三、Waveform文件格式解析

  前面講的PCM編碼后的聲音數(shù)據(jù)是需要保存的,,WAVE文件常常用來保存PCM編碼數(shù)據(jù),。WAVE文件是微軟公司(Microsoft)開發(fā)的一種聲音文件格式,用于保存Windows平臺的音頻信息資源,,被Windows平臺及其應(yīng)用程序所廣泛支持,,WAVE文件默認打開工具是WINDOWS的媒體播放器。

3.1 RIFF文件格式標準

  WAVE文件是以微軟RIFF格式為標準的,,RIFF全稱為資源互換文件格式(Resources Interchange File Format),,是Windows下大部分多媒體文件遵循的一種文件結(jié)構(gòu)。RIFF文件所包含的數(shù)據(jù)類型由該文件的擴展名來標識,,能以RIFF格式存儲的數(shù)據(jù)有很多:音頻視頻交錯格式數(shù)據(jù)(.AVI),、波形格式數(shù)據(jù)(.WAV)、位圖數(shù)據(jù)格式(.RDI),、MIDI格式數(shù)據(jù)(.RMI),、調(diào)色板格式(.PAL)、多媒體電影(.RMN),、動畫光標(.ANI)等,。
  如下代碼所示的CK結(jié)構(gòu)體是RIFF文件的基本單元,該基本單元也稱 Chunk,。其中ckID用于標識塊中所包含的數(shù)據(jù)類型,,其取值可有'RIFF'、'LIST',、'fmt ',、'data'等;ckSize表示存儲在ckData域中的數(shù)據(jù)長度(不包含ckID和ckSize的大?。?;ckData存儲數(shù)據(jù),數(shù)據(jù)以字節(jié)為單位存放,,如果數(shù)據(jù)長度為奇數(shù),,則最后添加一個空字節(jié)。

由于RIFF文件結(jié)構(gòu)最初是由Microsoft和IBM為PC機所定義,,RIFF文件是按照小端little-endian字節(jié)順序?qū)懭氲摹?/span>

typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef DWORD FOURCC; // Four-character code

typedef struct {
FOURCC ckID; // The unique chunk identifier
DWORD ckSize; // The size of field <ckData>
BYTE ckData[ckSize]; // The actual data of the chunk
} CK;

  Chunk是可以嵌套的,,但是只有ckID為'RIFF'或者'LIST'的Chunk才能包含其他的Chunk。標志為'RIFF'的Chunk是比較特殊的,,每一個RIFF文件首先存放的必須是一個'RIFF' Chunk,,并且只能有這一個標志為'RIFF'的Chunk,。

  更多RIFF的知識詳見這個網(wǎng)站鏈接 RIFF (Resource Interchange File Format),鏈接里收集了很多介紹RIFF的資源,。

3.2 WAVE文件結(jié)構(gòu)

  WAVE是Microsoft開發(fā)的一種音頻文件格式,,它符合上面提到的RIFF文件格式標準,可以看作是RIFF文件的一個具體實例,。既然WAVE符合RIFF規(guī)范,,其基本的組成單元也是Chunk。一個 WAVE文件 通常有三個Chunk以及一個可選Chunk,,其在文件中的排列方式依次是:RIFF Chunk,,F(xiàn)ormat Chunk,F(xiàn)act Chunk(附加塊,,可選),,Data Chunk,如下圖所示:

  根據(jù)上面的WAVE文件結(jié)構(gòu)圖,,可以定義如下44bytes的wave_head_t用來描述WAVE文件的頭,。如果你曾經(jīng)接觸過Windows的音頻接口API,你會發(fā)現(xiàn)wave_fmt_t中的部分結(jié)構(gòu)與標準MSDN里的 WAVEFORMAT 是一致的,。

typedef char    int8_t;    //有符號8位整數(shù)
typedef short int16_t; //有符號16位整數(shù)
typedef int int32_t; //有符號32位整數(shù)

struct _wave_tag
{

int8_t riff[4]; //'RIFF',資源交換文件標志
int32_t filesize; //文件大小(從下個地址開始到文件尾的總字節(jié)數(shù))
int8_t wave[4]; //'WAVE',文件標志
} wave_tag_t;
struct _wave_format
{

int8_t fmt[4]; //'fmt ',波形格式標志
int32_t chunksize; //文件內(nèi)部Chunk信息大小
int16_t wFormatTag; //音頻數(shù)據(jù)編碼方式
int16_t wChanles; //聲道數(shù)
int32_t nSamplesPerSec; //采樣率
int32_t nAvgBytesPerSec; //波形數(shù)據(jù)傳輸速率(每秒平均字節(jié)數(shù))
int16_t nBlockAlign; //數(shù)據(jù)的調(diào)整數(shù)(按字節(jié)計算)
int16_t wBitsPerSample; //樣本數(shù)據(jù)位數(shù)
} wave_fmt_t;
struct _wave_data
{

int8_t data[4]; //'data',數(shù)據(jù)標志符
int32_t datasize; //采樣數(shù)據(jù)總長度
} wave_dat_t;

struct _wave_head
{

wave_tag_t waveTag;
wave_fmt_t waveFmt;
wave_dat_t waveDat;
} wave_head_t;

  wave_head_t結(jié)構(gòu)體內(nèi)除了wFormatTag成員之外,,其他都可以根據(jù)字面上的意思來理解。關(guān)于wFormatTag的具體定義,,可見Windows SDK里的 mmreg.h文件,,下面列舉了幾個最常見Format的Tag值定義:

  當WAVE文件的頭被解析成功后,下一步便是獲取WAVE文件里的聲音源數(shù)據(jù),,我們知道聲音文件有單聲道和多聲道之分,,對于單聲道文件很好理解,聲音數(shù)據(jù)就是按序排放,,而如果是立體聲(2聲道)文件,,那么左右聲道的聲音數(shù)據(jù)到底是怎么排放的呢?下面以一個示例立體聲文件數(shù)據(jù)(僅分析前72bytes)進行解釋:

offset(h)
00000000: 52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20
00000010: 10 00 00 00 01 00 02 00 22 56 00 00 88 58 01 00
00000020: 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00
00000030: 24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6
00000040: 3c f2 24 f2 11 ce 1a 0d

  下圖是這個72bytes數(shù)據(jù)解析圖,,從圖中可以看到,,左右聲道的聲音數(shù)據(jù)是按塊(nBlockAlign指定)交替排放的。

  更多WAVE的知識詳見這兩個網(wǎng)站鏈接 WAVE Audio File Format 和 Audio File Format Specifications,,鏈接里收集了很多介紹WAVE的資源,。

3.3 WAVE文件實例分析

  WAVE文件格式我們都了解透徹了,下面我們嘗試分析一個經(jīng)典的WAVE文件:'Windows XP 啟動.wav',,這個文件可以說是最知名的WAVE文件了,痞子衡特別喜歡這段music,,讓我們直接用二進制編輯器HxD打開它:

  按wave_head_t解析WAVE頭可知,,這段wave是44.1kHz/16bit雙聲道線性PCM碼音頻,,實際音頻數(shù)據(jù)總長度為1361076bytes(1361076(datasize)/176400(nAvgBytesPerSec)=7.7158秒),最后再用Adobe Audition(原Cool Edit)打開查看其波形圖:

  至此,,PCM編碼及Waveform音頻文件格式痞子衡便介紹完畢了,,掌聲在哪里~~~

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多