首頁 > 評測 > 第一篇 數(shù)字音頻處理系統(tǒng)的基本原理

第一篇 數(shù)字音頻處理系統(tǒng)的基本原理

嵌入式   音頻處理   EBCS   
  • 作者:zhanzr21
  • 來源:21ic
  • [導讀]
  • 每個板子都能歌唱

寫在前面:

21ic打算攜手資(tu)深(ding)直男癌晚期工程師zhanzr21,來給大家講一講嵌入式系統(tǒng)與音頻處理的故事。

關(guān)于zhanzr21

曾經(jīng)混跡于兩岸三地,摸爬滾打在前端后端,搞過學術(shù)上過班。現(xiàn)在創(chuàng)業(yè)中,歡迎各種撩

點擊鏈接加入群【嵌入式音頻信號處理】:https://jq.qq.com/?_wv=1027&k=45wk8Ks

嵌入式音頻專用資料代碼分享:https://pan.baidu.com/s/1dFh5pWd

本期活動地址:https://bbs.21ic.com/icview-1698510-1-1.html

 

 1.聲音

從物理學的角度來看,聲音就是介質(zhì)中傳播的振動.從生理學的角度來看,聲音就是聽覺神經(jīng)接收到的脈沖.從工程的角度來看,聲音就是連續(xù)的電壓變化與內(nèi)存中的一組組變量.人耳朵能感知的聲音頻率范圍為20Hz-20KHz.超出此頻率的稱之為超聲頻(波),低于此的稱之次聲頻(波).深究聲音的物理學,生理學,心理學的屬性不是本文所能涵蓋的內(nèi)容,如同此系列的前言所言,本文只從工程的角度來理解聲音.在這個角度所理解的聲音也稱之為音頻(信號/數(shù)據(jù)).

對于工程師來說,關(guān)心的是音頻的錄制,處理,混合與再生.這個過程中的音頻可以用兩個元素來表達:幅度與時間.當然從兩個元素衍生出很多其他復合元素,時域的音頻也時常轉(zhuǎn)到頻率來處理.但是從表面來看,音頻的輸入與輸出都可用幅度與時間這兩個元素來表達.

講得哲學一點,音頻就是一個維度上的變化(區(qū)別于視頻的二維變化,真3D視頻的三維變化).數(shù)字音頻就是這種一維變化的離散近似還原.比如任何編程語言中的一維數(shù)組可以表達一段音頻.播放兩個采樣之間的時間間隔決定了音頻采樣率.下圖為一段4bit采樣的正弦音頻數(shù)據(jù).

聲音的數(shù)字存在形式.jpg

圖 聲音的數(shù)字存在形式

上圖顯示的是一種最典型的音頻采集的例子,最高幅度的聲音強度被表示為1111,最低的為0000.實際中使用的音頻采樣系統(tǒng),一般使用8bit至24bit的采樣深度.

沈從文先生說過,電影的美不如繪畫之美,繪畫的美不如文字之美,文字的美不如聲音之美,聲音之美不如數(shù)學之美.這段話說的有點過于玄妙,有的唯心主義的色彩.大致意思是越簡單的變化形式越是難以捉磨,也就顯得更加神秘迷人.用工程師的語言來翻譯就是:低維變化因為形式簡單,而使得變化較為二維三維變化更加能表達人類的美學觀點.數(shù)字音頻處理可以說結(jié)合了音樂與數(shù)學,算是美學中比較高端的內(nèi)容了.

2.數(shù)字音頻系統(tǒng)的基本組成

全模擬的音頻系統(tǒng)也是存在的,比如傳統(tǒng)的AM/FM廣播系統(tǒng)屬于全模擬的音頻系統(tǒng).這里不多評論.但是只要涉及到復雜一點的數(shù)學處理,那么音頻必然要先轉(zhuǎn)換為數(shù)據(jù)才能進行處理.隨著計算能力與帶寬的飛速發(fā)展,現(xiàn)在說的音頻系統(tǒng)一般都指的是數(shù)字音頻系統(tǒng).這樣的系統(tǒng)的特點就是,僅僅在聲音的入口出口兩個點,音頻作為模擬形式存在,中間都作為數(shù)字形式被進行濾波,放大,各種處理.一般而言,數(shù)字音頻系統(tǒng)組成如此:

