摘 要:本文通過對聲音文件及音頻和音調(diào)音量的量化分析,傅立葉變換,對聲音、音頻、音調(diào)、音量的量化處理,編程實(shí)現(xiàn)了一種聲音文件圖形化過程。
關(guān)鍵詞:音頻;音調(diào);圖形
中圖分類號:TP391.41
現(xiàn)實(shí)世界中,聲音是看不見摸不到的。它是一種在空氣中傳播的無形波,對聲波波形進(jìn)行采樣后,利用模擬數(shù)字的轉(zhuǎn)換技術(shù),對形成的聲音文件進(jìn)行分析量化,就可以在屏幕上實(shí)時地畫出其形狀。這個完整的過程是一個復(fù)雜的過程,本文就這種過程的實(shí)現(xiàn)中的一個環(huán)節(jié)進(jìn)行分析,闡述一個簡單的聲音的圖形化描述,并利用編程語言給出了示例的計(jì)算機(jī)程序?qū)崿F(xiàn)。
聲音文件的圖形化描述,其本質(zhì)上是以圖形化的方式來還原聲音文件所記錄的原始采集信號。而圖形化波形顯示卻是以圖形化的方式還原聲音文件所記錄的聲音信號。
聲音文件一般分為:音頻、音調(diào)和音量等。如何對這些進(jìn)行量化描述,是一個要解決的問題。
1 聲音文件的結(jié)構(gòu)及音頻音調(diào)分析
聲音文件中記錄聲音原始信息,因此,理論上任何可以還原聲音的文件都可以作為圖形顯示的信息源。聲音的記錄方式有多種形式,最簡單而又最能保持聲音本色的方法是直接記錄波形。
1.1 音調(diào)
基頻(fundamental frequency),指當(dāng)發(fā)聲體由于震動而發(fā)出聲音時,聲音一般可以分解為許多單純的正弦波,也就是說所有的自然聲音基本都是由許多頻率不同的正弦波組成的,其中頻率最低的正弦波即為基音,而其他頻率較高的正弦波則為泛音。
音調(diào)(pitch)在音樂領(lǐng)域里指的是人類心理對音符基本頻率的感受。
基頻與音調(diào)存在一個轉(zhuǎn)換關(guān)系:
1.2 聲音的量化PCM(PulseCode Modulation)
在數(shù)字信號處理中,量化是指將信號的連續(xù)取值(或者大量可能的離散取值)近似為有限多個(或較少的)離散值的過程。量化主要應(yīng)用于從連續(xù)信號到數(shù)字信號的轉(zhuǎn)換中。連續(xù)信號經(jīng)過采樣成為離散信號,離散信號經(jīng)過量化即成為數(shù)字信號。注意離散信號并不需要經(jīng)過量化的過程。信號的采樣和量化通常都是由ADC實(shí)現(xiàn)的。
CD音頻信號就是按照44110Hz的頻率采樣,按16位元量化為有著65536(=2^{16})個可能取值的數(shù)字信號。
聲音的量化就是將模擬聲音的波形轉(zhuǎn)換為數(shù)字,采樣值的二進(jìn)制位數(shù)決定了量化的精度。量化的過程就是先將整個幅度劃分成有限個小幅度(量化階距)的集合,把落入某個階距內(nèi)的樣值歸為一類,并賦予相同的量化值。
音頻文件中存儲的一般都是壓縮過的PCM數(shù)據(jù),經(jīng)過解碼后就變成了可處理的PCM數(shù)據(jù)。
1.3 傅立葉變換
傅里葉變換是一種線性的積分變換,通常在將信號在時域和頻域之間變換時使用。就聲音音調(diào)識別來說,傅立葉變換可以將以時間為自變量的振幅函數(shù)vol(t)變換到以頻率為自變量的振幅函數(shù)vol(f)。
1.4 音調(diào)的識別流程
規(guī)定一個Δt,假設(shè)在Δt時間段內(nèi),音調(diào)是不變的.對vol(t)進(jìn)行分割,分成[0,Δt],[Δt,2Δt] … [t-Δt,t]多個區(qū)間.分別對vol(t)的多個區(qū)間進(jìn)行傅立葉變換,得出頻率分布譜,找到最大振幅對應(yīng)的頻率(一般情況下音量最大的頻率即為基本頻率)。更好的方法則是利用基本頻率與音調(diào)變換關(guān)系,對得出來的頻率進(jìn)行變換,得到的pitch(t),即為聲音的音調(diào)在變化譜線。
這種變形的傅立葉變換即為短時傅立葉變換能夠觀察出信號瞬時頻率的信息。
2 編程實(shí)現(xiàn)圖形化過程
function pitch()
//讀取音頻文件
[stream, sample_rate] = audioread('test.wma');
// 處理左邊聲道
stream_left = stream(1:length(stream),1);
//假定4096個取樣點(diǎn)內(nèi),音調(diào)不變。大約0.1s
frame_size = 4096;
//獲取音頻幀數(shù)
frame_count = floor(length(stream_left) / frame_size);
pitch = zeros(1, frame_count);
for i = 1 : frame_count
//區(qū)間
pbeg = (i - 1) * frame_size + 1;
pend = i * frame_size;
stream_sub = stream_left(pbeg : pend);
fft_result = fft(stream_sub, frame_size);
[~, frequency] = max(abs(fft_result));
pitch(i) = ceil(69 + 12 * log(frequency * sample_rate /frame_size / 440) / log(2));
end
pitch = medfilt1(pitch, 8);
plot(1 : frame_count, pitch);
end
其中,test.wma是用系統(tǒng)自帶錄音工具錄的一段do re mi fa so la xi do的哼唱。
運(yùn)行結(jié)果如下圖1:
圖1
參考文獻(xiàn):
[1]趙文博,張生,孫國強(qiáng),等.WAV音頻分句的算法設(shè)計(jì)[J].微計(jì)算機(jī)信,2011(27):204-205.
[2]李敏.音頻文件格式wave的轉(zhuǎn)換[J].電腦知識與技術(shù),2005(08):73-75.
[3]鄭宇軍.C#面向?qū)ο蟪绦蛟O(shè)計(jì)教程[M].北京:人民郵電出版社,2009:316-319.
作者簡介:許含坤(1970.08-),福建霞浦人,工程師,現(xiàn)主要從事計(jì)算機(jī)軟件教學(xué)及科研工作,研究方向:面向?qū)ο?、?shù)據(jù)庫、NET平臺應(yīng)用開發(fā)等計(jì)算機(jī)相關(guān)技術(shù)。
作者單位:福建信息職業(yè)技術(shù)學(xué)院計(jì)算機(jī)工程系,福州 350003