信号处理课设,电子琴信号发生器的设计)_第1页
信号处理课设,电子琴信号发生器的设计)_第2页
信号处理课设,电子琴信号发生器的设计)_第3页
信号处理课设,电子琴信号发生器的设计)_第4页
信号处理课设,电子琴信号发生器的设计)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、 摘 要这次课设我们做的是电子琴信号发生器,电子琴信号发生器是利用MATLAB的GUI工具,设计出虚拟数字信号发生器。每个音节均对应一个特定频率的信号,通过调用数字信号发生器产生一系列指定的频率的声音,实现虚拟电子琴的功能。这次主要做了GUI电子琴界面,产生正弦波、余弦波、方波、三角波、锯齿波、白噪声的虚拟数字信号发生器,频谱分析。关键词:数字信号发生器;简易电子琴;MALTAB软件 目 录前 言1一 设计原理21.1 GUI界面搭建21.2数字信号发生器设计原理21.3 离散傅立叶变换(DFT)31.4快速傅立叶变换(FFT)31.5电子琴原理4二 详细设计52.1 GUI界面设计52.2

2、正弦信号的实现52.3方波信号的实现62.4三角波信号的实现62.5锯齿波信号的实现62.6白噪声信号的实现62.7 MATLAB编程7三 仿真结果9总 结13参考文献14附 录15致 谢22 前 言 随着信息时代和数字世界的到来,数字信号处理己成为当今一门极其重要的学科和技术领域,数字信号处理在通信、语音、图像、自动控制、医疗和家用电器等众多领域得到了广泛的应用,数字信号处理主要用的是MATLAB软件。 MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件。可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语

3、言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。MATLAB自带了强大的GUI工具1。在本文中,将利用MATLAB的GUI工具,设计出数字信号发生器和数字电子琴。 本文设计了一种可以产生正弦波、余弦波、方波、三角波、锯齿波、白噪声的虚拟数字信号发生器。在音乐世界中,每个音阶均对应一个特定频率的信号,通过调用数字信号发生器产生一系列指

