首頁(yè) > 評(píng)測(cè) > 第一篇 數(shù)字音頻處理系統(tǒng)的基本原理
第一篇 數(shù)字音頻處理系統(tǒng)的基本原理
- [導(dǎo)讀]
- 每個(gè)板子都能歌唱
寫(xiě)在前面:
21ic打算攜手資(tu)深(ding)直男癌晚期工程師zhanzr21,來(lái)給大家講一講嵌入式系統(tǒng)與音頻處理的故事。
關(guān)于zhanzr21:
曾經(jīng)混跡于兩岸三地,摸爬滾打在前端后端,搞過(guò)學(xué)術(shù)上過(guò)班,F(xiàn)在創(chuàng)業(yè)中,歡迎各種撩
點(diǎn)擊鏈接加入群【嵌入式音頻信號(hào)處理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks
嵌入式音頻專(zhuān)用資料代碼分享:https://pan.baidu.com/s/1dFh5pWd
本期活動(dòng)地址:https://bbs.21ic.com/icview-1698510-1-1.html
1.聲音
從物理學(xué)的角度來(lái)看,聲音就是介質(zhì)中傳播的振動(dòng).從生理學(xué)的角度來(lái)看,聲音就是聽(tīng)覺(jué)神經(jīng)接收到的脈沖.從工程的角度來(lái)看,聲音就是連續(xù)的電壓變化與內(nèi)存中的一組組變量.人耳朵能感知的聲音頻率范圍為20Hz-20KHz.超出此頻率的稱(chēng)之為超聲頻(波),低于此的稱(chēng)之次聲頻(波).深究聲音的物理學(xué),生理學(xué),心理學(xué)的屬性不是本文所能涵蓋的內(nèi)容,如同此系列的前言所言,本文只從工程的角度來(lái)理解聲音.在這個(gè)角度所理解的聲音也稱(chēng)之為音頻(信號(hào)/數(shù)據(jù)).
對(duì)于工程師來(lái)說(shuō),關(guān)心的是音頻的錄制,處理,混合與再生.這個(gè)過(guò)程中的音頻可以用兩個(gè)元素來(lái)表達(dá):幅度與時(shí)間.當(dāng)然從兩個(gè)元素衍生出很多其他復(fù)合元素,時(shí)域的音頻也時(shí)常轉(zhuǎn)到頻率來(lái)處理.但是從表面來(lái)看,音頻的輸入與輸出都可用幅度與時(shí)間這兩個(gè)元素來(lái)表達(dá).
講得哲學(xué)一點(diǎn),音頻就是一個(gè)維度上的變化(區(qū)別于視頻的二維變化,真3D視頻的三維變化).數(shù)字音頻就是這種一維變化的離散近似還原.比如任何編程語(yǔ)言中的一維數(shù)組可以表達(dá)一段音頻.播放兩個(gè)采樣之間的時(shí)間間隔決定了音頻采樣率.下圖為一段4bit采樣的正弦音頻數(shù)據(jù).
圖 聲音的數(shù)字存在形式
上圖顯示的是一種最典型的音頻采集的例子,最高幅度的聲音強(qiáng)度被表示為1111,最低的為0000.實(shí)際中使用的音頻采樣系統(tǒng),一般使用8bit至24bit的采樣深度.
沈從文先生說(shuō)過(guò),電影的美不如繪畫(huà)之美,繪畫(huà)的美不如文字之美,文字的美不如聲音之美,聲音之美不如數(shù)學(xué)之美.這段話(huà)說(shuō)的有點(diǎn)過(guò)于玄妙,有的唯心主義的色彩.大致意思是越簡(jiǎn)單的變化形式越是難以捉磨,也就顯得更加神秘迷人.用工程師的語(yǔ)言來(lái)翻譯就是:低維變化因?yàn)樾问胶?jiǎn)單,而使得變化較為二維三維變化更加能表達(dá)人類(lèi)的美學(xué)觀(guān)點(diǎn).數(shù)字音頻處理可以說(shuō)結(jié)合了音樂(lè)與數(shù)學(xué),算是美學(xué)中比較高端的內(nèi)容了.
2.數(shù)字音頻系統(tǒng)的基本組成
全模擬的音頻系統(tǒng)也是存在的,比如傳統(tǒng)的AM/FM廣播系統(tǒng)屬于全模擬的音頻系統(tǒng).這里不多評(píng)論.但是只要涉及到復(fù)雜一點(diǎn)的數(shù)學(xué)處理,那么音頻必然要先轉(zhuǎn)換為數(shù)據(jù)才能進(jìn)行處理.隨著計(jì)算能力與帶寬的飛速發(fā)展,現(xiàn)在說(shuō)的音頻系統(tǒng)一般都指的是數(shù)字音頻系統(tǒng).這樣的系統(tǒng)的特點(diǎn)就是,僅僅在聲音的入口出口兩個(gè)點(diǎn),音頻作為模擬形式存在,中間都作為數(shù)字形式被進(jìn)行濾波,放大,各種處理.一般而言,數(shù)字音頻系統(tǒng)組成如此:
圖 數(shù)字音頻系統(tǒng)的組成
下面看一看ST的F769-Discovery開(kāi)發(fā)板上的音頻系統(tǒng)組成部分:
圖 STM32F769-Discovery板子上的音頻處理系統(tǒng)組成
[1] LineIn輸入接口
[2] LineOut輸出接口
[3] 音頻Codec(主要相當(dāng)于DAC,也包含一路ADC)
[4],[5] SPDIF輸入輸出,一種特殊的信號(hào)格式,后面章節(jié)中詳敘
[6] STM32F769作為處理器,雖然不是專(zhuān)門(mén)DSP系列,計(jì)算能力也能勝任音頻DSP的功能. 也包括DFSDM接口,相當(dāng)于音頻ADC.
[7] SD卡,存儲(chǔ)設(shè)備
[8] 網(wǎng)口,可以獲取數(shù)據(jù)或者上傳數(shù)據(jù)
[9] MEMS Micphone作為模擬輸入源
這個(gè)系統(tǒng)的原理圖將在后續(xù)文章中進(jìn)行更詳細(xì)的分析.
3.音頻的形狀,Play with it!
閑話(huà)少說(shuō),現(xiàn)在開(kāi)始動(dòng)手試著感覺(jué)一下音頻形狀與味道.使用代碼來(lái)生成一段音頻數(shù)據(jù),比如生成一段1.5秒的600Hz的正弦波信號(hào)(Python 3.5環(huán)境):
#!/bin/python
#Example source code for 21ic
#Default runs in Python 3.5 Environment
#Author: zhanzr21
#Description: This Example demonstrates how to generate raw audio data.
#
import os
import math
TEST_SAMPLE_RATE = 22050
TEST_SAMPLE_LEN_SEC = 1.5
TEST_SAMPLE_NUM = int(TEST_SAMPLE_RATE * TEST_SAMPLE_LEN_SEC)
CHAN_NO = 1
AUDIO_HZ = 600
AUDIO_CYCLE = (TEST_SAMPLE_RATE/AUDIO_HZ)
test_amp_gain = 0.75
INT16_MAX = 32767
f=open('test.raw',mode='wb')
for i in range(0, TEST_SAMPLE_NUM):
test_sample = int(INT16_MAX * test_amp_gain * (math.sin(math.pi*2*(i%AUDIO_CYCLE)/AUDIO_CYCLE)))
test_ba = bytearray()
test_ba.append(test_sample&0x00ff)
test_ba.append((test_sample>>8)&0x00ff)
f.write(test_ba)
f.close()
小貼士:最簡(jiǎn)單的Py thon使用教程
Python的官方版本下載地址: https://www.python.org/downloads/ ,本文 關(guān)于一般數(shù)據(jù)處理使用Python 3開(kāi)發(fā)環(huán)境. 這里插播一下簡(jiǎn)單的實(shí)驗(yàn)步驟: 下載安裝后,點(diǎn)這里啟動(dòng)IDLE: 新建一個(gè)文件: 將這里代碼復(fù)制進(jìn)去新打開(kāi)的窗口,按F5運(yùn) 行,運(yùn)行之前提示要保存.建議單獨(dú)建立一個(gè) Python代碼文件夾保存要使用的源代碼. Python語(yǔ)言對(duì)Tab要求很?chē)?yán)格,如果網(wǎng)頁(yè)上 的代碼不能運(yùn)行請(qǐng)使用后面附帶的源代碼 使用IDLE打開(kāi)按F5直接運(yùn)行.
運(yùn)行后,相對(duì)路徑為源代碼路徑,生成文件在 該目錄下找.如果運(yùn)行有誤在第一個(gè)窗口中 |
代碼比較簡(jiǎn)單,不多介紹.只提一句,要生成的音頻振動(dòng)頻率為AUDIO_HZ, 用頻率與采樣率來(lái)計(jì)算AUDIO_CYCLE,每個(gè)周期的角度變化為2*Pi.
圖 生成的正弦波形狀
如果要生成方波呢,把上面代碼關(guān)鍵處改成這樣就可以了:
test_sample = int(test_amp_gain * (INT16_MAX if ((i%AUDIO_CYCLE)>(AUDIO_CYCLE/2)) else INT16_MIN))
圖 生成的方波形狀
如果要生成鋸齒波,這樣改:
test_sample = int(test_amp_gain * (INT16_MIN + (i%AUDIO_CYCLE)*((INT16_MAX-INT16_MIN)/AUDIO_CYCLE)))
圖 生成的鋸齒波形狀
如果要生成三角波,這樣改:
test_sample = int(test_amp_gain * (INT16_MIN + (i%AUDIO_CYCLE)*(2*(INT16_MAX-INT16_MIN)/AUDIO_CYCLE)) if ((i%AUDIO_CYCLE)<(AUDIO_CYCLE/2)) else (INT16_MAX - (i%AUDIO_CYCLE)*(2*(INT16_MAX-INT16_MIN)/AUDIO_CYCLE)))
圖 生成的三角波形狀
上面都是連續(xù)信號(hào)的還原[非數(shù)學(xué)意義上的連續(xù)信號(hào)],要產(chǎn)生那種報(bào)警用的嘟嘟嘟信號(hào),還要間歇地加一些空白區(qū),比如要產(chǎn)生200ms的間歇性數(shù)據(jù).添加兩個(gè)定義:
PULSE_HZ = 5
PULSE_CYCLE = (TEST_SAMPLE_RATE/PULSE_HZ)
再將數(shù)據(jù)生成代碼改成:
test_sample = int(INT16_MAX * test_amp_gain * (math.sin(math.pi*2*(i%AUDIO_CYCLE)/AUDIO_CYCLE))) if (0==(i//PULSE_CYCLE)%2) else 0
圖 生成的間歇性報(bào)警音頻形狀
上面的波形幅度都是一致的,再看看幅度隨著時(shí)間衰減與增加的效果.
數(shù)據(jù)生成代碼改成:
test_sample = int(INT16_MAX *
((2*i)/TEST_SAMPLE_NUM if i <(TEST_SAMPLE_NUM//2) else (2-(2*i)/TEST_SAMPLE_NUM)) *
(math.sin(math.pi*2*(i%AUDIO_CYCLE)/AUDIO_CYCLE)))
圖 生成的幅度先增強(qiáng)后減弱的正弦音頻形狀(正弦要拉長(zhǎng)時(shí)間軸才看得出)
當(dāng)然還可以生成各種形狀,這里就留給大家發(fā)揮想象力了.比如將生成數(shù)據(jù)那一行改成這樣:
test_sample = random.randint(INT16_MIN, INT16_MAX)
會(huì)生成怎樣的波形呢? 留給大家做實(shí)驗(yàn).
這里順便再提一下,本文所有代碼都會(huì)有附件提供以便讀者方便實(shí)驗(yàn).一般數(shù)據(jù)處理性質(zhì)的代碼為python代碼,復(fù)雜的數(shù)據(jù)處理為Matlab/Octave代碼,有必要還會(huì)提供C/C++代碼.嵌入式系統(tǒng)的將會(huì)給出硬件原理圖與配套代碼.
這個(gè)生成的test.raw文件的大小為66150字節(jié).是這么計(jì)算的:
raw_file_size = 采樣率 * 聲道數(shù) * (聲道位寬/8) * 音頻持續(xù)長(zhǎng)度
看看上面的代碼就知道: 我們定義的采樣率 = 22050, 聲道為單聲道, 位寬為16bit, 持續(xù)長(zhǎng)度為1.5秒.
這里稱(chēng)之為raw文件,意思為原始格式,也有稱(chēng)為binaryx文件的. 對(duì)于這種數(shù)據(jù),生成者與使用者都要知道數(shù)據(jù)的含義才行.和嵌入式開(kāi)發(fā)中用來(lái)燒錄的binary文件是一個(gè)道理,事實(shí)上后面的章節(jié)中會(huì)將此文件直接燒錄到板子上進(jìn)行播放.我們這里可以試著使用燒寫(xiě)工具Jlink打開(kāi)這個(gè)文件:
圖 Jlink打開(kāi)生成的原始文件test.raw
事實(shí)上就是現(xiàn)在就可以連接上板子,燒錄進(jìn)去.但是燒在哪個(gè)地址,如何使用,將在后面的章節(jié)中介紹.
4.音頻處理常用軟件Audacity簡(jiǎn)介與導(dǎo)入RAW數(shù)據(jù)
可能上面給讀者貼圖的時(shí),就有讀者要問(wèn)了,這個(gè)生成的數(shù)據(jù)怎么弄成波形的.
答案是:用Audacity這個(gè)軟件顯示的.雖然不用它也有很多辦法來(lái)完成本文的很多任務(wù),但是本文的主旨是講解音頻的處理的數(shù)學(xué)與信號(hào)處理部分的原理,能利用的工具都要利用起來(lái)以提高學(xué)習(xí)與工作的效率.
先簡(jiǎn)單介紹一下這個(gè)軟件,因?yàn)楹竺婧芏嗟胤蕉家玫剿?簡(jiǎn)單言之,Audacity是個(gè)音頻的編輯器,就像文本編輯器是寫(xiě)文章的工具一樣.Audacity是個(gè)跨平臺(tái)的軟件,不管你用什么系統(tǒng)都能用.怎么安裝這里就不多講,網(wǎng)址在這里:
它的功能包括:
· 導(dǎo)入各種音頻數(shù)據(jù)(比如我們剛剛生成的Raw格式,后面要講的wav,aiff,mp3,ogg,flac,aac等)
· 錄音/播放
· 復(fù)制,粘貼,剪切(比如大家熟知很多文本編輯器的快捷操作都能使用,Home到一段音頻的開(kāi)始,End到結(jié)尾,Ctrl+C, Ctrl+P, Ctrl+X,鼠標(biāo)拖拉,Ctrl+滑輪縮放等等)
· 格式轉(zhuǎn)換
· 生成某些效果(如延遲,回音,變速,濾波等等)
· 頻譜分析
等等等,具體的功能我們用到的時(shí)再介紹.
這里先說(shuō)說(shuō)怎么導(dǎo)入我們剛剛生成的數(shù)據(jù).
圖 導(dǎo)入RAW數(shù)據(jù)
選中剛剛生成的raw文件,彈出選項(xiàng)筐:
圖 導(dǎo)入的選項(xiàng)
因?yàn)槭莚aw數(shù)據(jù),文件中沒(méi)有任何關(guān)于此音頻的信息,所以這里要手工填入我們生成數(shù)據(jù)的參數(shù).填寫(xiě)好之后,點(diǎn)Import就能看到波形了.此時(shí)可以各種操作,放大局部,剪切,播放啊.大家可以試試聽(tīng)聽(tīng)同樣頻率的正弦波,方波,鋸齒波效果有何差異.也可以試著改改生成數(shù)據(jù)代碼,試試不同數(shù)據(jù)的效果.
5.音頻的采樣率
上面我們代碼中設(shè)定的采樣率為22050,這個(gè)頻率屬于常用的音頻采樣率之一(雖然很多比較新的聲卡已經(jīng)將最低輸入采樣率提升到了44100).采樣率的意思是對(duì)音頻信號(hào)進(jìn)行采樣的頻率,這個(gè)頻率在音頻中間處理與最后播放都要用到.比如作者PC上VIA HD Audio聲卡支持的采樣率可以在音頻設(shè)備的驅(qū)動(dòng)中看到:
圖 PC音頻設(shè)備的采樣率設(shè)置
對(duì)于使用內(nèi)部音頻外設(shè)的嵌入式設(shè)備(如F769的內(nèi)部SAI),支持的采樣率跟CPU使用的PLL設(shè)定有關(guān).如果使用外部音頻IC,那么支持的采樣率跟外部音頻IC使用的晶體或者時(shí)鐘輸入有關(guān).關(guān)于采樣率配置的計(jì)算,后面章節(jié)中會(huì)介紹.
如果將22050的數(shù)據(jù)以44100的頻率播放,那么聽(tīng)到的就是頻率快了一倍的效果.相反以11025的頻率播放則是頻率慢了一倍的效果.在使用Audacity導(dǎo)入的時(shí)讀者可以試驗(yàn)一下這種效果.讀者可能對(duì)ADC都有一定的理解,采樣率越高,對(duì)原信號(hào)的還原度也就越高.但是占用的存儲(chǔ)與傳輸帶寬也越高.這也是后文要講的音頻壓縮的緣由之一.這里我們改改代碼,以96K的采樣率生成同樣頻率振動(dòng)正弦波的音頻數(shù)據(jù).
在生成正弦波形數(shù)據(jù)的代碼中改這一句:
TEST_SAMPLE_RATE = 96000
當(dāng)然也把生成文件名改一改,以免覆蓋之前的生成結(jié)果:
f=open('test_2.raw',mode='wb')
運(yùn)行,導(dǎo)入,看看兩個(gè)采樣率的波形:
圖 22050采樣率的波形對(duì)比96000采樣率的波形
可以看出來(lái)下面的形狀明顯要光滑一點(diǎn),但是這個(gè)例子中兩種采樣率的數(shù)據(jù)可能聽(tīng)不出差別來(lái).因?yàn)閷?shí)驗(yàn)音頻振動(dòng)的頻率為600Hz,根據(jù)Nyquist采樣定理,1.2K以上的采樣頻率已經(jīng)能夠基本還原這個(gè)振動(dòng)了.22050比600高的多,所以聽(tīng)起來(lái)差別不大.讀者可以改變一下代碼,比如生成振動(dòng)頻率為12K的數(shù)據(jù),那么這兩種采樣率生成的效果是可以聽(tīng)出來(lái)差別的.
對(duì)于比較簡(jiǎn)單的嵌入式系統(tǒng)來(lái)講,或者早期帶寬不富裕的時(shí)代,除了壓縮的措施,在不怎么重視音頻還原度的應(yīng)用場(chǎng)合(比如電話(huà))采樣率與采樣深度總是越小越好.比如熟悉通信系統(tǒng)的人可能會(huì)聽(tīng)說(shuō)過(guò)"一路PSTN的帶寬"這樣的術(shù)語(yǔ).這里說(shuō)的就是一路最簡(jiǎn)單的電話(huà)語(yǔ)音傳輸帶寬:64kbps.這個(gè)是8K的采樣率8bit的采樣寬度得來(lái)的帶寬需求.8K怎么得來(lái)的呢,原來(lái)一般人說(shuō)話(huà)聲音的主要部分頻譜最高只能達(dá)到3400Hz,普通人大概是85Hz-1100Hz這個(gè)范圍.那么根據(jù)Nyquist的公式3.4K乘以2再加上一點(diǎn)余量就是8K的采樣率.8K的采樣率被認(rèn)為能傳輸絕大多數(shù)的聲音內(nèi)容.這是一段講話(huà)(8K,Signed16bit PCM)的頻譜:
圖 一段講話(huà)音頻的頻譜
可以看頻譜集中在400Hz至1000Hz左右. 關(guān)于頻譜的介紹將會(huì)放在后面章節(jié).此處提到頻譜是為了說(shuō)明對(duì)于采樣語(yǔ)音音頻,8000Hz一般被認(rèn)為是最低采樣率. 而對(duì)于音樂(lè),最低采樣率的要求則要高的多.比如所謂的CD音質(zhì)的采樣率為44100Hz, 所謂的DVD音質(zhì)的采樣率為48000Hz.
6.小結(jié)
本文介紹了聲音的基本知識(shí)與用代碼生成raw格式的基本音頻數(shù)據(jù).還介紹了音頻編輯軟件Audacity以及使用此工具查看原始音頻數(shù)據(jù).由于是第一篇,筆者對(duì)篇幅長(zhǎng)短沒(méi)有什么概念,不知道寫(xiě)的多了還是少了,這一點(diǎn)非常需要讀者反饋.
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評(píng)論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開(kāi)放投稿
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開(kāi)發(fā)
預(yù)算:¥1100000015小時(shí)前
- 12V汽車(chē)啟動(dòng)電源項(xiàng)目BMS設(shè)計(jì)
預(yù)算:¥50000023小時(shí)前
- 數(shù)據(jù)可視化軟件 開(kāi)發(fā)
預(yù)算:¥5000023小時(shí)前
- PLC項(xiàng)目調(diào)試修改
預(yù)算:¥100001天前
- 起動(dòng)電機(jī)控制器開(kāi)發(fā)
預(yù)算:¥1100001天前