基于MATLAB的数字信号发生器及简易电子琴设计_第1页
基于MATLAB的数字信号发生器及简易电子琴设计_第2页
基于MATLAB的数字信号发生器及简易电子琴设计_第3页
基于MATLAB的数字信号发生器及简易电子琴设计_第4页
基于MATLAB的数字信号发生器及简易电子琴设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于MATLAB的数字信号发生器及简易电子琴设计摘 要数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器。在工程实践中需要检测和分析的各种复杂信号均可分解成各种简单信号之和,而这些简单信号皆可由数字信号发生器模拟产生,因此它在工程分析和实验教学中有着广泛的应用。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用。本文介绍了一种使用MATLAB建立一个简单数字信号发生器的基本流程,并详细叙述了简单波形(正弦波、方波、三角波、锯齿波、白噪声、脉冲、阶跃、斜坡)信号的具体实现方法。最后,利用

2、简单的正弦波信号和PC的声卡设计了一个简易电子琴。关键字:MATLAB,数字信号发生器,简易电子琴1 概述随着计算机技术和测试技术的不断发展,传统的测试仪器正向虚拟化方向发展,特别是在试验教学领域。虚拟仪器作为现代仪器技术和计算机技术深层次结合的产物,更是得到了广泛应用。信号发生器原本是模拟电子技术发展的产物,但本文设计出的数字信号发生器是基于计算机软硬件实现的数字信号发生器,是一种虚拟仪器。2 设计原理常用的数字信号发生器一般可产生正弦信号、方波信号、三角波信号、锯齿波信号、白噪声信号、脉冲信号、阶跃信号、斜坡信号等。此时的数字信号又可称为离散信号,即时间为离散变量的信号。它只在离散时间上给

3、出函数值,是时间上不连续的“序列”。离散时间的间隔是均匀的,以表示。的值由信号的采样频率决定。为保证采样后信号能真实地保留原始模拟信号信息,信号采样频率必须至少为原信号中最高频率成分的2倍。这是采样的基本法则,称为采样定理。本文为了使产生的数字信号更接近原始的模拟信号,采用的采样频率为原始信号频率的30倍。MATLAB程序提供了常用的各种基本信号的生成函数。本设计需模拟的八种信号大部分都直接使用了MATLAB提供的函数,只有少数几个信号没有调用函数,直接编写的。为了模拟信号发生器的设置,本设计也将常用信号的幅值、频率、相位设计成可调的。2.1 正弦信号的实现正弦波信号的数学表达式如下式(2.1

4、)所示, (2.1) 其中:为幅值;为频率;为相位。在MATLAB中,将时间变量离散化并构造成一个一维数组,如下式(2.2)所示, (2.2)其中:为采样频率。相应的正弦波信号的数字信号表达式如下式(2.3)所示, (2.3) 幅值、频率、相位参数可以由用户界面上的滑动条或编辑框输入。在分别得到与的离散值后,用plot作图函数即可获得波形显示。2.2 方波信号的实现在MATLAB中,可以用函数直接生成一个方波信号,其函数原型为,该函数可生成一个周期为,峰值为,占空比为的方波,的默认值为50%。利用该函数,可得到幅值、频率、相位可调的方波信号函数如下式(2.4)所示, (2.4) 2.3 三角波

5、信号的实现在MATLAB中,可以用函数直接生成一个三角波信号,其函数原型为,该函数可生成一个周期为,峰值为,最大值出现在位置的三角波。利用该函数,可得到幅值、频率、相位可调的三角波信号函数如下式(2.5)所示, (2.5)2.4 锯齿波信号的实现将上述2.3节中函数中的参数值设为1,即可得到锯齿波。利用该函数得到的幅值、频率、相位可调的锯齿波信号函数如下式(2.6)所示, (2.6)2.5 白噪声信号的实现白噪声是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可借助于MATLAB中的函数,它的功能是产生一个均值为0,标准差为1的随机数列或矩阵,该函数有多种调用形式,下式(2.7)即可得到

