欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Matlab實(shí)現(xiàn)數(shù)字音頻分析處理系統(tǒng)

 更新時(shí)間:2022年02月24日 10:46:03   作者:紫極神光  
這篇文章主要為大家介紹了如何利用Matlab制作一個(gè)帶GUI的數(shù)字音頻分析與處理系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下

一、語(yǔ)音處理簡(jiǎn)介

1 語(yǔ)音信號(hào)的特點(diǎn)

通過(guò)對(duì)大量語(yǔ)音信號(hào)的觀察和分析發(fā)現(xiàn),語(yǔ)音信號(hào)主要有下面兩個(gè)特點(diǎn):

①在頻域內(nèi),語(yǔ)音信號(hào)的頻譜分量主要集中在300~3400Hz的范圍內(nèi)。利用這個(gè)特點(diǎn),可以用一個(gè)防混迭的帶通濾波器將此范圍內(nèi)的語(yǔ)音信號(hào)頻率分量取出,然后按8kHz的采樣率對(duì)語(yǔ)音信號(hào)進(jìn)行采樣,就可以得到離散的語(yǔ)音信號(hào)。

②在時(shí)域內(nèi),語(yǔ)音信號(hào)具有“短時(shí)性”的特點(diǎn),即在總體上,語(yǔ)音信號(hào)的特征是隨著時(shí)間而變化的,但在一段較短的時(shí)間間隔內(nèi),語(yǔ)音信號(hào)保持平穩(wěn)。在濁音段表現(xiàn)出周期信號(hào)的特征,在清音段表現(xiàn)出隨機(jī)噪聲的特征。

2 語(yǔ)音信號(hào)的采集

在將語(yǔ)音信號(hào)進(jìn)行數(shù)字化前,必須先進(jìn)行防混疊預(yù)濾波,預(yù)濾波的目的有兩個(gè):①抑制輸入信導(dǎo)各領(lǐng)域分量中頻率超出fs/2的所有分量(fs為采樣頻率),以防止混疊干擾。②抑制50Hz的電源工頻干擾。這樣,預(yù)濾波器必須是一個(gè)帶通濾波器,設(shè)其上、下截止顏率分別是fH和fL,則對(duì)于絕人多數(shù)語(yǔ)音編譯碼器,fH=3400Hz、fL=60~100Hz、采樣率為fs=8kHz;而對(duì)丁語(yǔ)音識(shí)別而言,當(dāng)用于電話用戶時(shí),指標(biāo)與語(yǔ)音編譯碼器相同。當(dāng)使用要求較高或很高的場(chǎng)合時(shí)fH=4500Hz或8000Hz、fL=60Hz、fs=10kHz或20kHz。

為了將原始模擬語(yǔ)音信號(hào)變?yōu)閿?shù)字信號(hào),必須經(jīng)過(guò)采樣和量化兩個(gè)步驟,從而得到時(shí)間和幅度上均為離散的數(shù)字語(yǔ)音信號(hào)。采樣也稱抽樣,是信號(hào)在時(shí)間上的離散化,即按照一定時(shí)間間隔△t在模擬信號(hào)x(t)上逐點(diǎn)采取其瞬時(shí)值。采樣時(shí)必須要注意滿足奈奎斯特定理,即采樣頻率fs必須以高于受測(cè)信號(hào)的最高頻率兩倍以上的速度進(jìn)行取樣,才能正確地重建波它是通過(guò)采樣脈沖和模擬信號(hào)相乘來(lái)實(shí)現(xiàn)的。

在采樣的過(guò)程中應(yīng)注意采樣間隔的選擇和信號(hào)混淆:對(duì)模擬信號(hào)采樣首先要確定采樣間隔。如何合理選擇△t涉及到許多需要考慮的技術(shù)因素。一般而言,采樣頻率越高,采樣點(diǎn)數(shù)就越密,所得離散信號(hào)就越逼近于原信號(hào)。但過(guò)高的采樣頻率并不可取,對(duì)固定長(zhǎng)度(T)的信號(hào),采集到過(guò)大的數(shù)據(jù)量(N=T/△t),給計(jì)算機(jī)增加不必要的計(jì)算工作量和存儲(chǔ)空間;若數(shù)據(jù)量(N)限定,則采樣時(shí)間過(guò)短,會(huì)導(dǎo)致一些數(shù)據(jù)信息被排斥在外。采樣頻率過(guò)低,采樣點(diǎn)間隔過(guò)遠(yuǎn),則離散信號(hào)不足以反映原有信號(hào)波形特征,無(wú)法使信號(hào)復(fù)原,造成信號(hào)混淆。根據(jù)采樣定理,當(dāng)采樣頻率大于信號(hào)的兩倍帶寬時(shí),采樣過(guò)程不會(huì)丟失信息,利用理想濾波器可從采樣信號(hào)中不失真地重構(gòu)原始信號(hào)波形。量化是對(duì)幅值進(jìn)行離散化,即將振動(dòng)幅值用二進(jìn)制量化電平來(lái)表示。量化電平按級(jí)數(shù)變化,實(shí)際的振動(dòng)值是連續(xù)的物理量。具體振值用舍入法歸到靠近的量化電平上。

