摘要:本文章的设计主要讲基于matlab的gui音频实时显示设计,此次设计的gui相当于一个简洁的音乐播放器,界面只有”录音“和”播放“两个控件,哈哈,够简洁吧。通过”录音“按钮可以实现声音从电脑的声卡录入,并且实时显示录入声音的时域图形和频域图形;待录音结束,通过”播放“按钮可以播放刚录入的声音,并且一边播放一遍实时显示时域和频域图形。本设计的编码在matlab2013a上亲测,可以实现。。。

一、首先matlab的gui界面设计

打开matlab—>在命令行执行guide—>出现gui编辑界面,选择一个默认的空白模板—>在界面上添加两个坐标轴axes1、axes2,再添加两个push_button,和两个text—>调整好位置,将两个按钮tag改名为录音和播放,将两个text改为时域波形和频域波形,这样简单的界面就做好了,想要美观一些,可以自己再编辑。

二、设计好gui界面保存后就会自动生成一个.fig的文件和一个.m的文件,两个文件不要丢失,下次可以通过运行.m文件来打开界面,实现功能。设计好的界面如下图所示

打开.m的文件,里面可以看到图形设计的主函数function varargout = yin(varargin),打开函数function yin_OpeningFcn(hObject, eventdata, handles, varargin)和输出函数function varargout = yin_OutputFcn(hObject, eventdata, handles),至于这些函数里面是什么意思,可以参考园子里一位园友“技术蛀虫”的关于matlab的文章,讲的非常好。总之设计好界面后,生成的.m文件里会自动生成这些函数,此外还会生成你所加控件的回调函数callback,在相应的回调函数里加入代码后,点击界面上相应按钮时就会实现代码的功能。编写回调函数是非常重要的一步,这决定界面按钮能不能实现相应的功能。

三、回调函数的编写

这个gui的设计要编写的回调函数只有两个,分别为“录音”和“播放”两个按钮,不用实现功能的按钮就不用在.m文件中编写。编写控件的回调函数的方法有两种,一是直接打开.m文件在相应的回调函数名下编写或者修改。另一种是在制作gui界面的时候,在界面上相应的控件上右击,然后在“view callback”选项中编写并保存。下面开始编写两个控件的回调函数:

录音按钮的功能是:按下时,实时从声卡录入音频,并实时显示时域和频域的波形,先判断当前窗口句柄的isrecording的值,然后执行if语句,当isrecording值为0时,执行if下的语句,调用record(gcf,handles)函数,record函数我会另外写出来,运行的时候把它们放在同一个文件夹下就可以了。当isrecording为1时,表示当前窗口正在运行,表示在录音,这时按下这个按钮,就会执行else,将isrecording设置为0,从而停止录音。所以录音按钮第一次按下开始录音,第二次按下停止录音,都是通过设置isrecording的值实现。为了保证在界面刚打开的时候,为停止录音的状态,我们需要在打开函数function yin_OpeningFcn(hObject, eventdata, handles, varargin)中添加setappdata(gcf,'isrecording',0)命令,即一开始设置isrecording为0;

% --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
isrecording=getappdata(gcf,'isrecording');
if ~isrecording
setappdata(gcf,'isrecording',1);
recorder(gcf,handles);
else
setappdata(gcf,'isrecording',0);
end

附上record函数的代码:(record函数的作用是建立声卡对象,控制声卡实现录音,并对录音的数据进行实时的时域和频域显示)

function aa= recorder(cf,handles)
%RECORDER Summary of this function goes here
% Detailed explanation goes here
% h=figure(soundrec);

h=cf;
thehandles=handles;
setappdata(h,'isrecording',1);

Ai=analoginput('winsound'); % 创建一个模拟信号输入对象
% 添加通道
addchannel(Ai,1);
Ai.SampleRate=10000; % 采样频率
Ai.SamplesPerTrigger=Inf; % 采样数

start(Ai); % 开启采样
warning off % 当采样数据不够时,取消警告
while isrunning(Ai) % 检查对象是否仍在运行
if getappdata(h,'isrecording')
data=peekdata(Ai,Ai.SampleRate/2);% 获取对象中的最后Ai.SampleRate个采样数据
plot(thehandles.axes1,data) % 绘制最后Ai.SampleRate个采样数据的图形,因此表现出来就是实时的了
set(handles.axes1,'ylim',[-1 1],'xlim',[0 5000]);
y1=fft(data,2048); %对信号做2048点FFT变换
f=Ai.SampleRate*(0:1023)/2048;
bar(handles.axes2,f,abs(y1(1:1024)),0.8,'g') %做原始语音信号的FFT频谱图
set(handles.axes2,'ylim',[0 10],'xlim',[100 250]);%设置handles.axes2的横纵坐标范围
drawnow; % 刷新图像
else
stop(Ai);
num=get(Ai,'SamplesAvailable');
aa=getdata(Ai,num);
axes(thehandles.axes1);
plot(thehandles.axes1,aa) % 绘制所有采样数据的图形