數(shù)字音頻系統(tǒng)的組成.jpg

圖 數(shù)字音頻系統(tǒng)的組成

下面看一看ST的F769-Discovery開發(fā)板上的音頻系統(tǒng)組成部分:

STM32F769I-DISCO板子上的音頻處理系統(tǒng).jpg

圖 STM32F769-Discovery板子上的音頻處理系統(tǒng)組成

[1] LineIn輸入接口

[2] LineOut輸出接口

[3] 音頻Codec(主要相當于DAC,也包含一路ADC)

[4],[5] SPDIF輸入輸出,一種特殊的信號格式,后面章節(jié)中詳敘

[6] STM32F769作為處理器,雖然不是專門DSP系列,計算能力也能勝任音頻DSP的功能. 也包括DFSDM接口,相當于音頻ADC.

[7] SD卡,存儲設(shè)備

[8] 網(wǎng)口,可以獲取數(shù)據(jù)或者上傳數(shù)據(jù)

[9] MEMS Micphone作為模擬輸入源

這個系統(tǒng)的原理圖將在后續(xù)文章中進行更詳細的分析.

3.音頻的形狀,Play with it!

閑話少說,現(xiàn)在開始動手試著感覺一下音頻形狀與味道.使用代碼來生成一段音頻數(shù)據(jù),比如生成一段1.5秒的600Hz的正弦波信號(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()

 

小貼士:最簡單的Py thon使用教程

 

Python的官方版本下載地址:

https://www.python.org/downloads/ ,本文

關(guān)于一般數(shù)據(jù)處理使用Python 3開發(fā)環(huán)境.

這里插播一下簡單的實驗步驟:

下載安裝后,點這里啟動IDLE:

11.jpg

新建一個文件:

22.jpg

將這里代碼復制進去新打開的窗口,按F5運

行,運行之前提示要保存.建議單獨建立一個

Python代碼文件夾保存要使用的源代碼.

Python語言對Tab要求很嚴格,如果網(wǎng)頁上

的代碼不能運行請使用后面附帶的源代碼

使用IDLE打開按F5直接運行.

 

運行后,相對路徑為源代碼路徑,生成文件在

該目錄下找.如果運行有誤在第一個窗口中
會有顯示.

代碼比較簡單,不多介紹.只提一句,要生成的音頻振動頻率為AUDIO_HZ, 用頻率與采樣率來計算AUDIO_CYCLE,每個周期的角度變化為2*Pi.

生成的正弦波形狀.jpg

圖 生成的正弦波形狀

如果要生成方波呢,把上面代碼關(guān)鍵處改成這樣就可以了:

test_sample = int(test_amp_gain * (INT16_MAX if ((i%AUDIO_CYCLE)>(AUDIO_CYCLE/2)) else INT16_MIN))

生成的方波形狀.jpg

圖 生成的方波形狀

如果要生成鋸齒波,這樣改:

test_sample = int(test_amp_gain * (INT16_MIN + (i%AUDIO_CYCLE)*((INT16_MAX-INT16_MIN)/AUDIO_CYCLE)))

生成的鋸齒波形狀.jpg

圖 生成的鋸齒波形狀

如果要生成三角波,這樣改:

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)))

生成的三角波形狀.jpg

圖 生成的三角波形狀

上面都是連續(xù)信號的還原[非數(shù)學意義上的連續(xù)信號],要產(chǎn)生那種報警用的嘟嘟嘟信號,還要間歇地加一些空白區(qū),比如要產(chǎn)生200ms的間歇性數(shù)據(jù).添加兩個定義:

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

報警聲音頻形狀.jpg

圖 生成的間歇性報警音頻形狀

上面的波形幅度都是一致的,再看看幅度隨著時間衰減與增加的效果.

數(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)))

生成的幅度先增強后減弱的正弦音頻形狀.jpg

圖 生成的幅度先增強后減弱的正弦音頻形狀(正弦要拉長時間軸才看得出)

