基于Matlab实现数字音频分析处理系统

目录
  • 一、语音处理简介
    • 1语音信号的特点
    • 2语音信号的采集
    • 3语音信号分析技术
    • 4语音信号的时域分析
    • 5语音信号的频域分析
  • 二、部分源代码
  • 三、运行结果

一、语音处理简介

1 语音信号的特点

通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点:

①在频域内,语音信号的频谱分量主要集中在300~3400Hz的范围内。利用这个特点,可以用一个防混迭的带通滤波器将此范围内的语音信号频率分量取出,然后按8kHz的采样率对语音信号进行采样,就可以得到离散的语音信号。

②在时域内,语音信号具有“短时性”的特点,即在总体上,语音信号的特征是随着时间而变化的,但在一段较短的时间间隔内,语音信号保持平稳。在浊音段表现出周期信号的特征,在清音段表现出随机噪声的特征。

2 语音信号的采集

在将语音信号进行数字化前,必须先进行防混叠预滤波,预滤波的目的有两个:①抑制输入信导各领域分量中频率超出fs/2的所有分量(fs为采样频率),以防止混叠干扰。②抑制50Hz的电源工频干扰。这样,预滤波器必须是一个带通滤波器,设其上、下截止颜率分别是fH和fL,则对于绝人多数语音编译码器,fH=3400Hz、fL=60~100Hz、采样率为fs=8kHz;而对丁语音识别而言,当用于电话用户时,指标与语音编译码器相同。当使用要求较高或很高的场合时fH=4500Hz或8000Hz、fL=60Hz、fs=10kHz或20kHz。

为了将原始模拟语音信号变为数字信号,必须经过采样和量化两个步骤,从而得到时间和幅度上均为离散的数字语音信号。采样也称抽样,是信号在时间上的离散化,即按照一定时间间隔△t在模拟信号x(t)上逐点采取其瞬时值。采样时必须要注意满足奈奎斯特定理,即采样频率fs必须以高于受测信号的最高频率两倍以上的速度进行取样,才能正确地重建波它是通过采样脉冲和模拟信号相乘来实现的。

在采样的过程中应注意采样间隔的选择和信号混淆:对模拟信号采样首先要确定采样间隔。如何合理选择△t涉及到许多需要考虑的技术因素。一般而言,采样频率越高,采样点数就越密,所得离散信号就越逼近于原信号。但过高的采样频率并不可取,对固定长度(T)的信号,采集到过大的数据量(N=T/△t),给计算机增加不必要的计算工作量和存储空间;若数据量(N)限定,则采样时间过短,会导致一些数据信息被排斥在外。采样频率过低,采样点间隔过远,则离散信号不足以反映原有信号波形特征,无法使信号复原,造成信号混淆。根据采样定理,当采样频率大于信号的两倍带宽时,采样过程不会丢失信息,利用理想滤波器可从采样信号中不失真地重构原始信号波形。量化是对幅值进行离散化,即将振动幅值用二进制量化电平来表示。量化电平按级数变化,实际的振动值是连续的物理量。具体振值用舍入法归到靠近的量化电平上。

语音信号经过预滤波和采样后,由A/D变换器变换为二址制数字码。这种防混叠滤波通常与模数转换器做在一个集成块内,因此目前来说,语音信号的数字化的质量还是有保证的。

采集到语音信号之后,需要对语音信号进行分析,如语音信号的时域分析、频谱分析、语谱图分析以及加噪滤波等处理。

3 语音信号分析技术

语音信号分析是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数,才有可能利用这些参数进行高效的语音通信、语音合成和语音识别等处理[8]。而且,语音合成的音质好坏,语音识别率的高低,也都取决于对语音信号分桥的准确性和精确性。因此语音信号分析在语音信号处理应用中具有举足轻重的地位。

