語音信號處理基礎(三)——基於MATLAB的語音採集與讀寫

語音信號處理基礎(三)


有關語音信號處理的發展請閱讀前兩篇博客
語音信號處理基礎(一)
語音信號處理基礎(二)

語音採集與讀寫

通過對大量語音信號的觀察和分析發現,語音信號主要有下面兩個特點

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倍原始採樣頻率得到的音頻相比以初始採樣頻率得到的音頻快放

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章