《 MATLAB 实践 》
课程设计
学生姓名: 林根在
学 号: 110800323
专业班级: 电子信息工程(3)班
指导教师: 郑晓明
二○一一年 6月26日
目 录
1.设计目的…………………………………………………1
2.题目分析…………………………………………………1
3.总体设计.............................................................................2
4.具体设计..............................................................................3
5.结果分析..............................................................................10
6.心得体会..............................................................................10
1、设计目的:运用MATLAB实现MATLAB的GUI程序设计。
2、题目分析:
课程设计题目:MATLAB GUI的音乐键盘仿真
课程设计的基本要求:
1)熟悉和掌握MATLAB 程序设计方法。
2)掌握MATLAB GUI 程序设计。
3)学习音乐合成基本知识。
设计分析:
这次使用的设计软件是MATLAB的GUI模块,要设计一个音乐键盘要知道一个最简单的键盘本身要有36个发音键,既21个音阶和15个辅音阶。于是就要在界面上画出36个pushbutton键,再根据其他要求的功能设计出其他相应的模块。
模拟键盘发音是使用音频函数soundsc将不同频率的函数以声音的模式表现出来,而每个音阶相差频率f=440*2^2/12;音阶与相应的辅音阶相差频率f=440*2^1/12。有了音乐合成的这些基本知识后便可根据自己需要设计界面根据功能编写相应的回调函数。
课程设计的内容:
学习MATLAB GUI程序设计,设计和实现一个音乐键盘仿真系统。要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。
1)设计音乐键盘GUI界面,实现单音键盘的发声。
2)实现键盘的双音多频,即每个键盘对应低音频组的一个频率和高音频组的一个频率,实现按键的发出双音。
3)能改变音乐包络形式,实现音型的改变。
4)能够演奏一段音乐。
3、总体设计
软件的总体设计框架和功能模块化分:
设全局变量,编写子函数,根据各个模块功能的需要编写相应的回调函数。模块一是各个子函数的书写,模块二是各个按键发音的子函数回调函数,模块三是单双音控制和波形控制回调函数的书写,模块四是波形显示回调函数的书写;第五模块是键盘控制回调函数;模块六是Text文档歌曲播放回调函数;Wav格式歌曲播放回调函数;Avi格式MV播放回调函数;这三个回调函数的书写。模块七是Wav格式歌曲暂停,继续,停止按键控制回调函数的书写。
整体软件结构如图所示:
4、具体设计:
外板设计图如下:
4.1:子函数DS(A):
function DS(A)
global Y;
global B;
global n;
global ff;
f=440*2^((A-49)/12);
n=0:1/8000:1;
if B==1
x=exp(-2*n);
elseif B==2
x=sin(-2*n);
elseif B==3
x=sign(sin(-2*n));
end
if Y==1
ff=x.*sin(f*2*pi*n)+0.5*x.*sin(f*4*pi*n);
elseif Y==0
ff=x.*sin(f*2*pi*n);
end
soundsc(ff);
hold off;
axes1_CreateFcn();
soundsc(ff); 实现将频率函数ff=x.*sin(f*2*pi*n);或者 ff=x.*sin(f*2*pi*n)+0.5*x.*sin(f*4*pi*n);作为音频信号发出声音,因为f=440*2^((A-49)/12);所以赋予不同的A值就可得到不同的频率发出不同的声音,同时x=exp(-2*n); x=sin(-2*n); x=sign(sin(-2*n)); 实现指数波,正弦波,方波等不同的包络改变声音的性质。
axes1_CreateFcn();实现将每个音的波形在axes1轴形坐标中画出来,调用的是波形显示回调函数:
global n;
global ff;
plot(n,ff);
axis([0 1 -1.2 1.2 ]);
如图所示:
4.2:例:function pushbutton1_Callback(hObject, eventdata, handles);
DS(28);
这是相应按键发音的函数,调用子函数DS(A);赋予不同的A值发出不同音阶;
4.3:控制波形的回调函数:
global B;
GZ=get(handles.uipanel2,'selectedobject');
LGZ=get(GZ,'tag');
switch LGZ
case 'zhishu'
B=1;
case 'zhengxian'
B=2;
case 'fangbo'
B=3;
otherwise
B=1;
end
由子函数DS(A)知道当B取不同值时x取相应不同的包络函数既当按下指数键是相应的波形改变为指数包络波形,同理按下其他键也一样;
如图所示:
4.4:单双音切换回调函数:
global Y;
de=get(handles.uipanel1,'selectedobject');
fe=get(de,'tag');
switch fe
case 'danyin'
Y=0;
case 'shuangyin'
Y=1;
end
与波形切换回调函数一样,根据子函数DS(A);知当Y取不同值时音频取不同的函数;既当按下单音按钮时发单频率音,当按下双音按钮时发双音,如图所示:
4.5:键盘控制回调函数function pushbutton1_KeyPressFcn(hObject, eventdata, handles)
例:if get(gcf,'CurrentCharacter')==81
pushbutton1_Callback();
end
我个人是将整个键盘控制回调函数写在控件一的按键回调函数中,因此要用键盘是要先按下键盘上的Q字母键,键盘上的每个音对应的键盘上的那些字母数字我都标在上面,可以很清楚的看到。如图所示:
4.6:text文件播放函数:function Untitled_3_Callback(hObject, eventdata, handles)
[name,path]=uigetfile('*.*','');
file=sprintf('%s%s',path,name);
de=importdata(file);
for k=1:length(de)
yinyue(de(k),de(k+length(de)))
axes1_CreateFcn();
end
该函数设置了打开路径,根据简谱需要的发音与节拍,在text文本文档中填入相应的数字调用子函数yinyue(a,b);实现音乐的播放;
function yinyue(a,b)
f=440*2^((a-49)/12);
n=0:1/8000:b*0.5;
x=exp(-2*n);
ff=x.*sin(f*2*pi*n);
soundsc(ff);
如图:
选择要播放的text文件播放音乐;
Wav格式歌曲播放函数:function Untitled_4_Callback(hObject, eventdata, handles)
global F;
[name,path]=uigetfile('*.*','');
F=sprintf('%s%s',path,name);
dashi(F);
该函数使用wavread函数实现wav格式音乐文件的播放,调用子函数dashi(file);
function dashi(file)
global player;
[y,fs,nbits,readinfo]=wavread(file);
player = audioplayer(y, fs);
play(player);
相应的暂停,停止,回复播放按键的控制如下:
function pushbutton38_Callback(hObject, eventdata, handles)
global player;
pause(player);
function pushbutton39_Callback(hObject, eventdata, handles)
global player;
resume(player);
function pushbutton40_Callback(hObject, eventdata, handles)
global player;
stop(player);
如图所示:
Avi格式视频播放函数function Untitled_5_Callback(hObject, eventdata, handles)
[name,path]=uigetfile('*.*','');
file=sprintf('%s%s',path,name);
mplay(file,24);
该函数设置路径选择Avi格式视频播放:播放函数mplay(file,24);如图所示:
5、结果分析
基本上要求的内容都能实现,但使用键盘发声时如果弹得太快,函数执行的速度跟不上容易形成音阶与节拍对不上位,在用其演奏歌曲时有点欠缺。另外在拓展的功能播放视频时无法将食品中的声音一起播出,我有上网查过好像MATLAB现在还无法实现播放视频连带视频中的声音。第三个欠缺的功能就是axes1轴形坐标显示,如果音频改变的速度过快axes1轴形坐标是无法跟上改变的速度的,因此当播放text文本文档中的音乐时axes1轴形坐标中是显示不出相应音频变化的。对于这些缺点我有试着去改正但是好像不管怎样改变程序都避免不了这些缺点,可能是MATLAB的这些方面的功能并不是很完整或者可能有更好的方法只是我还没发现。
6、心得体会
说实在的这次的MATLAB实验的题目比较令人感兴趣,无论是做PS,音乐键盘还是数据库都让人比较有兴趣去尝试。跟以往很学术性的实验课设题目大大不同,做完实验每个人都可以利用自己的作品要么玩弄自己的照片,要嘛编歌或者自弹自唱等!模板的设计多种做样格局自己的审美可以设计不同的界面。查数据
编程序的过程也可以让自己学到许多知识同时也培养了自己的动手能力,总之,通过这次试验和同学的交流学到了很多东西,培养了动手实验的兴趣也很有成就感。
参考书目:(五号,宋体加粗)
[ 1 ]..................................................MATLAB实用教程(第二版)电子工业出版社
[ 2 ]……………………《信号与系统—MATLAB综合实验》 谷源涛 高等教育出版社
第二篇:基于matlab的2PSK系统的课程设计报告
通信原理
课程设计报告
姓 名:吴彭
学 号:08042235
专 业:通信工程
院 系:信息工程学院
同组人:蔡臻,何国峰,王列
一、题目名称 2PSK系统的设计
二、题目意义
运用MATLAB编程实现2PSK调制解调过程,并且输出其调制及解调过程中的波形,讨论其调制和解调效果。
三、设计原理
数字信号的传输方式分为基带传输和带通传输,在实际应用中,大多数信道具有带通特性而不能直接传输基带信号。为了使数字信号在带通信道中传输,必须使用数字基带信号对载波进行调制,以使信号与信道的特性相匹配。这种用数字基带信号控制载波,把数字基带信号变换为数字带通信号的过程称为数字调制。
数字调制技术的两种方法:①利用模拟调制的方法去实现数字式调制,即把数字调制看成是模拟调制的一个特例,把数字基带信号当做模拟信号的特殊情况处理;②利用数字信号的离散取值特点通过开关键控载波,从而实现数字调制。这种方法通常称为键控法,比如对载波的相位进行键控,便可获得相移键控(PSK)基本的调制方式。
图1 相应的信号波形的示例
1 0 1
调制原理
数字调相:如果两个频率相同的载波同时开始振荡,这两个频率同时达到正最大值,同时达到零值,同时达到负最大值,它们应处于"同相"状态;如果其中一个开始得迟了一点,就可能不相同了。如果一个达到正最大值时,另一个达到负最大值,则称为"反相"。一般把信号振荡一次(一周)作为360度。如果一个波比另一个波相差半个周期,我们说两个波的相位差180度,也就是反相。当传输数字信号时,"1"码控制发0度相位,"0"码控制发180度相位。载波的初始相位就有了移动,也就带上了信息。
相移键控是利用载波的相位变化来传递数字信息,而振幅和频率保持不变。在2PSK中,通常用初始相位0和π分别表示二进制“1”和“0”。因此,2PSK信号的时域表达式为
(t)=Acost+)
其中,表示第n个符号的绝对相位:
=
因此,上式可以改写为
图2 2PSK信号波形
解调原理
2PSK信号的解调方法是相干解调法。由于PSK信号本身就是利用相位传递信息的,所以在接收端必须利用信号的相位信息来解调信号。下图2-3中给出了一种2PSK信号相干接收设备的原理框图。图中经过带通滤波的信号在相乘器中与本地载波相乘,然后用低通滤波器滤除高频分量,在进行抽样判决。判决器是按极性来判决的。即正抽样值判为1,负抽样值判为0.
2PSK信号相干解调各点时间波形如图 3 所示. 当恢复的相干载波产生180°倒相时,解调出的数字基带信号将与发送的数字基带信号正好是相反,解调器输出数字基带信号全部出错.
图 32PSK信号相干解调各点时间波形
这种现象通常称为"倒π"现象.由于在2PSK信号的载波恢复过程中存在着180°的相位模糊,所以2PSK信号的相干解调存在随机的"倒π"现象,从而使得2PSK方式在实际中很少采用.
四、源程序及相应实验结果
clear all;
close all;
clc;
max=10
g=zeros(1,max);
g=randint(1,max);%长度为max的随机二进制序列
cp=[];mod1=[];f=2*2*pi;t=0:2*pi/199:2*pi;
for n=1:length(g);
if g(n)==0;
A=zeros(1,200);%每个值200个点
else g(n)==1;
A=ones(1,200);
end
cp=[cp A]; %s(t),码元宽度200
c=cos(f*t);%载波信号
mod1=[mod1 c];%与s(t)等长的载波信号,变为矩阵形式
end
figure(1);subplot(4,2,1);plot(cp);grid on;
axis([0 200*length(g) -2 2]);title('二进制信号序列');
cm=[];mod=[];
for n=1:length(g);
if g(n)==0;
B=ones(1,200);%每个值200个点
c=cos(f*t); %载波信号
else g(n)==1;
B=ones(1,200);
c=cos(f*t+pi); %载波信号
end
cm=[cm B]; %s(t),码元宽度200
mod=[mod c]; %与s(t)等长的载波信号
end
tiaoz=cm.*mod;%e(t)调制
figure(1);subplot(4,2,2);plot(tiaoz);grid on;
axis([0 200*length(g) -2 2]);title('2PSK调制信号');
figure(2);subplot(4,2,1);plot(abs(fft(cp)));
axis([0 200*length(g) 0 400]);title('原始信号频谱');
figure(2);subplot(4,2,2);plot(abs(fft(tiaoz)));
axis([0 200*length(g) 0 400]);title('2PSK信号频谱');
%带有高斯白噪声的信道
tz=awgn(tiaoz,10);%信号tiaoz中加入白噪声,信噪比为10
figure(1);subplot(4,2,3);plot(tz);grid on
axis([0 200*length(g) -2 2]);title('通过高斯白噪声信道后的信号');
figure(2);subplot(4,2,3);plot(abs(fft(tz)));
axis([0 200*length(g) 0 400]);title('加入白噪声的2PSK信号频谱');
jiet=2*mod1.*tz;%同步解调
figure(1);subplot(4,2,4);plot(jiet);grid on
axis([0 200*length(g) -2 2]);title('相乘后信号波形')
figure(2);subplot(4,2,4);plot(abs(fft(jiet)));
axis([0 200*length(g) 0 400]);title('相乘后信号频谱');
%低通滤波器
fp=500;fs=700;rp=3;rs=20;fn=11025;
ws=fs/(fn/2); wp=fp/(fn/2);%计算归一化角频率
[n,wn]=buttord(wp,ws,rp,rs);%计算阶数和截止频率
[b,a]=butter(n,wn);%计算H(z)
figure(4);freqz(b,a,1000,11025);subplot(2,1,1);
axis([0 4000 -100 3 ])
title('LPF幅频相频图');
jt=filter(b,a,jiet);
figure(1);subplot(4,2,5);plot(jt);grid on
axis([0 200*length(g) -2 2]);title('经低通滤波器后信号波形')
figure(2);subplot(4,2,5);plot(abs(fft(jt)));
axis([0 200*length(g) 0 400]);title('经低通滤波器后信号频谱');
%抽样判决
for m=1:200*length(g);
if jt(m)<0;
jt(m)=1;
else jt(m)>=0;
jt(m)=0;
end
end
figure(1);subplot(4,2,6);plot(jt);grid on
axis([0 200*length(g) -2 2]);title('经抽样判决后信号s^(t)波形')
figure(2);subplot(4,2,6);plot(abs(fft(jt)));
axis([0 200*length(g) 0 400]);title('经抽样判决后信号频谱');