贯穿于语音分析全过程的是“短时分析技术”。因为,语音信号从整体来看其特性及表征其本质特征的参数均是随时间而变化的,所以它是一个非乎稳态过程,不能用处理乎稳信号的数字信号处理技术对其进行分析处理。但是,由于不同的语音是由人的口腔肌肉运动构成声道某种形状而产生的响应,而这种口腔肌肉运动相对于语音频率来说是非常缓慢的,所以从另一方面看,虽然语音倍号具有时变特性,但是在一个短时间范围内(一般认为在10~30ms的短时间内),其特性基本保持不变即相对稳定,因面可以将其看作是一个准稳态过程,即语音信号具有短时平稳性。所以任何语音信号的分析和处理必须建立在“短时”的基础上.即进行“短时分析”,将语音信号分为一段一段来分析其特征参数,其中每一段称为一“帧”,帧长一般取为10~30ms。这样,对于整体的语音信号来讲,分析出的是由每一帧特征参数组成的特征参数时间序列。

根据所分析出的参数的性质的不同,可将语音信号分析分为时域分析、频域分析、倒领域分析等;时域分析方法具有简单、计算量小、物理意义明确等优点,但由于语音信号最重要的感知特性反映在功率谱中,而相位变化只起着很小的作用,所以相对于时域分析来说频域分析更为重要。

4 语音信号的时域分析

语音信号的时域分析就是分析和提取语音信号的时域参数。进行语音分析时,最先接触到并且也是最直观的是它的时域波形。语音信号本身就是时域信号,因而时域分析是最早使用,也是应用最广泛的一种分析方法,这种方法直接利用语音信号的时域波形。时域分析通常用于最基本的参数分析及应用,如语音的分割、预处理、大分类等。这种分析方法的特点是:①表示语音信号比较直观、物理意义明确。②实现起来比较简单、运算且少。③可以得到语音的一些重要的参数。④只使用示波器等通用设备,使用较为简单等。

语音信号的时域参数有短时能量、短时过零率、短时白相关函数和短时平均幅度差函数等,这是语音信号的一组最基本的短时参数,在各种语音信号数字处理技术中都要应用[6]。在计算这些参数时使用的一般是方窗或汉明窗。

5 语音信号的频域分析

语音信号的频域分析就是分析语音信号的频域持征。从广义上讲,语音信号的频域分析包括语音信号的频谱、功率谱、倒频谱、频谱包络分析等,而常用的频域分析方法有带通滤波器组法、傅里叶变换法、线件预测法等几种。

二、部分源代码

function varargout = dsp(varargin)
% --- 数字音频分析与处理系统
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;

% 设置坐标轴
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)
% 取消窗口时会报错,取消时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);% 读取音频文件
    % 若输入音频为双声道,则使用一个通道
    samplesize=size(handles.Sample);
    if samplesize(2)>1
        handles.Sample=handles.Sample(:,1);
    end
    handles.CSample=handles.Sample;% 创建副本
    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');% 获取参数序号
fs=str2double(fs_list{fs_value});% 获取选定采样率
% list类型为cell必须转换
handles.Fs=fs;

handles.recObj=audiorecorder(fs,16,1);% 创建一个录音器

set(handles.recObj,'StartFcn',{@recordstart_Callback,handles}, ...
    'StopFcn',{@recordstop_Callback,handles}); % 录音回调

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;% 创建副本
handles.player=audioplayer(handles.CSample,handles.Fs);
setplayer(handles);

guidata(hObject,handles);

% --- 播放器设置
function setplayer(handles)
% 创建player回调函数
set(handles.player,'StartFcn',{@playstart_Callback,handles}, ...
    'StopFcn',{@playstop_Callback,handles});

% 音频信息
sample_length=length(handles.Sample); % 音频时长
t=sample_length/handles.Fs;
set(handles.timeinfo_text,'String',['时长:',num2str(t),'s']); % 显示时长
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

三、运行结果