6、一个均值为0,标准差为的维的随机矩阵。 (2.7) 其中,为幅值;。2.6 脉冲信号的实现考虑到脉冲信号与方波信号波形相似,故以方波信号函数函数为基础,将函数值加1,即可得到最大值为2,最小值为0的脉冲波形,原函数的参数可以用来调节脉冲的宽度。利用该函数,得到的幅值、频率、相位可调的脉冲信号函数如下式(2.8)所示, (2.8) 2.7 阶跃信号的实现阶跃信号的数学表达式如下式(2.9)所示, (2.9) 将上式用MATLAB程序语言转换一下,即可得阶跃信号函数如下式(2.10)所示, (2.10)2.8 斜坡信号的实现斜坡信号的数学表达式如下式(2.11)所示, (2.11) 其中,为斜坡的

7、斜率。将上式中的时间离散化后,即可得到斜坡信号的数字信号函数。2.9 简易电子琴的实现数字电子琴的功能是基于数字信号发生器的,通过调用数字信号发生器产生一系列指定的频率的声音,从而达到虚拟的电子琴的功能。设计界面中包含A、B、O共15个琴键,每个按键对应一个频率的正弦波信号,各按键对应的信号频率分别为131、147、165、175、196、220、247、262、294、330、349、392、440、494、523Hz。当用鼠标按下对应的键时即可发出相应频率的声音。声音的大小可由滑动条进行调节。最后,利用电子琴发声原理做了一首简单的生日歌。3 MATLAB程序设计3.1 图形界面设计首先打开

8、MATLAB,在命令窗口中输入guide命令进入GUI图形设计界面。再新建一个空白的图形界面文件,添加如下的控件并设计它们的布局。(1) 添加1个axes控件,用于显示波形;(2) 添加10个static text控件,用于窗口及其他控件的说明使用;(3) 添加3个panel控件,将一组相关的控件框在一起;(4) 添加4个slider 控件,其中3个用于输入信号的幅值、频率、相位参数值,另1个用于调节电子琴的音量;(5) 添加3个edit text控件,用于输入和显示幅值、频率和相位参数值;(6) 添加28个push button控件,其中8个用于控制输出8种相应的信号波形,4个用于控制放大和

9、缩小坐标系中显示的波形图形的大小,15个用于控制输出电子琴的15个音符,最后1个控制输出一首简单的生日歌。双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大小、初始值及位置等属性。最终编辑好的界面如下图所示:3.2 MATLAB编程当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。回调函数即在一定的操作下自动执行的指令代码。信号发生器相关的控制控件有幅值、频率和相位的输入控件:滑动条和编辑框;显示对应波形的按钮以及放大和缩小显示图形的按钮。下面以正弦波信号发生器为例,依