語(yǔ)音信號(hào)經(jīng)過(guò)預(yù)濾波和采樣后,由A/D變換器變換為二址制數(shù)字碼。這種防混疊濾波通常與模數(shù)轉(zhuǎn)換器做在一個(gè)集成塊內(nèi),因此目前來(lái)說(shuō),語(yǔ)音信號(hào)的數(shù)字化的質(zhì)量還是有保證的。

采集到語(yǔ)音信號(hào)之后,需要對(duì)語(yǔ)音信號(hào)進(jìn)行分析,如語(yǔ)音信號(hào)的時(shí)域分析、頻譜分析、語(yǔ)譜圖分析以及加噪濾波等處理。

3 語(yǔ)音信號(hào)分析技術(shù)

語(yǔ)音信號(hào)分析是語(yǔ)音信號(hào)處理的前提和基礎(chǔ),只有分析出可表示語(yǔ)音信號(hào)本質(zhì)特征的參數(shù),才有可能利用這些參數(shù)進(jìn)行高效的語(yǔ)音通信、語(yǔ)音合成和語(yǔ)音識(shí)別等處理[8]。而且,語(yǔ)音合成的音質(zhì)好壞,語(yǔ)音識(shí)別率的高低,也都取決于對(duì)語(yǔ)音信號(hào)分橋的準(zhǔn)確性和精確性。因此語(yǔ)音信號(hào)分析在語(yǔ)音信號(hào)處理應(yīng)用中具有舉足輕重的地位。

貫穿于語(yǔ)音分析全過(guò)程的是“短時(shí)分析技術(shù)”。因?yàn)椋Z(yǔ)音信號(hào)從整體來(lái)看其特性及表征其本質(zhì)特征的參數(shù)均是隨時(shí)間而變化的,所以它是一個(gè)非乎穩(wěn)態(tài)過(guò)程,不能用處理乎穩(wěn)信號(hào)的數(shù)字信號(hào)處理技術(shù)對(duì)其進(jìn)行分析處理。但是,由于不同的語(yǔ)音是由人的口腔肌肉運(yùn)動(dòng)構(gòu)成聲道某種形狀而產(chǎn)生的響應(yīng),而這種口腔肌肉運(yùn)動(dòng)相對(duì)于語(yǔ)音頻率來(lái)說(shuō)是非常緩慢的,所以從另一方面看,雖然語(yǔ)音倍號(hào)具有時(shí)變特性,但是在一個(gè)短時(shí)間范圍內(nèi)(一般認(rèn)為在10~30ms的短時(shí)間內(nèi)),其特性基本保持不變即相對(duì)穩(wěn)定,因面可以將其看作是一個(gè)準(zhǔn)穩(wěn)態(tài)過(guò)程,即語(yǔ)音信號(hào)具有短時(shí)平穩(wěn)性。所以任何語(yǔ)音信號(hào)的分析和處理必須建立在“短時(shí)”的基礎(chǔ)上.即進(jìn)行“短時(shí)分析”,將語(yǔ)音信號(hào)分為一段一段來(lái)分析其特征參數(shù),其中每一段稱為一“幀”,幀長(zhǎng)一般取為10~30ms。這樣,對(duì)于整體的語(yǔ)音信號(hào)來(lái)講,分析出的是由每一幀特征參數(shù)組成的特征參數(shù)時(shí)間序列。

根據(jù)所分析出的參數(shù)的性質(zhì)的不同,可將語(yǔ)音信號(hào)分析分為時(shí)域分析、頻域分析、倒領(lǐng)域分析等;時(shí)域分析方法具有簡(jiǎn)單、計(jì)算量小、物理意義明確等優(yōu)點(diǎn),但由于語(yǔ)音信號(hào)最重要的感知特性反映在功率譜中,而相位變化只起著很小的作用,所以相對(duì)于時(shí)域分析來(lái)說(shuō)頻域分析更為重要。

4 語(yǔ)音信號(hào)的時(shí)域分析

