基于MATLAB的数字电子琴设计
*****************
实践教学
*******************
题 目: 基于MATLAB的数字电子琴设计
专业班级:
姓 名:
学 号:
指导教师:
成 绩:
摘要
本次课设的任务是基于MATLAB设计一个数字电子琴,首先实现数字信号发生器的设计。数字信号发生器是一种基于软硬件实现的波形发生器,可以实现各种基本波形的产生。在工程的各种复杂信号是由这些基本信号叠加产生,因此它在工程分析和实验教学中有着广泛的应用,可用MATLAB实现。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用。本文首先详细介绍了基于MATLAB的数字发生器的设计过程,实现了简单波形(正弦波、方波、三角波、锯齿波、白噪声、脉冲、阶跃)信号的具体实现方法。其次介绍了利用该数字信号发生器产生的正弦波信号和声卡设计的简易电子琴。 关键词:MATLAB;数字信号发生器;简易电子琴
目录
前言........................................................................................................................ 1 一、数字信号发生器............................................................................................ 2
1.1图形用户界面的简介.............................................................................. 2
1.2设计
.................................................................................................. 2
1.3波形实现的基本原理.............................................................................. 3 二、电子琴的实现................................................................................................ 5
2.1简易数字电子琴的简介.......................................................................... 5
2.2实现原理.................................................................................................. 5 三、基于MATLAB的仿真及结果分析 ............................................................. 6
3.1 GU................................................................. 6 I界面 ................................
3.2编写M文件 ............................................................................................ 7 总结...................................................................................................................... 14 参考文献.............................................................................................................. 14 附录...................................................................................................................... 15 致谢...................................................................................................................... 22
前言
MATLAB(矩阵实验室)是Matrix Laboratory的缩写,是一种用于算法开发、数据可视化、数据分析以及数值计算的高级计算机语言和交互式环境。MATLAB可以进行矩阵运算、绘制函数图像和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处
图形用户界面(GUI)理、信号检测、金融建模设计与分析等领域。Matlab环境下的
是由窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面,可在图形用户界面内根据需要搭建图形,并对控件的回调函数进行编写,完成最完整的GUI界面编辑即可运行。本文主要利用MATLAB的图形用户界面设计数字信号发生器,在数字信号发生的基础上实现简易电子琴的设计。
信号发生器又称信号源或振荡器,是一种能提供各种频率、波形和输出电平电信号的仪器,数字信号发生器只是信号发生器的一种,在生产实践和科技领域中有着广泛的应用。信号发生器按信号波形可分为正弦信号、函数(波形)信号、脉冲信号和随机信号发生器等四大类。能够产生多种波形,如正弦波、三角波、锯齿波、矩形波(含方波)、阶跃信号、脉冲信号的电路被称为函数信号发生器。本文设计了一种基于MATLAB图形用户界面的可以产生正弦波、方波、三角波、锯齿波、白噪声、脉冲信号、阶跃信号的虚拟数字信号发生器。
1
一、数字信号发生器
1.1图形用户界面的简介
图形用户界面即Graphical User Interface,简称 GUI,又称图形用户接口。Matlab环境下的图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面。
用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。MATLAB的用户,在指令窗中运行demo 打开那图形界面后,只要用鼠标进行选择和点击, 就可产生丰富的
。对图形用户界面的操作一般有两个部分,首先按照设计的原理、要求,根据需要选择适当的图形对象搭建合理的GUI界面;然后对每个控件的回调函数在M文件内进行编写,使搭建的GUI界面能够运行。
数字信号发生器的设计所使用的工具即GUI界面,用到的图形对象有pushbutton、Aexs、Slider、Static Text、Edit Text。模拟了七种信号:正弦波、方波、三角波、阶跃信号、斜波信号、锯齿波以及白噪声信号。具体的实现原理如下。
1.2设计流程
根据设计的要求分析出数字信号发生器的GUI界面构图,然后在MATLAB的workplace界面中输入guide,打开GUI界面。在GUI界面中搭建好具体的数字信号发生器的界面,并对每个控件的回调函数进行编写、保存M文件。运行,若结果正确,再同一个GUI界面中搭建好电子琴的GUI界面,利用数字信号发生器产生的正弦波,对电子琴每个控件的回调函数进行编写、保存M文件。运行,观察仿真结果。若数字信号发生器的仿真结果不正确,检查控件的回调函数,修改并保存M文件,再次运行观察仿真结果。具体的设计
如下:
2
1.3波形实现的基本原理
1.3.1正弦波的实现
正弦信号的
表达式如下:
y,Asin(wt,,),Asin(2,ft,,) (1.1)
A其中:为幅值;为频率;为相位。在MATLAB中,由于处理对象均是离f,
散的数字信号,将时间变量离散化并构造成一个一维数组用t,0:1/f:1.0s
f其中:为采样频率。但的值不能太大,否则波形显示会很慢。相应的正fss
弦波信号的数字信号表达式为
y(n,t),Asin(2,fn,t,,) (1.2)
t幅值、频率、相位参数可以由用户界面上的滑动条或编辑框输入。在分别得到与的离散值后,用plot作图函数即可获得相应波形显示。 y
1.3.2方波信号的实现
方波信号的数学表达式为
(1.3) y,square(t,duty)
2,,1该式可直接生成一个周期为,峰值为,占空比为的方波信号,的dutyduty
默认值为50%。在MATLAB中可得到幅值、频率、相位可调的方波信号函数
(1.4) y,Asquare(2,ft,,)
1.3.3三角波信号的实现
sawtooth在MATLAB中,可以用函数直接生成一个三角波信号,
2,2,,width,1该函数可生成一个周期为,峰值为,最大值出现在位置的三角波。利用该函数,可得到幅值、频率、相位可调的三角波信号函数
(1.5) y,Asawtooth(2,ft,,)
3
1.3.4锯齿波信号的实现
widthsawtooth由于锯齿波信号与三角波信号相似,所以将函数中的参数值设为1,可得到锯齿波。该函数得到的幅值、频率、相位可调的锯齿波信号函数
y,Asawtooth(2,ft,,,1) (1.6) 1.3.5脉冲信号的实现
由于脉冲信号与方波信号波形相似,用方波信号函数函数为基础,将square其函数值加1,可得到最大值为2,最小值为0的脉冲波形,原函数的参数duty可用来调节脉冲的宽度。用该函数,得到幅值、频率、相位可调的脉冲信号函数
y,A(square(2,ft,,,1),1)/2。 (1.7) 1.3.6阶跃信号的实现
由于阶跃信号比较特殊,可用函数直接表示,其函数表达式为
y,{0(t,t),A(t,t)} (1.8) 00
1.3.7白噪声信号的实现
白噪声信号是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可
randn借助于MATLAB中的函数,它的功能是产生一个均值为0,标准差为1
a的随机数列或矩阵函数,可得到一个均值为0,标准差为的维的随机矩阵。 fs
4
二、电子琴的实现
2.1简易数字电子琴的简介
在设计界面中包含A、B、C、D、E、F、G共7个琴键,由于低音频率区分不是很明显,此次课设选择的是中音频率,其中每个按键对应一个频率的正弦波信号,各按键对应的信号频率分别为392、440、494、523、587、659、698、784Hz。当用鼠标按下相应的键时发声,松开时发声停止,然后将数字信号写入声卡的缓冲区,由声卡播放出相应的声音。当用鼠标按下对应的键时即可发出相应频率的声音。
2.2实现原理
电子琴的实现基于之前设计的数字信号发生器,选择数字发生器产生的正弦波信号作为发声及显示波形,由回调函数和数字信号发生器结合起来,实现对波形的调用。每个键对应一定的频率,在各个键的回调函数中设置好频率及频谱显示,实现每个键有自己特定频率的功能,为了使最终仿真结果更好,选择音阶中音调高的频率作为调试频率。当键按下的时候,首先由相应的键和数字信号关联起来,随后将数字信号写入声卡的缓冲区,由声卡发出相应频率的声音,并显示波形及对应频率的频谱图,当键松开时声音即停止。此次电子琴的设计实现了正弦波显示、频谱显示以及发声的功能,从而实现虚拟电子琴的模仿功能。具体的实现流程图如下:
5
开始
打开MATLAB
搭建电子琴的GUI界面
执行并观察仿真结果
结束
图2.1 电子琴的实现流程图
三、基于MATLAB的仿真及结果分析
3.1 GUI界面
3.1.1搭建数字信号发生器的GUI界面
搭建的GUI界面如下图3.1:
6
图3.1 数字信号发生器的GUI界面
3.1.2电子琴的GUI界面
。搭建的数字电子琴GUI界面如图3.2所示:
图3.2 数字电子琴的GUI界面
G该界面主要由琴键组成,每个按键对应一定的频率,模拟电子琴的发声功能,它的波形显示及频谱图在数字信号发生器中。
3.2编写M文件
3.2.1数字信号发生器的M文件
(1)正弦信号的实现
由正弦信号的数学表达式可知在程序中用到的具体表达式为
y,a*sin(2*pi(f*t,q/360)) (3.1) 将时间变量离散化并构造成一个一维数组,要求采样频率不能太大,否则波形显示会很慢
(2)方波信号的实现
用函数直接生成一个方波信号,程序中使用的具体函数为 square
7
y,A*square(2*pi*f*t,50) (3.2) (3)三角波的实现
sawtooth函数直接生成一个三角波信号,程序中用到的具体实现函数为
y,A*sawtooth(2*pi*f*t,0.5) (3.3)
(4)锯齿波信号的实现
具体的函数实现形式为
y,A*sawtooth(2*pi*f*t,1) (3.4) (5)脉冲信号的实现
抽样频率为8000,时间范围为[0,1],坐标抽为[0,a+1]。得到的幅值、频率、相位可调的脉冲信号函数。具体的函数
y,a*(square(2*pi*(f*t,q/360),1,1)/2 (3.5)
(6)阶跃信号的实现
t取1,A取1,t取[0,2],时间间隔为/100。阶跃信号的函数表达式为 ,,0
y,{0(t,t),A(t,t)} (3.6) 00
(7)白噪声信号的实现
白噪声是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可借于
randnMATLAB中的函数,产生一个均值为0,标准差为1的随机数列或矩阵
a该函数可得到一个均值为0,标准差为的维的随机矩阵。fs
y,A*sawtooth(2*pi*f*t,0.5) (3.7) 3.3仿真结果
数字信号发生器的仿真结果如下:
(1)正弦波的仿真结果
8
图3.3 数字信号发生器的正弦波波形 (2)方波信号的仿真结果
图3.4 方波信号的波形 (3) 三角波信号仿真结果
9
图3.5 三角波信号的波形 (4)阶跃信号仿真结果
图3.6 阶跃信号的仿真结果
(5)斜波信号
10
图3.7 斜波信号的仿真结果 (6)锯齿波信号的仿真结果
图3.8 阶跃信号的仿真结果 (7)白噪声仿真结果
11
(1)按键A的仿真结果
图3.10 按下A键,电子琴演奏时的效果 (2)按键B的仿真结果
图3.11 按下B键,电子琴演奏时的效果 (3)按键C的仿真结果
12
图3.12 按下C键,电子琴演奏时的效果
13
总结
本次的课程设计的任务是基于MATLAB设计一个数字电子琴,首先设计一个数字信号发生器。数字信号发生器和电子琴的搭建都是在GUI界面中进行搭建的,在GUI界面中搭建好具体的数字信号发生器的界面,并对每个控件的回调函数进行编写、保存M文件。运行,若结果正确,再同一个GUI界面中搭建好电子琴的GUI界面,利用数字信号发生器产生的正弦波,对电子琴每个控件的回调函数进行编写、保存M文件搭建完成之后对各个控件进行回调函数的编写。如果数字信号发生器的运行结果正确,则继续搭建电子琴否则修改直到正确为止。
在本次的课程设计中,确实遇到了很多问题,但通过大家的帮助和自己的努力,最终实现所有的设计要求。本次课程设计也许还存在着一些不足,在以后学习生活中会更加努力,争取做得更好。
参考文献
[1] 丁玉美. 数字信号处理[M]. 西安电子科技大学出版社,2003,3.
14
[2] 朱冰莲. 数字信号处理[M]. 电子工业出版社,2003,7.
[3] 程佩青.数字信号处理教程(第二版)[M].北京:清华大学出版社,2001. [4] 韩纪庆,张磊,郑铁然.语音信号处理[M].北京:清华大学出版社,2004. [5] 王济, 胡晓. MATLAB 在振动信号处理中的应用[M ]. 北京: 中国水利水电出版社: 知识产权出版社, 2006.
[6] 周祥才, 杨铮. 基于MATLAB的信号采样与重构的实现[ J] .实验技术与管理, 2007, 24
[7] 张志涌等(精通MATLAB [M](北京:北京航空航天大学出版社,2003( [8] 车子萍. 基于Matlab的虚拟信号发生器设计[J]. 电脑学习, 2010.1. [9] 李益华. MATLAB辅助现代工程数字信号处理(第2版). 西安:西安电子科技大学出版社,2010
[10] 杨洁芳. 基于MATLAB与声卡的低频信号发生器的设计与实现. 电脑学习,2006
附录:
function pushbutton16_Callback(hObject, eventdata, handles)
15
Fs=8000;
t=(0:2000)/Fs;
pit=2*pi*t;
a1=523;
y=sin(a1*pit);
axes (handles.axes1); plot(t,y);
title('时域波形')
xlabel('t')
ylabel('y')
axis([0,.01,-2,2])
axes (handles.axes2); f=fft(y,1024);
f1=fftshift(f);
w1=513:1024;w=4000*(w1-512)/512; F=abs(f1(513:1024));
plot(w,F);
title('频谱图')
xlabel('w')
ylabel('F(w)')
sound(y);
function pushbutton24_Callback(hObject, eventdata, handles)
Fs=8000;
16
t=(0:2000)/Fs;
pit=2*pi*t;
a2=587;
y=sin(a2*pit);
axes (handles.axes1); plot(t,y);
title('时域波形')
xlabel('t')
ylabel('y')
axis([0,.01,-2,2]) axes (handles.axes2); f=fft(y,1024);
f1=fftshift(f);
w1=513:1024;w=4000*(w1-512)/512;
F=abs(f1(513:1024)); plot(w,F);
title('频谱图')
xlabel('w')
ylabel('F(w)')
sound(y);
function pushbutton25_Callback(hObject, eventdata, handles)
Fs=8000;
t=(0:2000)/Fs;
17
pit=2*pi*t;
a3=659;
y=sin(a3*pit);
axes (handles.axes1); plot(t,y);
title('时域波形')
xlabel('t')
ylabel('y')
axis([0,.01,-2,2]) axes (handles.axes2); f=fft(y,1024);
f1=fftshift(f);
w1=513:1024;w=4000*(w1-512)/512;
F=abs(f1(513:1024)); plot(w,F);
title('频谱图')
xlabel('w')
ylabel('F(w)')
sound(y);
function pushbutton26_Callback(hObject, eventdata, handles)
Fs=8000;
t=(0:2000)/Fs;
pit=2*pi*t;
18
a4=698;
y=sin(a4*pit);
axes (handles.axes1); plot(t,y);
title('时域波形')
xlabel('t')
ylabel('y')
axis([0,.01,-2,2]) axes (handles.axes2); f
axes (handles.axes1); plot(t,y);
title('时域波形')
xlabel('t')
ylabel('y')
axis([0,.01,-2,2]) axes (handles.axes2); f=ff
t=0:1/fs:1.0;
y=a*sin(2*pi*(f*t+q/360));
axes (handles.axes1); plot(t,y);
title('时域波形');
19
xlabel('t');
ylabel('y');
grid on;
axis([0,.01,-2,2]);
allback(hObject, eventdata, handles) t=(0:pi/100:2*pi);
t0=1;
A=1;
y=0*(t
t0);
end
t=0:1/fs:1.0;
y=randn(size(t));
title('时域波形');
plot(t,y);
title('时域波形');
xlabel('t');
ylabel('y');
grid on;
axis([0,Ts,-(a+1),(a+1)]); function slider1_Callback(hObject, eventdata, handles)
w=get(hObject,'value');
set(handles.edit1,'string',num2str(w));
function slider1_CreateFcn(hObject, eventdata, handles)
20
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
function slider2_Callback(hObject, eventdata, handles) w=get(hObject,'value');
set(handles.edit2,'string',num2str(w));
function slider2_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]); end
function edit1_Callback(hObject, eventdata, handles) v=get(hObject,'string');
set(handles.slider1,'value',str2double(v)); function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) end
function edit3_Callback(hObject, eventdata, handles) v=get(hObject,'string');
set(handles.slider3,'value',str2double(v)); function edit3_CreateFcn(hObject, eventdata, handles) get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
21
致谢
本次课设,我遇到了很多问题,首先感谢我的课程设计指导教师老师在这段时间一直给我的支持与鼓励。认真负责的监督我们课程设计的进度,耐心的指 导我们使我们能够按时的完成任务。 同时还要感谢在设计过程中同学们尤其是同组成员给给了我很大的帮助,对我课设过程中不明白的问题给予了即使的、耐心的帮助,让我对此次课设涉及的知识有了更加深刻的把握。他们提出了许多宝贵的建议使我们的设计能得到更好的完善,也加快设计的进程。还有感谢学校为我们提供的良好实验环境以及充足的实验设备,为我们的设计和调试提供了很大的方便。在这段时间学到了很多,虽然由于自身的不足没 有能够为系统提出更好的解决方案。但这对我来说绝对是一个非常宝贵的历练。从中我切身体会到了理论和现实的差距, 只有真正动手去做才能发现问题。 同时,小组成员相互商讨解决方案,发现设计中的不足之处,使错误得到了即使改正,在此衷心地感谢老师以及这几周的殷切指导以及同学们提出诸多宝贵意见真诚地道一声,谢谢~
22