轉(zhuǎn)自:http:///article/f57ff775-04bd-47ed-94e5-50845fd30191.htm
摘要:MATLAB是一款數(shù)據(jù)分析和處理功能都非常強大的科技應用軟件,利用它可以靈活方便地分析處理音頻信號。文章介紹了用MATLAB軟件處理音頻信號的基本流程,并以實例形式列出了幾款技術實現(xiàn)程序。
關鍵詞:MATLAB;數(shù)字信號處理;音頻信號;脈沖編碼調(diào)制;數(shù)字濾波
1 引言
MATLAB是美國Math Works公司推出的一種面向工程和科學計算的交互式計算軟件。它以矩陣運算為基礎,把計算、可視化、程序設計融合在一個簡單易用的交互式工作環(huán)境中,是一款數(shù)據(jù)分析和處理功能都非常強大的工程實用軟件。本文介紹了用MATLAB處理音頻信號的基本流程,并以實例形式列出了常用音頻處理技術實現(xiàn)程序。
2 MATLAB處理音頻信號的流程
分析和處理音頻信號,首先要對聲音信號進行采集,MATLAB 的數(shù)據(jù)采集工具箱提供了一整套命令和函數(shù),通過調(diào)用這些函數(shù)和命令,可直接控制聲卡進行數(shù)據(jù)采集[1]。Windows自帶的錄音機程序也可驅(qū)動聲卡來采集語音信號,并能保存為WAV格式文件,供MATLAB相關函數(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)換等音頻信號處理方面的技術實現(xiàn)。
3 音量標準化
錄制聲音過程中需對聲音電平進行量化處理,最理想的量化是最大電平對應最高量化比特,但實際卻很難做到,常有音輕問題。利用MATLAB很容易實現(xiàn)音量標準化,即最大電平對應最高量化比特。基本步驟是:先用wavread函數(shù)將WAV文件轉(zhuǎn)換成列數(shù)組變量;再求出數(shù)組變量的極值并對所有元素作歸一化處理;最后用wavwrite函數(shù)還原成音量標準化的WAV文件。
例1:現(xiàn)以微軟自帶的“Windows XP 關機.wav”音頻信號為例,先將其復制另存到文件名為XPexit.wav的MATLAB當前目錄中,再通過音量標準化處理后保存為XPquit.wav文件。實現(xiàn)程序如下:
clear; close all; clc;
[Y,FS,NBITS]=wavread('XPexit.WAV');% 將WAV文件轉(zhuǎn)換成變量
FS,NBITS,% 顯示采樣頻率和量化比特
Ym=max(max(max(Y)),max(abs(min(Y)))),% 找出雙聲道極值
X=Y/Ym;% 歸一化處理
wavwrite(X,FS,NBITS,'XPquit.wav')% 將變量轉(zhuǎn)換成WAV文件
試聽可知標準化處理后音量稍大。
4 聲道分離合并與組合
立體聲或雙聲道音頻信號有左右兩個聲道,利用MATLAB實現(xiàn)雙聲道分離、兩路聲道合并和兩個單聲道組合成一個雙聲道等效果,實際上是利用了MATLAB的矩陣抽取、矩陣相加和矩陣重組運算。
例2:現(xiàn)以例1生成的XPquit.wav為例,實現(xiàn)分離、合并和組合處理的程序如下:
clear; close all; clc;
[x,FS,NBITS]=wavread('XPquit.WAV');% 將WAV文件轉(zhuǎn)換成變量
x1=x(:,1);% 抽取第1聲道
x2=x(:,2);% 抽取第2聲道
wavwrite(x1,FS,NBITS,'XPquit1.WAV');% 實現(xiàn)1聲道分離
wavwrite(x2,FS,NBITS,'XPquit2.WAV');% 實現(xiàn)2聲道分離
%如果合并位置不對前面補0 %聲道長度不對后面補0
x12=x1+x2;% 兩路單聲道列向量矩陣變量合并
x12m=max(max(x12),abs(min(x12))),% 找出極值
y12=x12./x12m;% 歸一化處理
wavwrite(y12,FS,NBITS,'XPquit12.WAV');% 實現(xiàn)兩路聲道合并
%如果組合位置不對前面補0--聲道長度不對后面補0
x3=[x1,x2];% 兩路單聲道變量組合
wavwrite(x3,FS,NBITS,'XPquit3.WAV');% 實現(xiàn)兩路聲道組合
可以試聽聲道分離、合并與組合的效果,也可對各文件大小進行比較。
5 數(shù)字濾波
數(shù)字濾波是常用的音頻處理技術??筛鶕?jù)技術指標,先利用FDATool工具,設計一個數(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,FS,NBITS]=wavread('XPquit12.WAV');% 將WAV文件轉(zhuǎn)換成變量
%利用FDATool設計一個LowpassButterworth濾波器
%指標FS=22050Hz Fp=1000Hz Ap=1dB Fs=3000Hz As=20dB
B =[0.0062,0.0187,0.0187,0.0062];% 分子系數(shù)
未安裝PDF瀏覽器用戶請先下載安裝
原版頁碼:1211,1212,1213原版全文
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,FS,NBITS,'XPquitFilter.WAV');% 寫成WAV文件
程序運行結果如圖1所示。由圖可知,濾波對波形影響不大,但對高頻有較大衰減。試聽會感覺到處理后的聲音比較沉悶。
6 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)轉(zhuǎn)換是指改變音頻格式中的采樣頻率或量化位數(shù)。轉(zhuǎn)換原理是:先用矩陣插值或抽取技術實現(xiàn)變量變換,如果是抽取數(shù)據(jù)還需在變換前作濾波處理使之滿足采樣定理;變量變換完成后再用Wavwrite函數(shù)重新定義量化位數(shù)和采樣頻率即可實現(xiàn)數(shù)據(jù)轉(zhuǎn)換。數(shù)據(jù)轉(zhuǎn)換過程中,要注意采樣頻率與原始采樣頻率及插值或抽取系數(shù)的關系。MATLAB實現(xiàn)插值或抽取的函數(shù)有decimate、interp和resample,具體應用可參考有關文獻[3]。這果以2倍抽取為例,將例3中經(jīng)過濾波后產(chǎn)生的XPquitFilter.WAV文件進行數(shù)據(jù)轉(zhuǎn)換處理。具體程序如下:
clear; close all; clc;
[x,FS,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,FS/2,NBITS,'XPquit16B.WAV');% 音頻格式PCM 11025Hz 16位
wavwrite(y,FS/2,NBITS/2,'XPquit8B.WAV');% 音頻格式PCM 11025Hz 8位
運行程序,在得到的圖形窗口中,執(zhí)行Edit/Axes Properties…命令,再把各分圖下X標簽中的Limits設為0、0.01和0、1000,得到0—0.01秒的波形和0—1000Hz的頻譜如圖2所示。由圖可知,在滿足采樣定律條件下,實現(xiàn)數(shù)據(jù)抽取,在原采樣率下波形變密、頻譜變寬且幅度減半,但在新采樣率下波形和頻譜都很好。通過試聽輸出文件還可感受處理效果。
7 結束語
MATLAB提供了許多專用工具箱,靈活利用這些工具箱和函數(shù),可以實現(xiàn)很多信號處理任務。同時,MATLAB還支持用戶對其函數(shù)進行二次開發(fā),以滿足不同要求。在信號處理過程中,MATLAB兼顧了專用工具軟件的簡單性和計算機程序語言的靈活性,特別是處理效果的可視性和可感知,有利于理解信號處理的本質(zhì),有利于激發(fā)學習和研究興趣,也有利于培養(yǎng)MATLAB軟件的操作技能。
參考文獻:
[1] 陳宇鋒.基于聲卡和MATLAB的語音信號采集和處理[J].中國現(xiàn)代教育裝備,2006(5):49-51.
[2] 張登奇.基于MATLAB的IIR數(shù)字濾波器設計[J].湖南理工學院學報,2007(3):26-29.
[3] Sanjit K.Mitra.數(shù)字信號處理[M].孫洪等譯.北京:電子工業(yè)出版社,2005.
[4] 張志涌等.精通MATLAB6.5版[M].北京:北京航空航天大學出版社,2003.