4、定的频率的声音,可以实现虚拟的电子琴的功能。界面中包含1、2、3、4、5、6、7共 7 个基础琴键,鼠标按下时即发声,松开时发声停止。同时能够产生正弦波、余弦波、方波、三角波等常见的波形的数字信号,然后将数字信号写入声卡的缓冲区,由声卡播放出相应的声音2。已知音乐的七个音阶的主频率分别是131Hz、147Hz、165Hz、175Hz、196Hz、220Hz和247Hz。 设计虚拟数字信号发生器和数字电子琴,可以加深对信号处理概念的理解,且成本低,易于实现,容易修改,并可以进行仿真。该设计的进行可以为我们以后的学习工作奠定一定的基础。一 设计原理1.1 GUI界面搭建 图形用户界面(Graphi

5、cal User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受3。 MATLAB环境下的图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象(Objects)构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。MATLAB的用户,在指令窗中运行demo 打开那图形界面后,只要用鼠标进行选择和点击, 就可产生丰富的内容。 1.2数字信号发生器设计原理把一般的正弦波、方波、三角波、锯齿波等波

6、形进行采样,实现离散化,离散时间的间隔是均匀的,以表示。的值由信号的采样频率fs决定。为保证采样后信号能真实地保留原始模拟信号信息,信号采样频率必须至少为原信号中最高频率成分的2倍。时域抽样定理给出了连续信号抽样过程中信号不失真的约束条件:对于基带信号,信号抽样频率 大于等于2倍的信号最高频率 ,即 。时域抽样是把连续信号 变成适于数字系统处理的离散信号 。对连续信号 以间隔T抽样,则可得到的离散序列为 。 图1-1 连续信号抽样的离散序列若 ,则信号 与 的频谱之间存在: (1-1) 其中: 的频谱为 , 的频谱为 。可见,信号时域抽样导致信号频谱的周期化。 (rad/s)为抽样角频率, 为

7、抽样频率。数字角频率与模拟角频率的关系为:=T。 最后将采样后生成的正弦信号、方波信号、三角波信号、锯齿波信号、白噪声信号调用用sound(y)函数运行,发出声音,就可以制作数字信号发生器。1.3 离散傅立叶变换(DFT)有限长序列的离散傅立叶变换(DFT)为(1-2) 逆变换为(1-3) 1.4快速傅立叶变换(FFT)频谱分析用傅立叶变换将波形x(t)变换为频谱X(f),从另一角度来了解信号特征。常见傅里叶变换有DFT和FFT4。DFT是FFT的基础, FFT是DFT的快速算法,在MATLAB中可以利用函数FFT来计算序列的离散傅里叶变换DFT。FFT是时域和频域转换的基本运算。在各种信号序

8、列中,有限长序列占重要地位。对有限长序列可以利用离散傅立叶变换(DFT)进行分析。DFT不但可以很好的反映序列的频谱特性,而且易于用快速算法(FFT)在计算机上进行分析。有限长序列的DFT是其Z变换在单位圆上的等距离采样,或者说是序列傅立叶的等距离采样,因此可以用于序列的谱分析。FFT是DFT的一种快速算法,它是对变换式进行一次次分解,使其成为若干小数据点的组合,从而减少运算量。FFT函数调用方式:1. Y=FFT(X)2.YFFT(X,N)3.YFFT(X,dim)或YFFT(X,N,dim)函数IFFT的参数应用与函数FFT完全相同。1.5电子琴原理 图1-2电子琴琴键及对应频率电子琴的每

9、个音阶均对应一个特定频率的信号,通过调用数字信号发生器产生一系列指定的频率的声音,从而达到虚拟的电子琴的功能。界面中包含1、2、7共 7 个基础琴键,鼠标按下时即发声,松开时发声停止。 同时能够产生正弦波、方波、三角波等常见的波形的数字信号,然后将数字信号写入声卡的缓冲区,最后由声卡播放出相应的声音。具体琴键的固定频率见图1-2所示。二 详细设计2.1 GUI界面设计 图2-1 虚拟电子琴界面首先打开MATLAB,在命令窗口中输入guide命令进入GUI图形设计界面。再新建一个空白的图形界面文件,添加如下的控件并设计它们的布局。u 添加2个axes控件,用于显示时域波形图和频域频谱图;u 添加

10、6个static text控件,用于窗口及其他控件的说明使用;u 添加4个panel控件,将一组相关的控件框在一起;u 添加3个edit控件,用于输入和显示幅值、频率等参数值;u 添加3个slider控件,用于滑动改变幅值、频率等参数值。u 添加24个push button控件,其中14个用于白键,10个用于黑键。u 添加6个radio button控件,用于波形的选择。 双击各个控件,打开其属性编辑窗,即可修改其名称、颜色、大小、初始值及位置等属性。最终编辑好的界面如图2-1所示。2.2 正弦信号的实现 正弦波信号的数学表达式如下式(2-1)所示 (2-1) 其中:为幅值;为频率;为相位。

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

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

13、中,为幅值;。2.7 MATLAB编程 图2-2 设计流程搭建好GUI界面后,点击“保存”按钮,系统将自动生成M文件与Fig文件各一个,并且M文件内部已经按照GUI界面中组件的类别,分别自动生成了相应的模块调用函数。根据需需要,我们对生成的各个函数进行补充,完成函数功能的实现及各个函数的调用关系。本次课设主要对控件的回调函数(callback)下写入相应的程序5,该程序相当于一个将前后面板连接起来的纽带,在数字信号生成中作用很大。当界面控件及布局创建完成以后,点击运行即可自动生成包含各控件回调函数在内的m文件。MATLAB对于输入框、按钮及滑动条等控件的响应都是通过自动调用相应的回调函数来实现

14、的。具体编程程序见附录。回调函数即在一定的操作下自动执行的指令代码。信号发生器相关的控制控件有幅值、频率和相位的输入控件:滑动条和编辑框;显示对应波形的按钮以及放大和缩小显示图形的按钮。下面以正弦波信号发生器为例,依次介绍各类功能控件回调函数的编写。 (1)以幅值输入为例6,说明将滑动条和编辑框关联起来,都作为波形的参数输入的方法。实现的代码及说明如下:% - Executes on slider movement.function slider_amplitude_Callback(hObject, eventdata, handles)w=get(hObject,'value

15、9;);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); 上面代码为幅值对应的编辑框的回调函数,第一句获取编辑框的值,第二句将获取到的值转