10、次介绍各类功能控件回调函数的编写。(1)以幅值输入为例,说明将滑动条和编辑框关联起来,都作为波形的参数输入的方法。实现的代码及说明如下:% - Executes on slider movement.function slider_amplitude_Callback(hObject, eventdata, handles)w=get(hObject,'value');set(handles.edit_amplitude,'string',num2str(w);上面代码为幅值对应的滑动条的回调函数,第一句获取滑动条的值,第二句将获取到的值转换输出到编辑框中。fu

11、nction edit_amplitude_Callback(hObject, eventdata, handles)v=get(hObject,'string');set(handles.slider_amplitude,'value',str2double(v); 上面代码为幅值对应的编辑框的回调函数,第一句获取编辑框的值,第二句将获取到的值转换输出给滑动条。(2)以正弦波的显示为例,说明生成并显示正弦波的方法。实现的代码如下:function pushbutton_sine_Callback(hObject, eventdata, handles)a=st

12、r2double(get(handles.edit_amplitude,'String');f=str2double(get(handles.edit_frequency,'String');q=str2double(get(handles.edit_phase,'String');Ts=4.0/f; % 设定默认显示周期if f<2000 % 设定采样率 fs=44100;else fs=30*f;endt=0:1/fs:1.0; % 设定采样时间y=a*sin(2*pi*(f*t+q/360);plot(t,y);xlabel('

13、;Time: s','fontweight','bold');ylabel('Voltage: V','fontweight','bold');wavplay(y,fs,'async'); % 播放生成的信号grid on;axis(0,Ts,-(a+1),(a+1);上面代码为正弦波生成和显示对应按钮的回调函数。首先利用get函数获取编辑框中的参数值,然后设置采样率,并将时间和对应正弦函数值离散化,最后用plot函数输出到坐标系中。(3)以X轴图形放大为例,说明放大坐标系中图形的方法。实现

14、的代码如下:function pushbutton_xup_Callback(hObject, eventdata, handles)x=get(handles.axes1,'xlim');temp=x(1);x(1)=(3*x(1)+x(2)/4;x(2)=(3*x(2)+temp)/4;set(handles.axes1,'xlim',x);上面代码为X轴图形放大功能按钮的回调函数。首先利用get函数获取到X轴显示区间数组值,然后将获取到的区间缩小为原区间的一半大小,最后利用set函数重新设置X轴的显示区间数组值。4 波形显示(1) 正弦波(2) 方波(3)

15、 三角波(4) 锯齿波(5) 白噪声(6) 脉冲信号(7) 阶跃信号(8) 斜坡信号(9) 电子琴声音信号5 存在的问题由于本人之前只用过C和C+语言进行程序设计,对MATLAB比较陌生。这次也是初次使用MATLAB的GUI模块,在用MATLAB语言进行程序设计的过程中,由于受到C语言语法的影响,出现了很多错误。但经过查阅资料后,得到了解决,并发现了MATLAB语言与C语言的差异。设计过程中遇到的主要问题有:(1) 对MATLAB语言语法的不熟悉,造成了一些错误。比如:MATLAB中的数组元素标号是从1开始,而不是从0开始;当数组元素较多需要换行时,不能直接换行,而要用“”符号进行续行;还有f

16、or、switch等语句的语法不同等。(2) MATLAB中的GUI界面与VC+中MFC对话框界面操作不同,导致在添加和编辑控件时由于不够美观,往往需要先删除再重复添加,效率很低;(3) 由于自己对MATLAB的语法以及其函数库不熟悉,导致自己的一些编程思路无法用MATLAB语言实现,然后只好换一种思路,浪费了一些时间。(4) 在进行GUI界面设计时,由于对MATLAB程序不熟以及时间有限,一些可以更加美化界面的想法还不会用MATLAB实现,比如:添加漂亮的旋钮控件等。(5) 在进行简易数字电子琴的设计时,由于对音乐乐谱的认识很浅,不能很好的理解音乐的音色、音调以及节拍等知识,导致最终制作出得

17、生日歌,在音色和节拍上可能存在问题。6 结束语本文通过对数字信号发生器常用几种信号波形进行分析,并用MATLAB中提供的函数实现了八种信号波形的生成和显示。通过GUI模块进行界面设计,最终程序运行的结果非常好。完全实现了设计的任务要求。该程序可以作为数字信号处理课程的演示程序,或者作为MATLAB的应用程序。致 谢通过本设计使我对工程数字信号处理算法与实践这门课有了更直观的认识。通过理论结合实践,既加深了我们对理论知识的理解,同时又提高了我们的实际动手应用的能力。在课程的学习过程中,何岭松老师一直强调要以提高学生的能力为目的。何老师设置的课程任务开放性很强,每个人都可以有自己的设计思想。这样就可以激发每个人的能动性和创造性。在设计过程中,遇到的所有问题都需要自己通过各种途径想

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论