matlab电子琴说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于MATLAB的数字

电子琴设计

日期:2011-3-25

姓名:王之海、郑俊超、张楠、杜坤

组号:第一组

1.目标与范围

随着计算机软硬件技术的发展,越来越多现实物品的功能能够由计算机实现。也就是我们经常所说的将硬件设备软件化,这样做的好处很多,比如说将成本降低,易于实现,修改容易并且可以进行仿真。现在比较成熟的这类软件有很多,比如说LABVIEW。基于这样的考虑我们进行了数字电子琴的模拟仿真实验。这样一个实验的进行会为以后的学习工作中奠定一定的基础。

2.信号处理原理

数字信号发生器的功能就是将数字信号通过D/A转换变成所需要的模拟信号。由于声卡本身具有D/A转换的功能,从而可以利用声卡在计算机了模拟信号发生器。

声卡的D/A转换机理是定时将声卡缓冲区中的内容转换成模拟信号并输出,所以软件所做的即是向声卡缓冲区中写数据。

以正弦信号为例,其模拟信号计算工时如下

为实现数字信号的发生,在程序中先根据公式计算出需要存放到缓冲区的数据,以数组的形式存放,然后将数据存放入声卡的缓冲区。

对于方波,y=sign(sin(2*pi*f*t+p))

对于其它波形,可以用类似方法实现。

数字电子琴的流程图

3.系统的功能分析

软件的功能由数字信号发生器和数字电子琴两部分组成。

(1)数字信号发生器的功能

能够产生正弦波、方波、三角波等常见的波形的数字信号,并且提供了图形界面用于选择波形、频率、幅值与相位。能够根据用户指定的波形和参数产生相应的数字信号,然后将数字信号写入声卡的缓冲区,最后由声卡播放出相应的声音。

(2)数字电子琴的功能

1)数字电子琴的功能是基于数字信号发生器的,通过条用数字信号发生器产生一系列指定的频率的声音,从而达到虚拟的电子琴的功能,界面中包含do/rai/mi…共16个琴键,鼠标按下时即时发声0.5秒;并可通过键盘敲击按键进行琴音播放。

2)可播放wav格式文件;

3)进行图形绘制;

4)进行背景色的更换;

5)添加(去除)网格、边框功能;

6)退出程序。

4.系统的界面设计

根据软件的功能需求,可设计如图所示的操作界面

电子琴的GUI界面

主要包括三个部分:第一为波形控制区,可进行波形等各种参数设置;第二是按键控制区,用于对各种按键进行操作;第三是绘图命令区,用于手动输入命令进行绘图,可以编制多种复杂命令追溯原音频率。第四是琴键区,包括从do到#do共16个音键;第五为背景颜色调整区,为下拉菜单,可对背景颜色进行选择。

5.系统的模块设计

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。

对GUI的模块进行如图所示的模块划分:

数字电子琴的模块划分

5.1键盘模块设计

后台程序设计

对每个对象进行回调函数的设计,首先介绍do~#do按钮的设计,先进行回调函数设计,满足在按下相应按钮时输入对应的频率。

16键盘模块的设计是在GUI的界面上,把键设计出来后,激活后自动生成的,只需要按照D/A要求进行代码的转换。例如对do键的程序设置为:

function do_Callback(hObject, eventdata, handles)

根据回到函数找到do键的主函数位置,然后由difsound函数

来进行编写,其格式为:

difsound(handles.option,264,handles.A,handles.phase);

其它键程序程序的编写都是基于这一原理进行编写的。在这里不在一一介绍。

5.1控制模块设计

控制模块的设计为在大模块的基础上进行波形、频率、幅值、相位以及默认值、开始按钮的添加,其原理与键的原理是一样的,也是通过callback函数来进行函数的编写。例如对波形的编写,可由callback来找到程序的位置,其程序为:

function option_Callback(hObject, eventdata, handles)

然后由get函数进行函数参数的调取为:

handles.option=get(hObject,'Value');

guidata(hObject,handles);

同样也是用这样的方法对频率、幅值、相位进行编写。

而对默认值的编写则是比较麻烦的,通过set函数来对默认值进行设置。其程序为:

set(handles.option,'Value',1);

set(handles.f,'String',10);

set(handles.A,'String',20);

set(handles.phase,'String',0);

handles.option=1;

handles.f=10;

handles.phase=0;

handles.A=20;

guidata(hObject,handles);

5.2波形选择功能

本程序是通过difsound函数来驱动声卡进行发音的,然后再通过switch…case…end语句来调取不同的波形,从而发出不同的声音。其程序为:

function difsound(option,A,phase,f)

Fs=44100;

t=0:1/Fs:0.5;

switch option

case 1

y=A*sin(2*pi*f*t+phase);

case 2

y=A*sign(sin(2*pi*f*t+phase));

case 3

y=A*sawtooth(2*pi*f*t+phase,0.5);

case 4

y=A*sawtooth(2*pi*f*t+phase);

case 5

y=A*(2*rand(size(t))-1);

otherwise

errordlg('please choose another one or set to the defalt first');

end

plot(t,y);

axis tight;

wavplay(y,Fs);

5.3键盘关联功能的实现

除了界面键盘区可以用鼠标点击操作来实现按键功能,我们还设计了用电脑键盘按键来实现触发动作。

使用的对应按键从Z至L程序如下:

function figure1_KeyPressFcn(hObject, eventdata, handles)

相关文档
最新文档