以上就是基于Matlab实现数字音频分析处理系统的详细内容,更多关于Matlab的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于Matlab实现BP神经网络交通标志识别

    目录 一.BP神经网络交通标志识别简介 二.部分源代码 三.运行结果 一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复杂, 且智能识别技术尚未成熟, 为了得到高效实用的道路标志识别系统, 仍需进行大量的研究.限速交通标志的检测识别作为道路交通标志识别系统的一个重要组成部分, 对它的研究具有非常重要的意义. 目前国内已有不少学者针对道路交通标志牌的智

  • 基于Matlab图像处理的公路裂缝检测实现

    目录 一.简介 1案例背景 2理论基础 3程序实现 二.部分源代码 三.运行结果 一.简介 1 案例背景 随着国家对公路建设的大力投入,我国的公路通车总里程己经位居世界前列,这样进一步促进了我国经济建设的发展.随着公路的大量投运,公路日常养护和管理已经成为制约公路运营水平提高的瓶颈,特别是路面状态采集.检测维护等工作更是对传统的公路运维模式提出了挑战.路面裂缝是公路日常养护管理中最常见的路面损坏,也是影响公路状态评估和进行必要的公路维修的重要因素!.一般而言,如果路面裂缝能够在被恶化成坑槽之前得

  • 利用Matlab仿真实现图像烟雾识别(k-means聚类图像分割+LBP+PCA+SVM)

    目录 一.算法简介 1.1 c-means聚类算法 1 .2 LBP算法 1.3 PCA算法 1.4 SVM算法 二.算法实现 2.1 烟雾识别算法流程 2.2 c-means算法实现 2.3 LBP算法实现 2.4 SVM算法实现 三.结果分析 一.算法简介 1.1 c-means聚类算法 聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象进行分组.目的是使组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的).组内相似性越大,组间差距越大,说明聚类效果越好.

  • 基于Matlab LBP实现植物叶片识别功能

    目录 一.LBP简介 1.1 课题的提出与研究意义 1.2 国内外相关研究情况 1.3 论文的主要研究工作 1.4 论文结构 二.部分源代码 三.运行结果 一.LBP简介 第一章 引言 植物在我们的身边随处可见,它们从产生发展进化到现在,其间经历了漫长的岁月.地球上的植物种类繁多.数量浩瀚,它们是生物圈的重要组成部分,在维持整个生物界的平衡方面发挥着巨大的作用:它们同时也是构成人类生存环境的重要组成部分,是人类社会延续和发展不可或缺的重要因素.由于植物对于地球和人类都具有如此重要的意义,对它们的

  • Matlab实现简单扩频语音水印算法详解

    目录 一.实验背景 1.实验目的 2.实验环境 3.原理简介 二.基础知识 1.PN序列 2.时域到频域变换的原因 3.三种时域到频域变换的区别 三.算法源码 1.PN产生函数 2.隐藏算法 3.提取算法 4.测试脚本 四.运行测试 1.无攻击(误码率0.000976): 2.AU格式转换(误码率0.001921): 3.压缩与解压缩(误码率0.002029): 一.实验背景 1.实验目的 了解扩频通信原理,掌握扩频水印算法的基本原理,设计并实现一种基于音频的扩频水印算法,了解参数对扩频水印算法

  • 基于Matlab实现数字音频分析处理系统

    目录 一.语音处理简介 1语音信号的特点 2语音信号的采集 3语音信号分析技术 4语音信号的时域分析 5语音信号的频域分析 二.部分源代码 三.运行结果 一.语音处理简介 1 语音信号的特点 通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点: ①在频域内,语音信号的频谱分量主要集中在300-3400Hz的范围内.利用这个特点,可以用一个防混迭的带通滤波器将此范围内的语音信号频率分量取出,然后按8kHz的采样率对语音信号进行采样,就可以得到离散的语音信号. ②在时域内,语音信号具有“

  • 基于Matlab制作一个不良图片检测系统

    目录 不良图片检测部分 part.0 图片导入 part.1 检查是否为肤色 part.2 皮肤区域标记 part.3 通过皮肤区域特点判定是否为不良图片 完整代码 批量处理部分 不良图片检测部分 看到博主码猴小明用python PIL库制作了一个不良图片识别系统,手痒,想用MATLAB也试试,毕竟矩阵运算也算是MATLAB的强项了,使用MATLAB写可比用python写简洁太多了,总体流程如下: 检查各个像素是否为肤色 将相邻的肤色像素归为一个皮肤区域,得到若干个皮肤区域,并剔除像素数量极少的

  • 基于matlab MFCC+GMM的安全事件声学检测系统

    一.安全事件声学检测简介(附lunwen) 1 选题背景 公共安全问题是社会安全稳定所聚焦的话题之一.近年来,检测技术与监控自动化正深刻地改变着人们的生活.尤其在安防领域,闭路电视CCTV(Closed Circuit Television).视频流分析.智能监控等新技术得到了广泛应用,大大提高了安防监控的管理效率.然而值得注意的是,基于视频流的监控手段不可避免地也具有一定的先天性缺漏,例如存在视野盲区.易受光照影响等问题,对于事件检测,还可能存在语义不明的问题,监控手段不够全面.纯视频手段在枪

  • 基于matlab实现DCT数字水印嵌入与提取

    目录 一.离散小波变换的音频信号数字水印技术简介 0 引言 1 音频数字水印技术分类 2 基于DWT的音频水印算法 二.部分源代码 三.运行结果 一.离散小波变换的音频信号数字水印技术简介 0 引言 近年来, 数字水印技术的作用越来越重要.数字水印技术是将一些标识信息直接嵌入数字载体当中, 或间接表示在信号载体中, 且不影响原载体的使用价值.通过隐藏在载体中的这些信息, 可以判断信息是否被篡改, 具有防伪溯源.保护信息安全.版权保护等作用.对于广播转播台站而言, 是广播音频的中转站, 在广播信号

  • 基于Python实现人脸自动戴口罩系统

    1.项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩.酒精.消毒液奇货可居. 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官数据,根据这些数据,确定嘴唇部分的位置数据(48点~67点位置),根据检测到嘴部的尺寸和方向,借助PLL模块调整口罩的尺寸和方向,实现将口罩放在图像的适当位置. 2.页面设计 基于tki

  • 逐行分析鸿蒙系统的 JavaScript 框架(推荐)

    我在前文中曾经介绍过鸿蒙的 Javascript 框架,这几天终于把 JS 仓库编译通过了,期间踩了不少坑,也给鸿蒙贡献了几个 PR.今天我们就来逐行分析鸿蒙系统中的 JS 框架. 文中的所有代码都基于鸿蒙的当前最新版(版本为 677ed06,提交日期为 2020-09-10). 鸿蒙系统使用 JavaScript 开发 GUI 是一种类似于微信小程序.轻应用的模式.而这个 MVVM 模式中,V 其实是由 C++ 来承担的.JavaScript 代码只是其中的 ViewModel 层. 鸿蒙 J

  • 基于opencv和pillow实现人脸识别系统(附demo)

    目录 一.人脸检测和数据收集 二.训练识别器 三.人脸识别和显示 本文不涉及分类器.训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解) 首先我们需要知道的是利用现有框架做一个人脸识别系统并不难,然后就开始我们的系统开发吧. 我们的系统主要分为三个部分,然后我还会提出对补获图片不能添加中文的解决方案.我们需要完成的任务:1.人脸检测和数据收集2.训练识别器3.人脸识别和显示 在读此篇文章之前我相信你已经做了python环境部署和opencv模块的下载安装工作

  • 基于matlab对比度和结构提取的多模态解剖图像融合实现

    目录 一.图像融合简介 二.部分源代码 三.运行结果 四.matlab版本 一.图像融合简介 应用多模态图像的配准与融合技术,可以把不同状态的医学图像有机地结合起来,为临床诊断和治疗提供更丰富的信息.介绍了多模态医学图像配准与融合的概念.方法及意义.最后简单介绍了小波变换分析方法. 二.部分源代码 clear; close all; clc; warning off %% A Novel Multi-Modality Anatomical Image FusionMethod Based on

随机推荐