16、换输出给滑动条。(2)以正弦波的显示为例7,说明生成并显示正弦波的方法。实现的代码如下: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

17、<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('Time: s','fontweight','bold');ylabel('Voltage: V','fontweight','bold');wavplay(y,fs,'async'); % 播放生成的信号grid on;axis(0,Ts,-(a+1),(a+1);上面代

18、码为正弦波生成和显示对应按钮的回调函数。首先利用get函数获取编辑框中的参数值,然后设置采样率,并将时间和对应正弦函数值离散化,最后用plot函数输出到坐标系中。三 仿真结果 正弦波此时的幅值为2V,频率为660Hz的正弦波的时域波形波形及频域波形如图3-1所示。幅值、频率和相位都可通过滑动条改变。 图3-1正弦波的时域图及频域图 幅值为1V,频率为400Hz的方波的时域波形及频域波形如图3-2所示。 图3-2方波的时域图及频域图 幅值为1V,频率为300Hz的三角波的时域波形波形及频域波形如图3-3所示。 图3-3三角波的时域图及频域图 幅值为2V,频率为660Hz的锯齿波的时域波形波形及频

19、域波形如图3-4所示。图3-4锯齿波的时域图及频域图 幅值为1V,频率为660Hz的白噪声波的时域波形波形及频域波形如图3-5所示。图3-5白噪声的时域图及频域图 以正弦波为例,第一个白色琴键的时域波形图及频域波形图如图3-6所示。第一个白色键的固定频率为659.25Hz,其余白键都类似,不再具体分析。图3-6白键的时域图及频域图 以正弦波为例,第一个黑键的时域波形及频域波形如图3-7所示,第一个黑键的固定频率为622.25Hz,其余黑键都类似,这里不予以再多余分析。 图3-7黑键的时域图及频域图总 结电子琴信号发生器是利用MATLAB的GUI工具,GUI是指采用图形方式显示的计算机操作用户界

20、面,设计出虚拟数字信号发生器。数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器。在工程实践中需要检测和分析的各种复杂信号均可分解成各种简单信号之和,而这些简单信号皆可由数字信号发生器模拟产生,因此它在工程分析和实验教学中有着广泛的应用。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用。在此基础上实现简易的数字电子琴。每个音节均对应一个特定频率的信号,通过调用数字信号发生器产生一系列指定的频率的声音,实现虚拟电子琴的功能。这次主要做了GUI电子琴界面,产生正弦波、余弦波、方波、三角波

21、、锯齿波、白噪声的虚拟数字信号发生器以及用FFT变换进行频谱分析8。通过本次设计的数字信号发生器加深对数字信号处理课程的理解,具有一定的借鉴应用价值。,不仅可以掌握所学的有关知识,还可以锻炼综合运用知识的能力。设计过程中老师主要锻炼我们的自主能力,我们查阅资料的同时,当遇到不解的时候,老师的不吝指导,我的课程设计才得以在规定的时间内高效完成。通过这次课程设计,我学会很多,也收获了很多,深入的理解了数字信号发生器的原理及实现方法,对课本上的知识有了深入理解,同时对MATLAB软件有了更进一步掌握,对GUI界面有了深入的了解,加强了我的自主能力、动手能力和独立思考、团结协作的能力。参考文献1 丁玉

22、美. 数字信号处理M. 西安电子科技大学出版社,2003,3.2 张志涌等.精通MatlabM.北京:北京航空航天大学出版社,2003.3 车子萍.基于Matlab的虚拟信号发生器设计J.电脑学习,2010,1.4 万永革. 编著. 数字信号处理的MATLAB实现M. 科学出版社, 2007.5 刘波, 文忠, 曾涯. 编著. MATLAB信号处理M. 电子工业出版社, 2006.6 刘敏. MATLAB 通信仿真与应用M. 北京:国防工业出版社.7 MATLAB信号处理相关书籍、网络资源. 8 李益华. MATLAB辅助现代工程数字信号处理(第2版). 西安:西安电子科技大学出版社,2010

23、附 录*产生正弦波*function radiobutton1_Callback(hObject, eventdata, handles)% hObject handle to radiobutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');f=str2num(get(handl

24、es.a2,'String');d=str2num(get(handles.a3,'String'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*sin(f*pit+d); %产生正弦波 axes (handles.axes1); plot(t,y); % 画出正弦波时域波形 title('时域图 '); xlabel('t'); ylabel('y'); axis(0,.01,-2,2) axes (handles.axes2); f=fft(y,1024);

25、 %做快速傅里叶变换 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 radiobutton2_Callback(hObject, eventdata, handles)% hObject handle to radiobutton2 (see GCBO)% event

26、data reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');f=str2num(get(handles.a2,'String');d=str2num(get(handles.a3,'String'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*cos

27、(f*pit+d); %产生余弦波 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('频域图

28、9;); xlabel('w'); ylabel('F(w)'); sound(y); %播放声音*产生方波*function radiobutton3_Callback(hObject, eventdata, handles)% hObject handle to radiobutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A

29、=str2num(get(handles.a1,'String');f=str2num(get(handles.a2,'String');d=str2num(get(handles.a3,'String'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*square(f*pit+d); %产生方波 axes (handles.axes1); plot(t,y); % 画出方波时域波形 title('时域图'); xlabel('t'); ylabel('y

30、'); 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 radiobutton4_Callback(hObject, eventdata

31、, handles)% hObject handle to radiobutton4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');f=str2num(get(handles.a2,'String');d=str2num(get(handles.a3,'Strin

32、g'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*sawtooth(f*pit+d,0.5); %产生三角波 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-5

33、12)/512; F=abs(f1(513:1024); plot(w,F); %画出三角波频域波形 title('频域图'); xlabel('w'); ylabel('F(w)'); sound(y); %播放声音*产生三角波*function radiobutton5_Callback(hObject, eventdata, handles)% hObject handle to radiobutton5 (see GCBO)% eventdata reserved - to be defined in a future version o

34、f MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');f=str2num(get(handles.a2,'String');d=str2num(get(handles.a3,'String'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*sawtooth(f*pit+d,1); %产生锯齿波 axes (handles.axes1); plot

35、(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)

36、9;); sound(y); %播放声音*产生锯齿波*function radiobutton6_Callback(hObject, eventdata, handles)% hObject handle to radiobutton6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');f=

37、str2num(get(handles.a2,'String');d=str2num(get(handles.a3,'String'); Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*randn(size(t); %产生锯齿波 axes (handles.axes1); plot(t,y); % 画出锯齿波时域波形 title('时域图'); xlabel('t'); ylabel('y'); axis(0,.01,-2,2) axes (handles.axes2

38、); 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 pushbutton40_Callback(hObject, eventdata, handles)% hObject handle to pushbutton40

39、 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');d=str2num(get(handles.a3,'String');f=659.25; Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*sin(f*pit+d); %产生正弦

40、波 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('

41、;w'); ylabel('F(w)'); sound(y); %播放声音*第2个白琴键*function pushbutton41_Callback(hObject, eventdata, handles)% hObject handle to pushbutton40 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)A=str2num(get(handles.a1,'String');d=str2num(get(handles.a3,'String');f=587.33; Fs=8000; t=(0:2000)/Fs; %设定采样时间 pit=2*pi*t; y=A*sin(f*pit+d); %产生正弦波 axes (handles.axes1);

温馨提示

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

评论

0/150

提交评论