赞
踩
##MATLAB之使用GUI处理语音信号(二)基本界面和绘制波形
在上一篇文章中我们认识了GUI并且学习了一些基础操作,这节我们开始进入使用GUI处理语音信号的主题,直接看最终效果:
本节学习构建基础界面和绘制时域图、幅域图和相频图。
一.绘制基础界面
首先我们明确需求,要实现的功能为:
1.选择并导入音频文件;
2.播放音频;
3.绘制时域图、频域图以及相频图;
首先,选择并导入音频文件需要一个按钮来选择文件,再加上一个静态文本来提示用户应该选择格式为.wav的波形文件,步骤如下:
(1)输入guide命令
(2)新建一个空白GUI编辑界面
(3)拖动一个按钮和一个可编辑文本放到合适位置
(4)修改名称并选择合适的字号
至此完成,效果如下:
接下来,播放音频,只需要一个按钮
参考上面步骤很容易画出,这里不再过多解释,直接看图:
最后是画图,这里再给大家介绍一种新的界面,坐标轴,用来显示图像
具体步骤如下:
(1)直接拖动三个控件到合适位置,并且调整到合适大小即可:
(2)这里添加三个静态文本,来标识图形;
(3)最后添加三个按钮,通过点击来控制显示图形。
至此界面已经全部构建完,直接点击绿色的运行按钮,生成代码进行修改
二.完善代码
1.首先单击“选择文件按钮”,查看其标签为“pushbutton1”(可能不同,看自己具体情况),在相应函数下输入以下代码:
[filename,pathname]=uigetfile({'*.wav','ALLFILES(*.*)'},'选择声音文件');
if isequal([filename pathname],[0,0])
return;
end
str=[pathname filename];%选择的声音文件路径和文件名
global temp;
global Fs;
[temp,Fs]=audioread(str);%temp表示声音数据 Fs表示频率
handles.y=temp;handles.Fs=Fs;
这里为选择文件,并且创建temp、Fs两个全局变量,并将音频文件的相关数据储存到这两个变量中。
这里使用全局变量的目的是在其他函数中还要调用,要注意的是global为全局变量。
2.接下来查看“播放”按钮的标签为“pushbutton2”
在相应函数下输入以下代码:
global temp;
global Fs;
sound(temp,Fs);%播放音频文件
注意在调用temp和Fs之前要声明一下这两个全局变量。
3.接下来我们将三幅图分别在对应坐标轴中显示
(1)在绘制时域图按钮对应的函数中添加如下代码:
global temp;
global Fs;
plot(handles.axes1,temp);%画出时域图,放到坐标轴1中
xlabel(handles.axes1,'时间')
ylabel(handles.axes1,'幅值')
注意axes1为放置时域图的坐标轴对应的标签,这样就很容易理解它的意思了,将图像放在哪个坐标轴中。
(2)在绘制幅频图按钮对应的函数中添加如下代码:
global temp;
global Fs;
global n;
global temp1;
global len;
n=length(temp);%提取信号长度
temp1=fft(temp,n);%进行快速傅里叶变化
len=round((length(temp1))/2);%选取一半长度
plot(handles.axes2,abs(temp1(1:len)));%画出频域图
xlabel(handles.axes2,'频率');
ylabel(handles.axes2,'幅值');
代码具体含义参考使用脚本分析的那篇文章,这里不再过多解释,要注意的是声明全局变量和将图片放到指定的坐标轴中。
(3)在绘制相频图按钮对应的函数中添加如下代码:
global n;
global temp1;
global Fs;
f0=(-n/2:n/2-1)*(Fs/n);%进行相位计算
ph_y0=fftshift(temp1);
phase=unwrap(angle(ph_y0));% 矫正相角跳变范围在pi以内
plot(handles.axes3,phase);%画出相频图
xlabel(handles.axes2,'频率');
ylabel(handles.axes2,'相位');
至此全部完成,我们来直接运行。
##之后我将会上传全部源码和文件,后续内容也将在博客继续更新,请持续关注
##有任何不足之处请及时指出,共同学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。