語音信號處理基礎(三)
有關語音信號處理的發展請閱讀前兩篇博客
語音信號處理基礎(一)
語音信號處理基礎(二)
語音採集與讀寫
通過對大量語音信號的觀察和分析發現,語音信號主要有下面兩個特點
1.語音信號的特點
(1) 在頻域內,語音信號的頻譜分量主要集中在300-3400Hz的範圍內。
利用這個特點,可以用一個防混疊的帶通濾波器將此範圍內的語音信號頻率分出,然後按8kHz的採樣
(2) 在時域內,語音信號具有“短時性”的特點
即在總體上,語音信號的特徵是隨着時間而變化的,但在一段較短時間間隔內,語音信號保持平穩。在濁音段表現出週期信號的特徵,在輕音端表現出隨機噪聲的特徵
2.語音信號採集的基本原理
將模擬信號變爲數字信號,必須經過採樣和量化,得到時間和幅度上均爲離散的數字信號語音。採樣時, 採樣頻率必須以高於受測信號的最高頻率兩倍以上的速度進行取樣,才能正確地重建信號。
3.基於MATLAB的語音信號採集與讀寫
(1)wavrecord()函數:用來錄製語音和音頻信號。
基本語法:
y=waverecord(n,Fs,ch,'dtype')
n爲採樣點數,Fs爲採樣頻率,ch爲音頻設備通道數(1或2表示單聲道或立體聲)'dtype’表示指定數據類型來記錄聲音
例如:speech = wavrecord(16000, 8000, 1, ‘double’);
採樣的樣點放入speech變量中,16000是要採樣的點數,8000是採樣率
1表示是單聲道信號,‘double’
Fs=11025;%採樣率爲11025Hz
y=wavrecord(Fs*5,Fs,'int16');%錄製5s的數據
wavplay(y,Fs); %播放錄製的音頻
(2)wavwrite()函數:寫入wav聲音文件
注意:在新版本的matlab中不再使用wavwrite,推薦使用audiowrite
函數語法
wavwrite(y,filename)
將保存在變量y的數據,保存到wav文件filename中,默認的採樣率爲8000Hz,採樣位數爲16位,y的各列爲各個通道,因此立體聲數據是兩列的矩陣
wavwrite(y,Fs,N,filename)
按給定的採樣率Fs和採樣位數N,將保存在變量y的數指保存到war文件filename中,N可選值爲8,16,24及32。輸人的數據範圍:y的垢管範周與採樣位數N以及y的數據類型有關
load handel.mat %載入AMATLAB自帶的示例音頻數據文件
hfile ="Data_wavereard.wav";%準備寫的音媒數據文件
wavwrite(y,Fs,hfile)%將y以Fs採樣率寫到文件中
(3)wavread()函數:讀取聲音文件
注意:在新版本的matlab中不再使用wavread,推薦使用audioread
函數語法
y =wavread(filename)
載人由filename字符串指定的wav文件,y爲返回採樣點的數據,若文件名filename不包含擴展名,wavread函數特添加.wav擴展名。
[y,Fs]=wavread(fiename)
返回文件的採樣率Fs(Hz).
[y,Fs,nbits]=wavread(filename)
返回每次採樣的位數nbits(位).
[y,Fs,nbits,opts]= wavread(filename)
返回包含wav文件額外信息的結構體opts,opts具體的字段與文件有關。
opts典型的兩個字段爲fmt和info,外別代表聲音格式信息和描述標題作者等信息的文本。
load handel.mat %載人MATLAB自帶的示例音頻數據文件
hfile ='Data_waveread,wav';%準備寫的音額數據文件
wavwrite(y,Fs,hfile); %將y以Fs採樣率寫到文件中
clear y Fs %清除載入的y以及Fs
[y,Fs,nbits]= wavread(hfile);%從聲音文件中載入數據,
%y爲從聲音文件載入的數據,
%Fs爲採樣率,nbits爲採樣使用的位數。
sound(y,Fs); %播放聲音
pause(4) %暫停4s,與後面的聲音分隔開
運行結果
播放起~哈利路亞
(4)wavplay()函數:在基於pc的音頻輸出設備上播放錄製的音頻
函數語法
wavplay(y,Fs)
在基於PC的音頻輸出設備上,播放保存在向量y中的音頻信號。Fs是採樣率(Hz)。默認的Fs爲11025 Hz wavplay支持單通道或雙通道(立體聲)的音頻信號。播放立體聲,y必須爲兩列的矩陣
wavplay(y,Fs,mode)
指定在命令行下如何交互播放音頻。
mnde的可選值爲’syne’(默認):直到聲音播放結束才返回到命令窗口;
當音頻正在播放時,以async模式再次調用wavplay,wavplay將阻塞命令行直至上一個播放結束
load chirp; %載入chip.mat到y和Fs
y1=y;Fs1 =Fs; %備份y和Fs變量到y1和Fsl
load gong; %載人gong.mat到y和Fs中
wavplay(y1,Fs1,'asyne') %播放chirp文件中的音頻
wavplay(y,Fs) %上述文件播放完後,才播放gong文件的音額
4.實例
自行錄製一段語音,並存儲爲wa文件。要求:存儲爲way文件時,分別以採樣頻率、2倍採樣頻率和1/2採樣頻率存爲三個wav文件,並將plot函數結合 subplot函數在一幅圖上顯示3個波形。橫軸和縱軸帶有標註。橫軸的單位爲秒(s),縱軸顯示的爲歸一化後的數值。
實現代碼
%自行錄製一段語音,並存儲爲wa文件。
%要求:分別以採樣頻率、2倍採樣頻率和1/2採樣頻率存爲三個wav文件,
%並將plot函數結合 subplot函數在一幅圖上顯示3個波形。
%橫軸和縱軸帶有標註。橫軸的單位爲秒(s),縱軸顯示的爲歸一化後的數值。
Fs=8000; %採樣頻率
duration=2; %時間長度
n=duration*Fs; %採樣點數
t=(1:n)/Fs; %採樣時間
load handel.mat %載入MATLAB自帶的示例音頻數據文件
hfile='Data_waveread.wav'; %準備寫的音頻數據samples=[1,n]; %讀取樣本數
[y,Fs]=audioread('hfile.wav',samples);
ymax=max(abs(y)); %歸一化
y=y/ymax;
audiowrite('original.wav',y,Fs); %將原採樣頻率得到的音頻存爲original.wav
audiowrite('halfsam.wav',y,Fs/2); %將1/2倍採樣頻率得到的音頻存爲halfsam.wav
audiowrite('doublesam.wav',y,Fs*2);%將2倍採樣頻率得到的音頻存爲doublesam.wav
[y1,Fsl]= audioread('halfsam.wav');% 讀取halfsam.wav文件
t1=(1:length(y1))/Fsl; %計算時間t1
[y2,Fs2]= audioread('doublesam.wav');% 讀取doublesam.wav文件
t2=(1:length(y2))/Fs2; %計算時間t2
subplot(311) %作以原採樣率採樣的音頻時間幅值波形圖 axis([0 3 -1 1]); %設定x軸與y軸的顯示範圍
plot(t,y);
xlabel('時間/s');
ylabel('幅度');
title('(a)初始採樣率');
subplot(312) %作以1/2倍採樣率採樣的音頻時間幅值波形圖
axis([0 3 -1 1]); %設定x軸與y軸的顯示範圍
plot(t1,y1);
xlabel('時間/s');
ylabel('幅度');
title('(b)1/2採樣率');
subplot(313) %作以2倍採樣率採樣的音頻時間幅值波形圖
axis([0 3 -1 1]); %設定x軸與y軸的顯示範圍
plot(t2,y2);
xlabel('時間/s');
ylabel('幅度');
title('(c)2倍採樣率');
運行結果
觀察結果
分別以採樣頻率、2倍採樣頻率和1/2採樣頻率存爲三個wav文件,發現它的波形一致。
原本2秒就能播放完的音頻,以1/2採樣頻率採樣後,需要4秒播才能放完。以2倍採樣頻率採樣後,只需要1秒就播放完
爲了能更好的感受以不同採樣頻率採樣以後,語音信號的效果不同,編寫代碼測試試聽三個音頻文件
sound()函數:播放.wav等音頻格式文件
語法
sound(filename,Fs)
以頻率值Fs,播放音頻文件
實現代碼
%傾聽以三個不同採樣率得到的音頻文件
Fs=8000; %採樣頻率
duration=2; %時間長度
n=duration*Fs; %採樣點數
t=(1:n)/Fs; %採樣時間
load handel.mat %載入MATLAB自帶的示例音頻數據文件
hfile='Data_waveread.wav'; %準備寫的音頻數據
samples=[1,n]; %讀取樣本數
[y,Fs]=audioread('hfile.wav',samples);
ymax=max(abs(y)); %歸一化
y=y/ymax;
audiowrite('original.wav',y,Fs); %將原採樣頻率得到的音頻存爲original
audiowrite('halfsam.wav',y,Fs/2); %將1/2採樣頻率得到的音頻存爲halfsam
audiowrite('doublesam.wav',y,Fs*2);%將2倍採樣頻率得到的音頻存爲doublesam
[y1,Fs1]= audioread('halfsam.wav');% 讀取halfsam.wav文件
[y2,Fs2]= audioread('doublesam.wav');% 讀取doublesam.wav文件
sound(y,Fs); %播放以初始採樣率採樣後的聲音
pause(4) %暫停4s,與後面的聲音分開
sound(y1,Fs1); %播放以1/2倍採樣率採樣後的聲音
pause(4) %暫停4s,與後面的聲音分開
sound(y2,Fs2); %播放以2倍採樣率採樣後的聲音
運行結果
以1/2原始採樣頻率得到的音頻相比以初始採樣頻率得到的音頻慢放
以2倍原始採樣頻率得到的音頻相比以初始採樣頻率得到的音頻快放