摘要:MATLAB是一款數(shù)據(jù)分析和處理功能都非常強大的科技應(yīng)用軟件,利用它可以靈活方便地分析處理音頻信號。文章介紹了用MATLAB軟件處理音頻信號的基本流程,并以實例形式列出了幾款技術(shù)實現(xiàn)程序。
關(guān)鍵詞:MATLAB;數(shù)字信號處理;音頻信號;脈沖編碼調(diào)制;數(shù)字濾波
中圖分類號:TN912.3 文獻標識碼:A 文章編號:1009-3044(2009)05-1211-03
Technological Realization of Audio Signal Processing Based on MATLAB
ZHANG Deng-qi, JIANG Min
(Department of Computer, Hunan Institute of Science and Technology, Yueyang 414006, China)
Abstract: MATLAB is a powerful signal analysis and processing software. It can be used to analyze and process audio signal with precision. This paper introduces the fundamental flow of audio signal processing with the use of MATLAB and lists several technically realizable programs by the illustration.
Key words: MATLAB; digital signal processing; audio signal; pulse code modulation; digital filter
1 引言
MATLAB是美國Math Works公司推出的一種面向工程和科學計算的交互式計算軟件。它以矩陣運算為基礎(chǔ),把計算、可視化、程序設(shè)計融合在一個簡單易用的交互式工作環(huán)境中,是一款數(shù)據(jù)分析和處理功能都非常強大的工程實用軟件。本文介紹了用MATLAB處理音頻信號的基本流程,并以實例形式列出了常用音頻處理技術(shù)實現(xiàn)程序。
2 MATLAB處理音頻信號的流程
分析和處理音頻信號,首先要對聲音信號進行采集,MATLAB 的數(shù)據(jù)采集工具箱提供了一整套命令和函數(shù),通過調(diào)用這些函數(shù)和命令,可直接控制聲卡進行數(shù)據(jù)采集[1]。Windows自帶的錄音機程序也可驅(qū)動聲卡來采集語音信號,并能保存為WAV格式文件,供MATLAB相關(guān)函數(shù)直接讀取、寫入或播放。本文以WAV格式音頻信號作為分析處理的輸入數(shù)據(jù),用MATLAB處理音頻信號的基本流程是:先將WAV格式音頻信號經(jīng)wavread 函數(shù)轉(zhuǎn)換成MATLAB列數(shù)組變量;再用MATLAB強大的運算能力進行數(shù)據(jù)分析和處理,如時域分析、頻域分析、數(shù)字濾波、信號合成、信號變換、識別和增強等等;處理后的數(shù)據(jù)如是音頻數(shù)據(jù),則可用wavwrite轉(zhuǎn)換成WAV格式文件或用sound、wavplay等函數(shù)直接回放。下面分別介紹MATLAB在音量標準化、聲道分離合并與組合、數(shù)字濾波、數(shù)據(jù)轉(zhuǎn)換等音頻信號處理方面的技術(shù)實現(xiàn)。
3 音量標準化
錄制聲音過程中需對聲音電平進行量化處理,最理想的量化是最大電平對應(yīng)最高量化比特,但實際卻很難做到,常有音輕問題。利用MATLAB很容易實現(xiàn)音量標準化,即最大電平對應(yīng)最高量化比特。基本步驟是:先用wavread函數(shù)將WAV文件轉(zhuǎn)換成列數(shù)組變量;再求出數(shù)組變量的極值并對所有元素作歸一化處理;最后用wavwrite函數(shù)還原成音量標準化的WAV文件。
例1:現(xiàn)以微軟自帶的“Windows XP 關(guān)機.wav”音頻信號為例,先將其復(fù)制另存到文件名為XPexit.wav的MATLAB當前目錄中,再通過音量標準化處理后保存為XPquit.wav文件。實現(xiàn)程序如下:
clear; close all; clc;
[Y,F(xiàn)S,NBITS]=wavread('XPexit.WAV');% 將WAV文件轉(zhuǎn)換成變量
FS,NBITS,% 顯示采樣頻率和量化比特
Ym=max(max(max(Y)),max(abs(min(Y)))),% 找出雙聲道極值
X=Y/Ym;% 歸一化處理
wavwrite(X,F(xiàn)S,NBITS,'XPquit.wav')% 將變量轉(zhuǎn)換成WAV文件
試聽可知標準化處理后音量稍大。
4 聲道分離合并與組合
立體聲或雙聲道音頻信號有左右兩個聲道,利用MATLAB實現(xiàn)雙聲道分離、兩路聲道合并和兩個單聲道組合成一個雙聲道等效果,實際上是利用了MATLAB的矩陣抽取、矩陣相加和矩陣重組運算。
例2:現(xiàn)以例1生成的XPquit.wav為例,實現(xiàn)分離、合并和組合處理的程序如下:
clear; close all; clc;
[x,F(xiàn)S,NBITS]=wavread('XPquit.WAV');% 將WAV文件轉(zhuǎn)換成變量
x1=x(:,1);% 抽取第1聲道
x2=x(:,2);% 抽取第2聲道
wavwrite(x1,F(xiàn)S,NBITS,'XPquit1.WAV');% 實現(xiàn)1聲道分離
wavwrite(x2,F(xiàn)S,NBITS,'XPquit2.WAV');% 實現(xiàn)2聲道分離
%如果合并位置不對前面補0 %聲道長度不對后面補0
x12=x1+x2;% 兩路單聲道列向量矩陣變量合并
x12m=max(max(x12),abs(min(x12))),% 找出極值
y12=x12./x12m;% 歸一化處理
wavwrite(y12,F(xiàn)S,NBITS,'XPquit12.WAV');% 實現(xiàn)兩路聲道合并
%如果組合位置不對前面補0--聲道長度不對后面補0
x3=[x1,x2];% 兩路單聲道變量組合
wavwrite(x3,F(xiàn)S,NBITS,'XPquit3.WAV');% 實現(xiàn)兩路聲道組合
可以試聽聲道分離、合并與組合的效果,也可對各文件大小進行比較。
5 數(shù)字濾波
數(shù)字濾波是常用的音頻處理技術(shù)??筛鶕?jù)技術(shù)指標,先利用FDATool工具,設(shè)計一個數(shù)字濾波器[2],再用Filter或Filter2函數(shù)即可實現(xiàn)濾波處理。調(diào)用的Filter函數(shù)格式是:Y = filte (B,A,X) 。其中,B和A是濾波器傳輸函數(shù)的分子和分母系數(shù),X是輸入變量,Y是實現(xiàn)濾波后的輸出變量。如果處理立體聲音頻信號,可分開處理,但用FIR濾波器時調(diào)用Filter2函數(shù)更方便。
例3:現(xiàn)以例2生成的XPquit12.wav為例,實現(xiàn)數(shù)字濾波的程序如下:
clear; close all; clc;
[X,F(xiàn)S,NBITS]=wavread('XPquit12.WAV');% 將WAV文件轉(zhuǎn)換成變量
%利用FDATool設(shè)計一個LowpassButterworth濾波器
%指標FS=22050Hz Fp=1000Hz Ap=1dB Fs=3000Hz As=20dB
B =[0.0062,0.0187,0.0187,0.0062];% 分子系數(shù)
A =[1,-2.1706,1.6517,-0.4312];% 分母系數(shù)
Y=filter(B,A,X);% 實現(xiàn)數(shù)字濾波
t=(0:length(X)-1)/FS;% 計算數(shù)據(jù)時刻
subplot(2,2,1);plot(t,X);% 繪制原波形圖
title('原信號波形圖');% 加標題
subplot(2,2,3);plot(t,Y);% 繪制濾波波形圖
title('濾波后波形圖');% 加標題
xf=fft(X);% 作傅里葉變換求原頻譜
yf=fft(Y);% 作傅里葉變換求濾波后頻譜
fm=3000*length(xf)/FS;% 確定繪頻譜圖的上限頻率
f=(0:fm)*FS/length(xf);% 確定繪頻譜圖的頻率刻度
subplot(2,2,2);plot(f,abs(xf(1:length(f))));% 繪制原波形頻譜圖
title('原信號頻譜圖');% 加標題
subplot(2,2,4);plot(f,abs(yf(1:length(f))));% 繪制濾波后頻譜圖
title('濾波后信號頻譜圖');% 加標題
wavwrite(Y,F(xiàn)S,NBITS,'XPquitFilter.WAV');% 寫成WAV文件
程序運行結(jié)果如圖1所示。由圖可知,濾波對波形影響不大,但對高頻有較大衰減。試聽會感覺到處理后的聲音比較沉悶。
6 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)轉(zhuǎn)換是指改變音頻格式中的采樣頻率或量化位數(shù)。轉(zhuǎn)換原理是:先用矩陣插值或抽取技術(shù)實現(xiàn)變量變換,如果是抽取數(shù)據(jù)還需在變換前作濾波處理使之滿足采樣定理;變量變換完成后再用Wavwrite函數(shù)重新定義量化位數(shù)和采樣頻率即可實現(xiàn)數(shù)據(jù)轉(zhuǎn)換。數(shù)據(jù)轉(zhuǎn)換過程中,要注意采樣頻率與原始采樣頻率及插值或抽取系數(shù)的關(guān)系。MATLAB實現(xiàn)插值或抽取的函數(shù)有decimate、interp和resample,具體應(yīng)用可參考有關(guān)文獻[3]。這果以2倍抽取為例,將例3中經(jīng)過濾波后產(chǎn)生的XPquitFilter.WAV文件進行數(shù)據(jù)轉(zhuǎn)換處理。具體程序如下:
clear; close all; clc;
[x,F(xiàn)S,NBITS]=wavread('XPquitFilter.WAV');% 將WAV文件轉(zhuǎn)換成變量
N=length(x);% 計算數(shù)據(jù)點數(shù)
% 不是偶數(shù)點化成偶數(shù)點
if mod(N,2)==0; N=N; else x(N)=[]; N=N-1; end;
% 原信號波形頻譜分析
tx=(0:N-1)/FS;% 計算原信號數(shù)據(jù)點時刻
subplot(3,2,1);plot(tx,x);% 繪制原信號波形
title('原信號波形圖');% 加標題
xf=fft(x);% 求原信號頻譜
fx=(0:N/2)*FS/N;% 確定頻譜圖頻率刻度
subplot(3,2,2);plot(fx,abs(xf(1:N/2+1)));% 繪制原信號頻譜
title('原信號頻譜圖');% 加標題
% 實現(xiàn)數(shù)據(jù)抽取
k=[1:N/2];% 確定抽取位置
y=x(2*k);% 實現(xiàn)抽取后的數(shù)據(jù)
M=length(y);% 計算抽取后數(shù)據(jù)點數(shù)
% 抽取數(shù)據(jù)在原采樣頻率FS下的波形頻譜分析
ty=(0:M-1)/FS;% 計算數(shù)據(jù)點時刻
subplot(3,2,3);plot(ty,y);% 繪制信號波形圖
title('原采樣率下新波形圖');% 加標題
yf=fft(y);% 求頻譜
fy=(0:M/2)*FS/M;% 確定頻譜圖頻率刻度
subplot(3,2,4);plot(fy,abs(yf(1:M/2+1)));% 繪制頻譜圖
title('原采樣率下新頻譜圖');% 加標題
% 抽取數(shù)據(jù)在FS/2采樣頻率下的波形頻譜分析
tz=(0:M-1)/(FS/2);% 計算數(shù)據(jù)點時刻
subplot(3,2,5);plot(tz,y);% 繪制信號波形圖
title('新采樣率下新波形圖');% 加標題
fz=(0:M/2)*(FS/2)/M;% 確定頻譜圖頻率刻度
subplot(3,2,6);plot(fz,abs(yf(1:M/2+1)));% 繪制頻譜圖
title('新采樣率下新頻譜圖');% 加標題
% 實現(xiàn)數(shù)據(jù)轉(zhuǎn)換
wavwrite(y,F(xiàn)S/2,NBITS,'XPquit16B.WAV');% 音頻格式PCM 11025Hz 16位
wavwrite(y,F(xiàn)S/2,NBITS/2,'XPquit8B.WAV');% 音頻格式PCM 11025Hz 8位
運行程序,在得到的圖形窗口中,執(zhí)行Edit/Axes Properties…命令,再把各分圖下X標簽中的Limits設(shè)為0、0.01和0、1000,得到0—0.01秒的波形和0—1000Hz的頻譜如圖2所示。由圖可知,在滿足采樣定律條件下,實現(xiàn)數(shù)據(jù)抽取,在原采樣率下波形變密、頻譜變寬且幅度減半,但在新采樣率下波形和頻譜都很好。通過試聽輸出文件還可感受處理效果。
7 結(jié)束語
MATLAB提供了許多專用工具箱,靈活利用這些工具箱和函數(shù),可以實現(xiàn)很多信號處理任務(wù)。同時,MATLAB還支持用戶對其函數(shù)進行二次開發(fā),以滿足不同要求。在信號處理過程中,MATLAB兼顧了專用工具軟件的簡單性和計算機程序語言的靈活性,特別是處理效果的可視性和可感知,有利于理解信號處理的本質(zhì),有利于激發(fā)學習和研究興趣,也有利于培養(yǎng)MATLAB軟件的操作技能。
參考文獻:
[1] 陳宇鋒.基于聲卡和MATLAB的語音信號采集和處理[J].中國現(xiàn)代教育裝備,2006(5):49-51.
[2] 張登奇.基于MATLAB的IIR數(shù)字濾波器設(shè)計[J].湖南理工學院學報,2007(3):26-29.
[3] Sanjit K.Mitra.數(shù)字信號處理[M].孫洪等譯.北京:電子工業(yè)出版社,2005.
[4] 張志涌等.精通MATLAB6.5版[M].北京:北京航空航天大學出版社,2003.