語(yǔ)音信號(hào)的時(shí)域分析就是分析和提取語(yǔ)音信號(hào)的時(shí)域參數(shù)。進(jìn)行語(yǔ)音分析時(shí),最先接觸到并且也是最直觀的是它的時(shí)域波形。語(yǔ)音信號(hào)本身就是時(shí)域信號(hào),因而時(shí)域分析是最早使用,也是應(yīng)用最廣泛的一種分析方法,這種方法直接利用語(yǔ)音信號(hào)的時(shí)域波形。時(shí)域分析通常用于最基本的參數(shù)分析及應(yīng)用,如語(yǔ)音的分割、預(yù)處理、大分類等。這種分析方法的特點(diǎn)是:①表示語(yǔ)音信號(hào)比較直觀、物理意義明確。②實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單、運(yùn)算且少。③可以得到語(yǔ)音的一些重要的參數(shù)。④只使用示波器等通用設(shè)備,使用較為簡(jiǎn)單等。

語(yǔ)音信號(hào)的時(shí)域參數(shù)有短時(shí)能量、短時(shí)過(guò)零率、短時(shí)白相關(guān)函數(shù)和短時(shí)平均幅度差函數(shù)等,這是語(yǔ)音信號(hào)的一組最基本的短時(shí)參數(shù),在各種語(yǔ)音信號(hào)數(shù)字處理技術(shù)中都要應(yīng)用[6]。在計(jì)算這些參數(shù)時(shí)使用的一般是方窗或漢明窗。

5 語(yǔ)音信號(hào)的頻域分析

語(yǔ)音信號(hào)的頻域分析就是分析語(yǔ)音信號(hào)的頻域持征。從廣義上講,語(yǔ)音信號(hào)的頻域分析包括語(yǔ)音信號(hào)的頻譜、功率譜、倒頻譜、頻譜包絡(luò)分析等,而常用的頻域分析方法有帶通濾波器組法、傅里葉變換法、線件預(yù)測(cè)法等幾種。

二、部分源代碼

function varargout = dsp(varargin)
% --- 數(shù)字音頻分析與處理系統(tǒng)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @dsp_OpeningFcn, ...
    'gui_OutputFcn',  @dsp_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end


% --- Executes just before dsp is made visible.
function dsp_OpeningFcn(hObject, eventdata, handles, varargin)

% Choose default command line output for dsp
handles.output = hObject;

% 設(shè)置坐標(biāo)軸
set(gcf,'defaultAxesXGrid','off', ...
    'defaultAxesYGrid','off', ...
    'defaultAxesZGrid','off');

% 初始化
movegui(gcf,'center'); % figure居中
handles.Sample=[]; % 初始化樣本為空
handles.CSample=[]; % 初始化樣本副本
handles.volume=0; % 初始化音量為0
handles.Fs=0; % 初始化采樣率

if (exist('speech_database.mat','file')==2)
    load('speech_database.mat','-mat');
    handles.data=data;
    c=data2cell(handles.data);
else
    c=cell(0,0);
end
set(handles.data_uitable,'Data',c);

% Update handles structure
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = dsp_OutputFcn(hObject, eventdata, handles)

% Get default command line output from handles structure
varargout{1} = handles.output;


function record_radiobutton_Callback(hObject, eventdata, handles)

function file_radiobutton_Callback(hObject, eventdata, handles)

% --- 顯示文件路徑
function filepath_edit_Callback(hObject, eventdata, handles)

function filepath_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function fs_popupmenu_Callback(hObject, eventdata, handles)

function fs_popupmenu_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- 文件輸入音頻
function file_choose_pushbutton_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.wav;*.mp3;*.flac;*.m4a', ...
    '音頻文件(*.wav,*.mp3,*.flac,*.m4a)'},'選擇文件');%彈出選擇文件窗口
% 判斷文件為空
% 不能使用if isempty(filename)||isempty(pathname)
% 取消窗口時(shí)會(huì)報(bào)錯(cuò),取消時(shí)uigetfile返回filename為0
if filename==0
    return
else
    handles.Filepath=[pathname,filename];
    set(handles.filepath_edit,'string',handles.Filepath);% 顯示文件名
    [handles.Sample,handles.Fs]=audioread(handles.Filepath);% 讀取音頻文件
    % 若輸入音頻為雙聲道,則使用一個(gè)通道
    samplesize=size(handles.Sample);
    if samplesize(2)>1
        handles.Sample=handles.Sample(:,1);
    end
    handles.CSample=handles.Sample;% 創(chuàng)建副本
    handles.player=audioplayer(handles.CSample,handles.Fs);
    setplayer(handles);
    
    set(handles.play_pushbutton,'enable','on');
    set(handles.play_stop_pushbutton,'enable','on');
    set(handles.putfile_pushbutton,'enable','on');
    
    guidata(hObject,handles);
