對語音信號的採樣和重採樣(Matlab)
這是我在上數字信號處理這門課的討論課和實驗課都接觸到的一個知識,在做的時候也查閱了許多資料,所以希望寫下來,方便以後忘記的時候再查看,如果有需要的也可以瀏覽呀!
實驗的題目是: 採集一段語音信號或選擇已有的語音信號進行分析,對語音信號進行重新採樣分析(增加或降低採樣頻率),比較重新採樣前後聲音的變化,結合採樣定理給出解釋。
首先,先給出Matlab代碼:
1.原始信號
Fs = 22050; [fname,pname] = uigetfile(C:WindowsMediaAlarm04.wav);%獲取所選文件信息:文件名、路徑file = [pname,fname];[x1,Fs] = audioread(file);%x1為所讀取的音頻數據,Fs為採樣頻率sound(x1,Fs); %播放音樂figure(1);subplot(211);plot(x1);%做原始語音信號的時域圖形title(原始語音信號)xlabel(採樣點 n);ylabel(音量 n);y1=fft(x1); %做length(x1)點的FFTy1=fftshift(y1);%頻率分量將會移到坐標中心subplot(212);plot(abs(y1));%畫出原始語音信號的頻譜圖,這裡保證了x軸的點數必須和y軸點數一致title(原始語音信號的頻譜);grid on;
2.增加採樣頻率
Fs = 22050;[fname,pname] = uigetfile(C:WindowsMediaAlarm04.wav);%獲取所選文件信息:文件名、路徑file = [pname,fname];[x1,Fs] = audioread(file);%x1為所讀取的音頻數據,Fs為採樣頻率figure(2);subplot(211);x2=resample(x1,3,1)sound(x2,Fs*3);plot(x2);%做原始語音信號的時域圖形title(原始語音信號)xlabel(採樣點 n);ylabel(音量 n);y2=fft(x2); %做length(x1)點的FFTy2=fftshift(x2);%頻率分量將會移到坐標中心subplot(212);plot(abs(y2));%畫出原始語音信號的頻譜圖,這裡保證了x軸的點數必須和y軸點數一致title(增加採樣頻率後的語音信號的頻譜);grid on;
3.降低採樣頻率
Fs = 22050;[fname,pname] = uigetfile(C:WindowsMediaAlarm04.wav);%獲取所選文件信息:文件名、路徑file = [pname,fname];[x1,Fs] = audioread(file);%x1為所讀取的音頻數據,Fs為採樣頻率figure(3);subplot(211);x3=resample(x1,1,8)sound(x3,Fs/8);plot(x3);%做原始語音信號的時域圖形title(原始語音信號)xlabel(採樣點 n);ylabel(音量 n);y3=fft(x3); %做length(x1)點的FFTy3=fftshift(x3);%頻率分量將會移到坐標中心subplot(212);plot(abs(y3));%畫出原始語音信號的頻譜圖,這裡保證了x軸的點數必須和y軸點數一致title(降低採樣頻率後的語音信號的頻譜);grid on;
這裡就比較偷懶,使用的音頻信號是已有的語音信號,在我的電腦上的路徑是C:WindowsMediaAlarm04.wav,當然這個是可以換的,Media文件夾里有很多以wav為後綴的波形聲音,只要把路徑替換了,我們的代碼處理的聲音也就換了。
其實這裡音頻還有下面兩種方法來得到,我個人覺得第一種方法比較有趣,而第二種方法比較麻煩(而我也不是太懂,就不寫了)。
針對音效卡(也叫音頻卡:音效卡是多媒體技術中最基本的組成部分,是實現聲波/數字信號相互轉換的一種硬體)採集聲音信號,matlab提供了一種「專用」的方法,audiorecorder函數,它的「前身」是wavrecord函數,在2012b版本中,wavrecord函數被audiorecorder函數更新替代。wavrecord函數僅能用於32位windows平台,而audiorecorder函數則適用於多種平台。audiorecorder函數用於創建錄音對象,其用法如下。
recorder = audiorecorder
recorder = audiorecorder(Fs,nBits,nChannels)recorder = audiorecorder(Fs,nBits,nChannels,ID)沒有輸入參數時,表示創建採樣率為8000Hz,8bit,單通道的對象,有輸入參數時,則由Fs指定採樣率,單位為Hz,由nBits指定採樣點的比特數,由nChannels指定通道數,由ID指定設備的ID。其中nChannels為1時表示單通道錄音,即mono;為2時表示雙通道錄音,會產生立體音效果,即stereo。
Fs = 22050; x1 = audiorecorder(Fs,8,1);disp(開始說話);recordblocking(x1,10); %錄音10秒鐘play(x1); %回放錄音數據figure(1);subplot(211);x2 = getaudiodata(x1); %獲取錄音數據plot(x2); %做錄音數據的時域圖形title(原始語音信號)xlabel(採樣點 n);ylabel(音量 n);y1=fft(x2); %做length(x1)點的FFTy1=fftshift(y1);%頻率分量將會移到坐標中心subplot(212);plot(abs(y1));%畫出原始語音信號的頻譜圖,這裡保證了x軸的點數必須和y軸點數一致title(原始語音信號的頻譜);grid on;
從上面的代碼可以看出,audiorecorder函數返回的對象,對它的操作是通過一些方法來實現的,如例子中的recordblocking方法、play方法等,這些方法的第一個輸入參數必須為audiorecorder對象,一些方法還需要有其他輸入參數。錄音對象的方法如下所示。
get 獲取audiorecorder對象的屬性列表。
getaudiodata 提取錄音數據。
getplayer 創建一個對應的audioplayer播音對象。
isrecording 返回是否正在錄音。
pause 暫停錄音。
play 播放錄音數據。該方法返回一個audioplayer對象。
record 開始錄音。
recordblocking 錄音,需要第二個參數,指定錄音的時間長度,單位為秒。
resume 從暫停處重新開始錄音。
set 設置audiorecorder對象的屬性。
stop 停止錄音。
其次,說一下採樣定理和增加或降低採樣頻率後聲音給人的感覺。
1.採樣定理
又名抽樣定理、取樣定理、奈奎斯特定理。它是連續時間信號和離散時間信號之間的橋樑,說明了採樣頻率和信號頻譜之間的關係。定理內容:當採樣頻率fs.max大於信號中最高頻率fmax的2倍時(fs.max>2fmax),採樣之後的數字信號完整地保留了原始信號中的信息,一般實際應用中保證採樣頻率為信號最高頻率的2.56~4倍。
該定理由奈奎斯特推出,而後資訊理論的創始人香農又對此加以明確的說明並正式作為定理引用,因此又被稱為香農採樣定理。
語音信號是一種連續變化的模擬信號,而計算機只能處理和記錄二進位的數字信號,因此,由自然音而得的音頻信號必須用計算機的聲音編輯工具,先進行語音採樣,然後利用了計算機上的D轉換器,將模擬的聲音信號變成離散的量化了的數字信號量化和編碼,變成二進位數據後才能送到計算機進行再編輯和存儲。語音信號輸出時,量化了的數字信號又通過A轉換器,把保存起來的數字數據恢復成原來的模擬的語音信號。
2.效果
當採樣頻率是原採樣頻率時,聽到的聲音是未失真的聲音;當降低採樣頻率時,聽到的聲音顯得比原語音信號要悶(低沉);當增加採樣頻率時,聲音會變得更加尖銳。
最後就簡單介紹一下代碼中用到的一些比較實用的函數或小知識點:
1. uigetfile();
用途:調用電腦中的某個文件
[FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName);
FileName:返回的文件名
PathName:返回的文件的路徑名
FilterIndex:選擇的文件類型
FilterSpec:文件類型設置
DialogTitle:打開對話框的標題
DefaultName:默認指向的文件名
還可以接著用 file = [pname,fname];
2.audioread();
用途:讀取電腦中的音頻文件
[sampledata,FS] = audioread(這裡的參數是音頻文件的路徑);
sampledata是音頻信號數據,FS是音頻採樣率。3.採樣頻率
每秒從連續信號中提取並組成離散信號的採樣個數,也就是計算機每秒鐘採集多少個信號樣本。採樣頻率越高,即採樣的間隔時間越短,則在單位時間內計算機得到的樣本數據就越多,對信號波形的表示也越精確。
下面列舉了幾個常見的採樣率:
8000Hz 電話所用採樣率,對於人的說話已經足夠
11025Hz 獲得的聲音稱為電話音質,基本上能讓你分辨出通話人的聲音
22050Hz 無線電廣播所用採樣率,廣播音質
32000Hz miniDV數碼視頻camcorder、DAT(LPmode)所用採樣率
44100Hz 音頻CD,也常用於MPEG-1音頻(VCD,SVCD,MP3)所用採樣率
48000Hz miniDV、數字電視、DVD、DAT、電影和專業音頻所用的數字聲音所用採樣率
當前音效卡常用的採樣頻率一般為44.1KHz(每秒採集聲音樣本44.1千次)11KHz、22KHz、和48KHz。採樣頻率越高,獲得的聲音文件質量越好,佔用存儲空間也就越大。一首CD音質的歌曲會佔去45M左右的存儲空間。
4.resample();
用途:改變採樣頻率,進行重採樣
resample(file,a,b);
file : 讀取的音頻數據;
a/b 等於 重採樣頻率 / 原採樣頻率;
比如resample(x,3,1) 是採樣頻率變為原來的三倍,即單位時間內採樣數目變為原來的3倍
5.sound();
用途:播放聲音
sound(y)
sound(y, FS)
sound(y, FS, nBits);
y為音頻信號, FS為採樣率,nBits表示每個樣本點用幾個比特表示,即解析度。
【clear sound; 可以終止播放】
推薦閱讀:
※Applied Speech and Audio Processing 第一章讀書報告(其實是差不多是純翻譯
※音頻剪切器怎麼使用?
※如果聲音也會死亡,你會怎麼做?
※播客領域的微笑曲線