當然還可以生成各種形狀,這里就留給大家發(fā)揮想象力了.比如將生成數(shù)據(jù)那一行改成這樣:

test_sample = random.randint(INT16_MIN, INT16_MAX)

會生成怎樣的波形呢? 留給大家做實驗.

這里順便再提一下,本文所有代碼都會有附件提供以便讀者方便實驗.一般數(shù)據(jù)處理性質(zhì)的代碼為python代碼,復雜的數(shù)據(jù)處理為Matlab/Octave代碼,有必要還會提供C/C++代碼.嵌入式系統(tǒng)的將會給出硬件原理圖與配套代碼.

這個生成的test.raw文件的大小為66150字節(jié).是這么計算的:

raw_file_size = 采樣率 * 聲道數(shù) * (聲道位寬/8) * 音頻持續(xù)長度

看看上面的代碼就知道: 我們定義的采樣率 = 22050, 聲道為單聲道, 位寬為16bit, 持續(xù)長度為1.5秒.

這里稱之為raw文件,意思為原始格式,也有稱為binaryx文件的. 對于這種數(shù)據(jù),生成者與使用者都要知道數(shù)據(jù)的含義才行.和嵌入式開發(fā)中用來燒錄的binary文件是一個道理,事實上后面的章節(jié)中會將此文件直接燒錄到板子上進行播放.我們這里可以試著使用燒寫工具Jlink打開這個文件:

Jlink打開生成的原始文件test.raw.jpg

圖 Jlink打開生成的原始文件test.raw

事實上就是現(xiàn)在就可以連接上板子,燒錄進去.但是燒在哪個地址,如何使用,將在后面的章節(jié)中介紹.

4.音頻處理常用軟件Audacity簡介與導入RAW數(shù)據(jù)

可能上面給讀者貼圖的時,就有讀者要問了,這個生成的數(shù)據(jù)怎么弄成波形的.

答案是:用Audacity這個軟件顯示的.雖然不用它也有很多辦法來完成本文的很多任務(wù),但是本文的主旨是講解音頻的處理的數(shù)學與信號處理部分的原理,能利用的工具都要利用起來以提高學習與工作的效率.

先簡單介紹一下這個軟件,因為后面很多地方都要用到它.簡單言之,Audacity是個音頻的編輯器,就像文本編輯器是寫文章的工具一樣.Audacity是個跨平臺的軟件,不管你用什么系統(tǒng)都能用.怎么安裝這里就不多講,網(wǎng)址在這里:

http://www.audacityteam.org/

它的功能包括:

· 導入各種音頻數(shù)據(jù)(比如我們剛剛生成的Raw格式,后面要講的wav,aiff,mp3,ogg,flac,aac等)

· 錄音/播放

· 復制,粘貼,剪切(比如大家熟知很多文本編輯器的快捷操作都能使用,Home到一段音頻的開始,End到結(jié)尾,Ctrl+C, Ctrl+P, Ctrl+X,鼠標拖拉,Ctrl+滑輪縮放等等)

· 格式轉(zhuǎn)換

· 生成某些效果(如延遲,回音,變速,濾波等等)

· 頻譜分析

等等等,具體的功能我們用到的時再介紹.

這里先說說怎么導入我們剛剛生成的數(shù)據(jù).

導入RAW數(shù)據(jù).jpg

圖 導入RAW數(shù)據(jù)

選中剛剛生成的raw文件,彈出選項筐:

導入的選項.jpg

圖 導入的選項

因為是raw數(shù)據(jù),文件中沒有任何關(guān)于此音頻的信息,所以這里要手工填入我們生成數(shù)據(jù)的參數(shù).填寫好之后,點Import就能看到波形了.此時可以各種操作,放大局部,剪切,播放啊.大家可以試試聽聽同樣頻率的正弦波,方波,鋸齒波效果有何差異.也可以試著改改生成數(shù)據(jù)代碼,試試不同數(shù)據(jù)的效果.

5.音頻的采樣率

