基于matlab-GUI数字音频处理系统(一)
来源:互联网 发布:c 三维编程库 编辑:程序博客网 时间:2024/04/29 19:28
前言
本次项目为数字信号处理课程项目,项目全部采用matlab GUI编程,已上传至github/git_dsp
项目要求如下:
- 至少实现 1 种音效测试分析功能(频率响应,瀑布频谱图,相位响应曲线,抗阻曲线,谐波失真曲线,互调失真曲线,音压曲线等);
- 至少实现 1 种语音处理功能(声纹识别,关键词识别,语音去噪,声源分离等),并分别对其进行实际应用;
matlab对git的支持
为了方便修改,本次项目使用了git,并托管到github上。
matlab对Git有很好的支持,文件栏处右击源代码管理,可以直接对文件进行添加、提交、推送到github。
所用函数功能一览
GUI编程模块解析
关于句柄
GUI函数中使用了大量的句柄,句柄类似指针,可以自己创建指向某一函数,GUI中使用句柄指向图形对象。
GUI的创建
GUi的建立基本上有两种方式,一种是使用figure
创建新窗口,但这种需要对GUI部件与属性十分了解,并且不利于复杂部件的排版;第二种是使用guide可视化界面,这种方式容易上手,利于排版,部件的属性可以直观地修改,但是由于在创建时会自动生成默认参数,不利于在生成后对于一些默认属性如文件名地修改。
强烈建议在命名时一定不要随意,我在创建主窗口时比较随意地使用了
dsp
作为文件名,然而在之后了解到matlab本身有一个dsp类的工具箱,虽然在使用上没有什么问题,但是感觉还是不好,在改名后会出现很多问题,比如回调函数、属性等都没有改变,很难受。
解析自动生成的代码
在创建好一个GUI后,会自动生成两个同名文件,即.fig
和.m
,.fig
应该是保存了设计界面时的默认属性,右击可以对界面进行修改,.m
文件会自动生成窗口的参数和函数以及部件的回调函数等,下面对其中生成的代码介绍一下我浅薄的认识,这里输出音频窗口为例:
- 主程序
function varargout = putfile(varargin)% --- 输出音频gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @putfile_OpeningFcn, ... 'gui_OutputFcn', @putfile_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []);if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});endif nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end
- 首先生成的代码中有大量注释,其中包含了各种介绍,队以初学者还是很有用的,这里我就删掉不放了,可以在GUI设置里去掉生成注释选项,虽然主函数部分还是会生成一些注释。
varargout
与varargin
可以用于多个GUI直接进行参数传递,并且输入与输出的个数是可变的,具体在之后的GUI参数传递中介绍。gui_Singleton
表示单一运行实例,可以在GUI选择项中设置,为1时,如果之前窗口未关闭,下次运行时仍会使用该窗口;为0时,下次运行会新打开一个窗口。struct
创建结构数组,定义了gui_state
GUI状态,即名字、运行实例、打开函数、输出函数、布局以及回调函数str2func(varargin{1})
取得创建figure和部件的CreateFcn回调函数。最后是执行
gui_mainfcn
函数,输入参数为gui_State
和回调函数句柄
,生成整个界面,判断条件为输出参数个数,如果有输出就将gui_mainfcn
结果分别输出。- 接下来运行打开函数
function putfile_OpeningFcn(hObject, eventdata, handles, varargin)movegui(gcf,'center');handles.putSample=varargin{1}; %保存输入% 初始化采样率为输入音频采样率handles.putFs=varargin{2};str=get(handles.Fs_popupmenu,'String');for val=1:5 if str2double(str{val})==handles.putFs break endendset(handles.Fs_popupmenu,'Value',val);% Update handles structureguidata(hObject, handles);% UIWAIT makes putfile wait for user response (see UIRESUME)% uiwait(handles.figure1); % 等待输出响应
- 该函数创建了打开窗口后的初始化属性,我们也可以自己在这里初始化的一些参数。
hObject
为该部件的句柄(这里指该figure),eventdata
存储事件信息(面向对象),handles
是一个句柄类,包含了所有部件,可以用于回调函数之间的参数传递 。guidata(hObject, handles)
用于函数之间参数传递,如果有handles类的参数生成或改变,必须添加。- 运行输出函数
function varargout = putfile_OutputFcn(hObject, eventdata, handles) varargout{1} = 0; % 不需要输出
该函数传递窗口输出,默认为varargout{1}=handles.output
,指向的是原OpeningFcn
中的handles.output = hObject
(我删掉了),由于我的这个窗口不需要输出,设置为0。
GUI参数传递
详细参考Matlab的GUI参数传递方式总结
函数与函数之间
- 使用
global
定义全局变量,需要在每次使用前定义一次。 - 使用
handles
类,我基本上全部使用了handles,这样方便、清晰,但是一定要在后面加上guidata(hObject, handles)
,不然参数传递不出去。
GUI与GUI之间
这里以主figuredsp
和输出音频putfile
为例,需要对dsp中的样本handles.CSample
输出,在dsp中
putfile(handles.CSample,handles.Fs); % 传递样本与采样率
这时putfile接收到了这两个数据,需要在OpeningFcn(如上面的程序)添加
handles.putSample=varargin{1};handles.putFs=varargin{2};
这样就可以在putfile调用这两个数据。
由于我这里putfile没有输出,就将handles.out
去掉,varargout{1} = 0
,保证关闭窗口时不会报错,如果需要输出的话,需要在putfile的OpeningFcn
中添加
uiwait(handles.figure1); % handles.figure1为putfile窗口句柄,该语句被默认注释掉
这样可以保证再打开窗口后不会直接运行OutputFcn
,在后面需要输出参数的地方加上uiresume(handles.figure1)
。
function varargout = putfile_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.out1;function out(hObject, eventdata, handles))handles.out1=out1;uiresume(handles.figure1);
这样在输出参数设置好后,接着会运行OutputFcn
进行输出。
注意如果使用了uiwait,在输出参数没有设定时(即没有运行uiresume),关闭窗口会报错。
参考关于GUI中uiwait关闭出错的问题
如果GUI不需要输出,OutputFcn中可以写varargout{1} = 0;
如果GUI需要有输出,OutputFcn中可以做一个判断isempty(handles)
,如果返回值是1,说明是点击右上角的关闭按钮退出的,如果返回值是0,说明是使用uiresume退出的。这两种情况返回的varargout根据需要分别设定。
matlab GUI面向对象(oop)编程
GUI中部件属性使用类来创建的,涉及到了matlab opp编程,这里先不细研究。
在编写程序时使用面向过程有些方法比较繁琐,很多函数需要重复调用,考虑之后探究一下matlab opp来优化这些问题,比如使用监听器之类。
- 基于matlab-GUI数字音频处理系统(一)
- 基于matlab-GUI数字音频处理系统(二)
- 基于matlab的GUI图像处理
- 基于Matlab的图像处理GUI
- 基于matlab的数字图像处理GUI设计
- matlab gui(一)对象
- matlab之GUI练习(一)
- Matlab GUI 鼠标事件(一)
- 基于GUI的简易图像处理系统设计与实现
- MATLAB中GUI图像处理
- MATLAB数字图像处理(一)
- Android7.1 GUI系统-概述(一)
- Android GUI系统-View框架(一)
- MATLAB中文论坛帖子整理(GUI)(一)
- (一)初试Matlab Gui之数组引用
- Matlab学习笔记 (一)GUI用户图形界面编程
- I2S音频总线学习(一)数字音频技术
- I2S音频总线学习(一)数字音频技术
- 搜索引擎项目的部署
- 安卓指纹识别
- android native 调试
- 在服务器上配置jupyter notebook
- Oracle spool 用法小结
- 基于matlab-GUI数字音频处理系统(一)
- css3圆角每个值的意思,文本框默认有字鼠标移动字体消失
- Spring Cloud 如何选择分布式配置中心
- windos weblogic 安装报Caused by: com.oracle.cie.domain.security.InvalidPasswordException: 60455:
- Linux 使用yum安装软件实用方法(咋个办呢 zgbn)
- 如何快速掌握一门新技术/语言/框架
- Java 并发编程 Copy-On-Write
- 解决绕过android下apk使用usb设备权限查询相应问题,自动获取usb权限
- JMS基本概念