为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于MATLAB的数字信号发生器及简易电子琴设计

2017-10-15 12页 doc 197KB 222阅读

用户头像

is_435706

暂无简介

举报
基于MATLAB的数字信号发生器及简易电子琴设计基于MATLAB的数字信号发生器及简易电子琴设计 摘 要 数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器。在工程实践中需要检测和分析的各种复杂信号均可分解成各种简单信号之和,而这些简单信号皆可由数字信号发生器模拟产生,因此它在工程分析和实验教学中有着广泛的应用。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用。本文介绍了一种使用MATLAB建立一个简单数字信号发生器的基本流程,并详细叙述了简单波形(正弦波、方...
基于MATLAB的数字信号发生器及简易电子琴设计
基于MATLAB的数字信号发生器及简易电子琴设计 摘 要 数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器。在实践中需要和分析的各种复杂信号均可分解成各种简单信号之和,而这些简单信号皆可由数字信号发生器模拟产生,因此它在工程分析和实验教学中有着广泛的应用。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用。本文介绍了一种使用MATLAB建立一个简单数字信号发生器的基本,并详细叙述了简单波形(正弦波、方波、三角波、锯齿波、白噪声、脉冲、阶跃、斜坡)信号的具体实现方法。最后,利用简单的正弦波信号和PC的声卡设计了一个简易电子琴。 关键字:MATLAB,数字信号发生器,简易电子琴 1 概述 随着计算机技术和测试技术的不断发展,传统的测试仪器正向虚拟化方向发展,特别是在试验教学领域。虚拟仪器作为现代仪器技术和计算机技术深层次结合的产物,更是得到了广泛应用。信号发生器 原本是模拟电子技术发展的产物,但本文设计出的数字信号发生器是基于计算机软硬件实现的数字信号发生器,是一种虚拟仪器。 2 设计原理 常用的数字信号发生器一般可产生正弦信号、方波信号、三角波信号、锯齿波信号、白噪声信号、脉冲信号、阶跃信号、斜坡信号等。此时的数字信号又可称为离散信号,即时间为离散变量的信号。它只在离散时间上给出函数值,是时间上不连续的“序列”。离散时间的间隔是均匀的,以表示。的值由信号的采样频率决定。为保证fs,t,t 采样后信号能真实地保留原始模拟信号信息,信号采样频率必须至少为原信号中最高频率成分的2倍。这是采样的基本法则,称为采样定理。本文为了使产生的数字信号更接近原始的模拟信号,采用的采样频率为原始信号频率的30倍。 MATLAB程序提供了常用的各种基本信号的生成函数。本设计需模拟的八种信号大部分都直接使用了MATLAB提供的函数,只有少数几个信号没有调用函数,直接编写的。为了模拟信号发生器的设置,本设计也将常用信号的幅值、频率、相位设计成可调的。 2.1 正弦信号的实现 正弦波信号的数学表达式如下式(2.1)所示, yAft,,sin2,,(2.1) ,, A其中:为幅值;为频率;为相位。 f, 在MATLAB中,将时间变量离散化并构造成一个一维数组,如下式(2.2)所示, (2.2) tfs,0:1/:1.0 其中:为采样频率。 fs 相应的正弦波信号的数字信号表达式如下式(2.3)所示, (2.3) yntAfnt()sin2,,,,,,,, 幅值、频率、相位参数可以由用户界面上的滑动条或编辑框输入。在分别得到与y的离散值后,用plot作图函数即可获得波形显示。 t 2.2 方波信号的实现 在MATLAB中,可以用square函数直接生成一个方波信号,其函数 ,1原型为,该函数可生成一个周期为,峰值为,占ysquaretduty,,2,,, 空比为的方波,的默认值为50%。 dutyduty 利用该函数,可得到幅值、频率、相位可调的方波信号函数如下式(2.4)所示, (2.4) yAsquareft,,(2),, 2.3 三角波信号的实现 在MATLAB中,可以用函数直接生成一个三角波信号,其sawtooth 函数原型为ysawtoothtwidth,,,该函数可生成一个周期为,峰值为2,,, ,1,最大值出现在位置的三角波。 2,,width 利用该函数,可得到幅值、频率、相位可调的三角波信号函数如下式(2.5)所示, (2.5) yAsawtoothft,,2,0.5,,,, 2.4 锯齿波信号的实现 将上述2.3节中函数中的参数值设为1,即可得到sawtoothwidth 锯齿波。利用该函数得到的幅值、频率、相位可调的锯齿波信号函数如下式(2.6)所示, (2.6) yAsawtoothft,,2,1,,,, 2.5 白噪声信号的实现 白噪声是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可借助于MATLAB中的函数,它的功能是产生一个均值为0,randn 标准差为1的随机数列或矩阵,该函数有多种调用形式,下式(2.7)即可得到一个均值为0,标准差为的维的随机矩阵。 afs (2.7) yArandnsizet,,,,, A其中,为幅值;。 tfs,1:1/:1.0 2.6 脉冲信号的实现 square考虑到脉冲信号与方波信号波形相似,故以方波信号函数函数为基础,将ysquaretduty,,函数值加1,即可得到最大值为2,,, 最小值为0的脉冲波形,原函数的参数可以用来调节脉冲的宽度。 duty 利用该函数,得到的幅值、频率、相位可调的脉冲信号函数如下式(2.8)所示, yAsquareft,,,((2,1)1)/2,,(2.8) 2.7 阶跃信号的实现 阶跃信号的数学表达式如下式(2.9)所示, yttt()0,,,0 (2.9) ytAtt(),,,0 将上式用MATLAB程序语言转换一下,即可得阶跃信号函数如下式(2.10)所示, (2.10) ytttAtt()0,,,,,,,,00 2.8 斜坡信号的实现 斜坡信号的数学表达式如下式(2.11)所示, (2.11) ytkt(), 其中,为斜坡的斜率。将上式中的时间离散化后,即可得到斜坡信k 号的数字信号函数。 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 图形界面设计 首先打开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个用于控制放大和缩小坐标系中显 示的波形图形的大小,15个用于控制输出电子琴的15个 音符,最后1个控制输出一首简单的生日歌。 双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大小、初始值及位置等属性。最终编辑好的界面如下图所示: 3.2 MATLAB编程 当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现的。 回调函数即在一定的操作下自动执行的指令代码。信号发生器相关的控制控件有幅值、频率和相位的输入控件:滑动条和编辑框;显示对应波形的按钮以及放大和缩小显示图形的按钮。下面以正弦波信号发生器为例,依次介绍各类功能控件回调函数的编写。 (1)以幅值输入为例,说明将滑动条和编辑框关联起来,都作为波形的参数输入的方法。实现的代码及说明如下: % --- Executes on slider movement. function slider_amplitude_Callback(hObject, eventdata, handles) w=get(hObject,'value'); set(handles.edit_amplitude,'string',num2str(w)); 上面代码为幅值对应的滑动条的回调函数,第一句获取滑动条的值,第二句将获取到的值转换输出到编辑框中。 function 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=str2double(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; end t=0:1/fs:1.0; % 设定采样时间 y=a*sin(2*pi*(f*t+q/360)); plot(t,y); xlabel('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轴图形放大为例,说明放大坐标系中图形的方法。实现的代码如下: 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) 三角波 (4) 锯齿波 (5) 白噪声 (6) 脉冲信号 (7) 阶跃信号 (8) 斜坡信号 (9) 电子琴声音信号 5 存在的问题 由于本人之前只用过C和C++语言进行程序设计,对MATLAB比较陌生。这次也是初次使用MATLAB的GUI模块,在用MATLAB语言进行程序设计的过程中,由于受到C语言语法的影响,出现了很多错误。但经过查阅资料后,得到了解决,并发现了MATLAB语言与C语言的差异。设计过程中遇到的主要问题有: (1) 对MATLAB语言语法的不熟悉,造成了一些错误。比如: MATLAB中的数组元素标号是从1开始,而不是从0开始; 当数组元素较多需要换行时,不能直接换行,而要用“…” 符号进行续行;还有for、switch等语句的语法不同等。 (2) MATLAB中的GUI界面与VC++中MFC对话框界面操作不 同,导致在添加和编辑控件时由于不够美观,往往需要先 删除再重复添加,效率很低; (3) 由于自己对MATLAB的语法以及其函数库不熟悉,导致自 己的一些编程思路无法用MATLAB语言实现,然后只好换 一种思路,浪费了一些时间。 (4) 在进行GUI界面设计时,由于对MATLAB程序不熟以及时 间有限,一些可以更加美化界面的想法还不会用MATLAB 实现,比如:添加漂亮的旋钮控件等。 (5) 在进行简易数字电子琴的设计时,由于对音乐乐谱的认识 很浅,不能很好的理解音乐的音色、音调以及节拍等知识, 导致最终制作出得生日歌,在音色和节拍上可能存在问题。 6 结束语 本文通过对数字信号发生器常用几种信号波形进行分析,并用MATLAB中提供的函数实现了八种信号波形的生成和显示。通过GUI模块进行界面设计,最终程序运行的结果非常好。完全实现了设计的任务要求。该程序可以作为数字信号处理课程的演示程序,或者作为MATLAB的应用程序。 致 谢 通过本设计使我对工程数字信号处理算法与实践这门课有了更直观的认识。通过理论结合实践,既加深了我们对理论知识的理解,同时又提高了我们的实际动手应用的能力。在课程的学习过程中,何岭松老师一直强调要以提高学生的能力为目的。何老师设置的课程任务开放性很强,每个人都可以有自己的设计思想。这样就可以激发每个人的能动性和创造性。在设计过程中,遇到的所有问题都需要自己通过各种途径想办法解决,这样就提高了解决问题的能力。何老师提倡的这种主动学习方式,为我们研究生阶段的科研能力培养打下了基础。因此,首先要感谢何老师和他的教学方式。 此外,在设计的完成过程中,由于本人对MATLAB工具不熟,实验室师兄和同学给予了我指导,在此一并表示感谢。 参考文献 [1] 李益华. MATLAB辅助现代工程数字信号处理(第2版). 西安: 西安电子科技大学出版社,2010 [2] 郑慧娟. 基于LabWindow/CVI虚拟信号发生器的设计与实现.电 子科技,2008 [3] 杨洁芳. 基于MATLAB与声卡的低频信号发生器的设计与实现. 电脑学习,2006
/
本文档为【基于MATLAB的数字信号发生器及简易电子琴设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索