上面我們代碼中設(shè)定的采樣率為22050,這個頻率屬于常用的音頻采樣率之一(雖然很多比較新的聲卡已經(jīng)將最低輸入采樣率提升到了44100).采樣率的意思是對音頻信號進行采樣的頻率,這個頻率在音頻中間處理與最后播放都要用到.比如作者PC上VIA HD Audio聲卡支持的采樣率可以在音頻設(shè)備的驅(qū)動中看到:

PC音頻設(shè)備的采樣率設(shè)置.jpg

圖 PC音頻設(shè)備的采樣率設(shè)置

對于使用內(nèi)部音頻外設(shè)的嵌入式設(shè)備(如F769的內(nèi)部SAI),支持的采樣率跟CPU使用的PLL設(shè)定有關(guān).如果使用外部音頻IC,那么支持的采樣率跟外部音頻IC使用的晶體或者時鐘輸入有關(guān).關(guān)于采樣率配置的計算,后面章節(jié)中會介紹.

如果將22050的數(shù)據(jù)以44100的頻率播放,那么聽到的就是頻率快了一倍的效果.相反以11025的頻率播放則是頻率慢了一倍的效果.在使用Audacity導入的時讀者可以試驗一下這種效果.讀者可能對ADC都有一定的理解,采樣率越高,對原信號的還原度也就越高.但是占用的存儲與傳輸帶寬也越高.這也是后文要講的音頻壓縮的緣由之一.這里我們改改代碼,以96K的采樣率生成同樣頻率振動正弦波的音頻數(shù)據(jù).

在生成正弦波形數(shù)據(jù)的代碼中改這一句:

TEST_SAMPLE_RATE = 96000

當然也把生成文件名改一改,以免覆蓋之前的生成結(jié)果:

f=open('test_2.raw',mode='wb')

運行,導入,看看兩個采樣率的波形:

圖 22050采樣率的波形對比96000采樣率的波形.jpg

圖 22050采樣率的波形對比96000采樣率的波形

可以看出來下面的形狀明顯要光滑一點,但是這個例子中兩種采樣率的數(shù)據(jù)可能聽不出差別來.因為實驗音頻振動的頻率為600Hz,根據(jù)Nyquist采樣定理,1.2K以上的采樣頻率已經(jīng)能夠基本還原這個振動了.22050比600高的多,所以聽起來差別不大.讀者可以改變一下代碼,比如生成振動頻率為12K的數(shù)據(jù),那么這兩種采樣率生成的效果是可以聽出來差別的.

對于比較簡單的嵌入式系統(tǒng)來講,或者早期帶寬不富裕的時代,除了壓縮的措施,在不怎么重視音頻還原度的應(yīng)用場合(比如電話)采樣率與采樣深度總是越小越好.比如熟悉通信系統(tǒng)的人可能會聽說過"一路PSTN的帶寬"這樣的術(shù)語.這里說的就是一路最簡單的電話語音傳輸帶寬:64kbps.這個是8K的采樣率8bit的采樣寬度得來的帶寬需求.8K怎么得來的呢,原來一般人說話聲音的主要部分頻譜最高只能達到3400Hz,普通人大概是85Hz-1100Hz這個范圍.那么根據(jù)Nyquist的公式3.4K乘以2再加上一點余量就是8K的采樣率.8K的采樣率被認為能傳輸絕大多數(shù)的聲音內(nèi)容.這是一段講話(8K,Signed16bit PCM)的頻譜:

一段講話音頻的頻譜.jpg

圖 一段講話音頻的頻譜

可以看頻譜集中在400Hz至1000Hz左右. 關(guān)于頻譜的介紹將會放在后面章節(jié).此處提到頻譜是為了說明對于采樣語音音頻,8000Hz一般被認為是最低采樣率. 而對于音樂,最低采樣率的要求則要高的多.比如所謂的CD音質(zhì)的采樣率為44100Hz, 所謂的DVD音質(zhì)的采樣率為48000Hz.

6.小結(jié)

本文介紹了聲音的基本知識與用代碼生成raw格式的基本音頻數(shù)據(jù).還介紹了音頻編輯軟件Audacity以及使用此工具查看原始音頻數(shù)據(jù).由于是第一篇,筆者對篇幅長短沒有什么概念,不知道寫的多了還是少了,這一點非常需要讀者反饋.

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評論