end


% --- 錄音按鈕
function record_start_pushbutton_Callback(hObject, eventdata, handles)
fs_list=get(handles.fs_popupmenu,'string');% 獲取列表
fs_value=get(handles.fs_popupmenu,'value');% 獲取參數(shù)序號(hào)
fs=str2double(fs_list{fs_value});% 獲取選定采樣率
% list類型為cell必須轉(zhuǎn)換
handles.Fs=fs;

handles.recObj=audiorecorder(fs,16,1);% 創(chuàng)建一個(gè)錄音器

set(handles.recObj,'StartFcn',{@recordstart_Callback,handles}, ...
    'StopFcn',{@recordstop_Callback,handles}); % 錄音回調(diào)

record(handles.recObj);% 開始錄音

guidata(hObject,handles);

% --- 停止錄音按鈕
function record_stop_pushbutton_Callback(hObject, eventdata, handles)
stop(handles.recObj);% 停止錄音
handles.Sample=getaudiodata(handles.recObj);% 獲取錄音
handles.CSample=handles.Sample;% 創(chuàng)建副本
handles.player=audioplayer(handles.CSample,handles.Fs);
setplayer(handles);

guidata(hObject,handles);

% --- 播放器設(shè)置
function setplayer(handles)
% 創(chuàng)建player回調(diào)函數(shù)
set(handles.player,'StartFcn',{@playstart_Callback,handles}, ...
    'StopFcn',{@playstop_Callback,handles});

% 音頻信息
sample_length=length(handles.Sample); % 音頻時(shí)長(zhǎng)
t=sample_length/handles.Fs;
set(handles.timeinfo_text,'String',['時(shí)長(zhǎng):',num2str(t),'s']); % 顯示時(shí)長(zhǎng)
set(handles.fsinfo_text,'String',['采樣率:',num2str(handles.Fs),'Hz']); % 顯示采樣率

% plot wave
audio_analyze(handles.Sample,handles.Fs,handles.axes1,handles); % 繪制初始樣本
audio_analyze(handles.CSample,handles.Fs,handles.axes2,handles);% 繪制樣本副本

nvar=std(handles.Sample).^2; % 初始方差
set(handles.nvar_edit,'String',round(nvar,3,'significant'));
nmean=mean(handles.Sample); % 初始均值
set(handles.nmean_edit,'String',round(nmean,3,'significant'));
dvar=std(handles.CSample).^2; % 樣本方差
set(handles.dvar_edit,'String',round(dvar,3,'significant'));
dmean=mean(handles.CSample); % 樣本均值
set(handles.dmean_edit,'String',round(dmean,3,'significant'));


% --- 播放按鈕
function play_pushbutton_Callback(hObject, eventdata, handles)
play(handles.player);% 開始播放

% --- 停止播放按鈕
function play_stop_pushbutton_Callback(hObject, eventdata, handles)
stop(handles.player);% 停止播放

% --- 輸入方式按鈕組
function uibuttongroup1_SelectionChangedFcn(hObject, eventdata, handles)
switch get(hObject,'tag')
    case 'record_radiobutton'
        set(handles.fs_popupmenu,'enable','on');
        set(handles.record_start_pushbutton,'enable','on');
        set(handles.record_stop_pushbutton,'enable','off');
        set(handles.filepath_edit,'enable','off');
        set(handles.file_choose_pushbutton,'enable','off');
        set(handles.play_pushbutton,'enable','off');
        set(handles.play_stop_pushbutton,'enable','off');
    case 'file_radiobutton'
        set(handles.fs_popupmenu,'enable','off');
        set(handles.record_start_pushbutton,'enable','off');
        set(handles.record_stop_pushbutton,'enable','off');
        set(handles.filepath_edit,'enable','on');
        set(handles.file_choose_pushbutton,'enable','on');
        set(handles.play_pushbutton,'enable','off');
        set(handles.play_stop_pushbutton,'enable','off');
end

% --- 波形選擇欄
function wave_select_listbox_Callback(hObject, eventdata, handles)
audio_analyze(handles.Sample,handles.Fs,handles.axes1,handles);
audio_analyze(handles.CSample,handles.Fs,handles.axes2,handles);

function wave_select_listbox_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

三、運(yùn)行結(jié)果

以上就是基于Matlab實(shí)現(xiàn)數(shù)字音頻分析處理系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Matlab的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論