基于MATLAB的数字电子琴的设计与实现

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

电子信息工程学院

《DSP技术及应用》课程设计报告

题目:基于MATLAB的数字电子琴的设计与实现专业班级:通信工程专业

二〇一三年六月十三日

目录

一、设计目的 (1)

二、设计要求 (1)

三、设计原理及方案 (2)

四、软件流程 (2)

五、调试分析 (5)

六、设计总结 (6)

七、参考文献 (6)

一、设计目的

1、熟悉matlab的软件环境,掌握信号处理的方法,能在matlab的环境下完成对信号的基本处理;

2、学会使用matlab的GUI控件编辑图形用户界面;

3、了解matlab中一些常用函数的使用及常用运算符,并能使用函数完成基本的信号处理;

二、设计要求

数字电子琴的功能是基于数字信号发生器的,通过条用数字信号发生器产生一系列指定的频率的声音,从而达到虚拟的电子琴的功能。具体功能如下:

1、界面中包含do/rai/mi…共7个琴键,鼠标按下时即时发声0.5秒;并可通过键盘敲击按键进行琴音播放;

2、可播放wav格式文件;

3、进行图形绘制,可选择输出方波、正弦波等;

4、将该正弦信号函数使用plot函数将正弦函数图形界面展示出来;

5、根据所取的取样的时间长度不同时每个音阶发出的声音长度不同;

6、通过每个按键关联键盘,实现键盘弹琴功能;

7、通过一个edit窗口,关联按键,是GUI界面可显示所按下按键的音阶;

8、通过添加播放与暂停按钮,可对edit窗口中的音阶进行播放的暂停操作;

9、GUI右上角有帮助菜单,弹出messagebox提示用户;

10、不同音调的选择,可选择C调,升C调等不同音调;

11、通过加入不同程度的衰减和谐波分量实现不同音色的选择;

12、加载本地电脑中以存储好的音符文档进行演奏的功能;

13、当弹奏出错时,将刚弹奏出错的音符删除的功能;

14、可以实现黑键半音功能。

三、设计原理及方案

1、原理图

图1

2、原理图说明

上图为数字信号产生器的原理图,由于不同声音的频率不同,因此,用MATLAB产生不同的频率的信号,然后加载到声卡,即可产生不同的声音

(1)初始化:点击其中一个.M文件。进入欢迎界面,欢迎界面,点击欢迎界面中进入程序按钮,进入主程序。

(2)检测并接收用户输入:通过点击GUI界面中预设值好的音阶按钮,对应让

MATLAB中产生不同频率的正弦单频信号。

(3)存用户输入的音阶:用户输入音阶后,在GUI 窗口中会有对应的音符显示,点击保存,即可将这些字符保存为一个,txt文件。

(4)加载音阶:选择打开加载音符,点击暂停播放,即可将之前保存好的音符进行播放。

(5)产生数字信号:对应不同的按键产生不同的正弦数字信号。

(6)波形线束:通过不同的信号,画出不同的信号的时域与频域图。

(7)驱动声卡:发出声音。

四、软件流程

Matlab是一个具有数值分析、科学数据可视化以及非线性动态系统的建模和仿真等功能的工程实用软件。本文介绍了一种使用GUI工具箱,用Matlab实现虚拟数字信号发生器的设计。并在此基础上,利用声卡,实现了简易的数字电子琴。

具体软件流程如下:

(1)搭建GUI界面

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。Matlab环境下的图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象(Objects)构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化。做好的GUI界面分别如图2、图3所示:

图2

图3

(2)编写.M文件

搭建好GUI界面后,点击“保存”按钮,系统将自动生成M文件与Fig文件各一个,并且M文件内部已经按照GUI界面中组件的类别,分别自动生成了相应的模块调用函数。根据需需要,我们对生成的各个函数进行补充,完成函数功能的实现及各个函数的调用关系。

本次实验主要对控件的回调函数(callback)下写入相应的程序,该程序相当于一个将前后面板连接起来的纽带,在数字信号生成中作用很大。

主要源程序文件如下:

信号产生部分:

global n

global m;

global yc;

b=[-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1 6,17,18,19,20,21,22,23,24,25,26]

c=b(t);

f=440*2^((c+m)/12);%C调 D调改变m

fs=10*f

x=0:(1/fs):yc

switch yc

case 0.25

d=-4

case 0.5

d=-2

case 1

d=-2

switch n

case 3

y=exp(d*x).*sin(2*pi*f*x)+0.2*exp(d*x).*sin(2*pi*f*3*x)+0.3*exp(d*x). *sin(2*pi*f*3*x)+0.4*exp(d*x).*sin(2*pi*f*4*x)+0.5*exp(d*x).*sin(2*pi *f*5*x)

case 1

y=sin(2*pi*f*x)

case 2

y=exp(d*x).*sin(2*pi*f*x)

end

绘图部分:

subplot(2,1,1)

plot(x,y);

axis([0,yc,-2,2])

xlabel('时间/s')

ylabel('幅度')

grid on;

subplot(2,1,2)

Y=abs(fft(y))

plot(Y)

xlabel('频率/Hz')

ylabel('幅度')

grid on

%axis([0,yc,-2,2]);

wavplay(y,fs,'async');

五、调试分析

在软件设计过程中遇到了许多困难,以下选择几点主要的进行分析说明:

1、校徽的显示问题:由于本作品想添加校徽,创建了一个axes坐标,但是始终在该坐标上无法显示我们预设好的校徽图片。

解决方案:在图片显示子函数imshow后加上要显示的坐标,即可将图片显示在于设置的坐标上。

2、音阶的保存:将输入的音符进行保存为txt文本文件时,保存时是按字符串格式保存的,再次加载时,却是按照字符进行加载,到时要回删一个音阶时,将之前所有以保存的音阶会全部删除。

解决方案:读数据时,使用大括号,使数据为一个cell型数组。

3、GUI背景设置问题:为了美化界面,我们想到使用背景图片,但是由于MATLAB中没有该加载背景图片的功能,因此始终无法加载图片

解决方案:经过上网搜寻方案,想到在GUI界面中建一个坐标覆盖整个界面,然后图片加载到该坐标中,使bring back功能将该图片作为背景。

4、在EDIT窗口中显示字符问题:开始设想在一个EDIT窗口中实时显示按下的音阶,但是始终无法实现该功能

解决方法:使用MATLAB中的set与get函数,最终的以实现。

相关文档
最新文档