y1=fft(data,2048); %对信号做2048点FFT变换
f=Ai.SampleRate*(0:1023)/2048;
bar(handles.axes2,f,abs(y1(1:1024)),0.8,'g') %做原始语音信号的FFT频谱图
drawnow; % 刷新图像
setappdata(h,'sounds',aa);
end
end

end

播放按钮的功能是:按下时,播放已经录入的音频,并实时显示频谱,这就需要自己设计记录音频播放的位置,这样才能使在循环内每次音频的播放位置正确,记录位置通过计时来实现,记录的时间差time转换为以秒为单位得到s,再通过s*fs来得到采样了多少个点,从而得到采样点的位置,并且限制每次处理5000个采样点,在时域波形上刷新显示;而频域的计算则是每次取2048个采样点进行fft变换。

% --- Executes on button press in pushbutton2.

function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global ad fs yp y ;
y=getappdata(gcf,'sounds');
fs=10000;
ad=analogoutput('winsound');%建立以声卡作为输入输出对象
addchannel(ad,1);
set(ad,'samplerate',fs);
putdata(ad,y);
handles.ad=ad;
guidata(hObject, handles);%更新图形句柄
start(ad);
T=clock;
pause(0.1);
while isrunning(ad)
T1=clock;
time=T1-T;%计算时间差
s=3600*time(4)+60*time(5)+time(6);
if(round(s*fs+5000)<length(y))
yp=y(round(s*fs):round(s*fs+5000));%round函数取距离最近的整数
plot(handles.axes1,yp);
set(handles.axes1,'ylim',[-1 1],'xlim',[0 5000]);
y1=fft(yp,2048);
f=fs*(0:1023)/2048;
bar(handles.axes2,f,abs(y1(1:1024)),0.8,'g') %做原始语音信号的FFT频谱图
set(handles.axes2,'ylim',[0 10],'xlim',[100 250]);%设置handles.axes2的横纵坐标范围
drawnow;
end
end

四、至此,整个设计就已经完成了,虽然界面简单,但是完美实现了所需的功能,本人小白,如有错误请大神们指点。完整的代码文件也将上传,大家相互交流,共同进步!

基于MATLAB的GUI(Graphical User Interface)音频实时显示设计的更多相关文章

  1. 基于matlab的GUI界面开发软件

    matlab工具deploytool编译M为可执行程序 http://blog.sina.com.cn/s/blog_60f8483a0100gnsm.html

  2. GUI(Graphical User Interface)

    译:用户和图形界面 GUI与程序交互的不同方式,包含3基本要素:输入,处理和输出. 常用GUI框架包括以下几种: wxPython Kivy Flexx PyQt Tkinter Pywin32 Py ...

  3. 给基于对话框的MFC程序添加状态栏并实时显示时间

    转载自丝雪儿 1.首先在string table 里添加两个字串,ID分别为IDS_INDICATOR_MESSAGE and IDS_INDICATOR_TIME 2.在你的 dlg.h 类里面加个 ...

  4. 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)

    图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉 ...

  5. 基于MATLAB的单级倒立摆仿真

    有关代码及word文档请关注公众号“浮光倾云”,后台回复A010.02即可获取 一.单级倒立摆概述 倒立摆是处于倒置不稳定状态,人为控制使其处于动态平衡的一种摆,是一类典型的快速.多变量.非线性.强耦 ...

  6. 基于MATLAB的离散小波变换

    申明,本文非笔者原创,原文转载自:  基于Matlab的离散小波变换         http://blog.sina.com.cn/s/blog_725866260100ryh3.html 简介 在 ...

  7. 基于MATLAB边缘检测算子的实现

    基于MATLAB边缘检测算子的实现 作者:lee神 1.   概述 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点.图像属性中的显著变化通常反映了属性的重要 ...

  8. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  9. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

随机推荐

  1. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  2. python抓取数据 常见反爬虫 情况

    1.报文头信息: User-Agent Accept-Language  防盗链 上referer 随机生成不同的User-Agent构造报头 2.加抓取等待时间 每抓取一页都让它随机休息几秒,加入此 ...

  3. BSD Apache GPL LGPL MIT

    当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来! 最初来自:sinoprise.com/read.php?tid-662-page-e-fpa ...

  4. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

  5. qml 封装技巧-利用数据来进行适配

    Text属于用的频率比较高而且需要定义的地方又比较多的地方,看一下如下的把Text封装成Label进行使用. 使用的例子: Label { id: titleLabel anchors { left: ...

  6. ios7中的多任务

    转自:http://onevcat.com/2013/08/ios7-background-multitask/ WWDC 2013 Session笔记 - iOS7中的多任务 iOS7的后台多任务特 ...

  7. java编码转换 unicode to utf-8

    private String decodeUnicode(String theString) { char aChar; int len = theString.length(); StringBuf ...

  8. WPF之MVVM模式讲解

    WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 恰当的模式可以让我们轻松达到“高内聚 ...

  9. Soufun_News

    using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.ComponentMod ...

  10. <input type="file">中怎设置那个按钮的样式

    最近才开始学习HTML,在练习表单的过程中,发现在使用<input type="file"/>这个类型的元素,产生的文件框和浏览按扭,它们的样式往往不符合我们的需要.怎 ...