通讯原理与技术.docx
《通讯原理与技术.docx》由会员分享,可在线阅读,更多相关《通讯原理与技术.docx(11页珍藏版)》请在冰豆网上搜索。
通讯原理与技术
福建农林大学金山学院
课程设计
课程名称:
通讯原理与技术
系别:
信息与机电工程系
专业班级:
10电科2班
学号:
100203055
姓名:
题目:
基于MATLAB的简单音乐合成
2013年12月1日
《通讯原理与技术课程设计》任务书
题目
基于MATLAB的简单音乐合成
主要
内容
1、自学Matlab软件,了解相关编译语句;
2、利用Matlab完成简单的音乐合成;
3、分析仿真结果,得出合理结论。
设计
要求
1、利用Matlab实现对自选乐曲的简单音乐合成,生成.wav文件;
2、给各个乐音加载包络,生成.wav,并显示音乐信号的包络图像;
3、在音乐中加上二、三、四次谐波,基波幅度为1,高次谐波幅度分别为0.2、0.3、0.1,并生成.wav文件。
4、按要求完成设计报告。
主要
仪器
设备
1、计算机1台,Matlab仿真软件一套。
主要
参考
文献
[1]樊昌信等.通信原理(第6版)[M].北京:
国防工业出版社,2006.
[2]肖伟等.MATLAB程序设计与应用[M].北京:
清华大学出版社,北京交通大学出版社,2005.
[3]赵鸿图等.通信原理MATLAB仿真教程[M].北京:
人民邮电出版社,2010.
课程设计进度安排(起止时间、工作内容)
每位同学选择不同乐曲进行音乐合成,每人1套实验环境。
整个课程设计共1周20学时,具体安排如下:
前期准备工作4学时学习设计题目相关知识,查阅资料,掌握实现的原理;
计划内上机14学时按要求,完成设计方案,编写并调试仿真程序;
计划内上机2学时结果验收,并完成课程设计报告。
课程设计开始日期
2013.11.25
课程设计完成日期
2013.12.01
指导老师(签名):
__________________________
1设计基础
1.1MATLAB软件简介
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室MATLAB工作界面)。
是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用。
1.21.2乐曲解析
乐音的基本特征可以用基波频率、谐波频率和包络波形三个方面来描述,我们用大写英文字母CDEFGAB表示每个音的“音名”(或称为“音调”),当指定某一音名时,它对应固定的基波信号频率。
图1-1表示钢琴的键盘结构,并注明了每个琴键对应的音名和基波频率值。
这些频率值是按“十二平均律”计算导出。
钢琴是十二平均律制乐器。
国际标准音规定,钢琴的a1(小字一组的a音,对应钢琴键是49A)的频率是为440Hz;又规定每相邻半音的频率比值为2^(1/12)≈1.059463,(解释:
这表示“2的十二分之一次方”),根据这规定,就可以得出钢琴上每一个琴键音的频率。
如与a1右边相邻#a1的频率是440×1.059463=466.16372Hz;再往上,b1的频率是493.088321Hz;c2的频率是523.25099......同理,与a1左边相邻的#g1的频率是440÷1.059463=415.030473Hz.....这种定音的方式就是“十二平均律”。
图1-1钢琴键盘和相应频率
从图1-1可以看到,靠下边的A键称为小字组A,它的频率值fA0=220Hz,而靠上面的另一个A键是小字一组A,它的频率值是fA1=440Hz。
两者为二倍频率关系,即fA1相当于fA0的二次谐波。
也称为8度音或倍频程Octave(即我们画频响特性图时所用的术语“倍频程”)。
选取乐曲《荷塘夜色》前奏,见图1-2。
图1-2乐曲《荷塘夜色》曲谱
由图可知《荷塘夜色》的曲调定为C,即1=C,对应的频率为261.63Hz,据此可以计算出乐谱中各个乐音的频率,见表1-1。
表1-1各乐音对应的频率
乐音
1
2
3
5
频率
220
196
261.63
293.66
329.63
392
在确定了各乐音的频率之后需要确定每个乐音的持续时间。
每小节有四拍,设一拍的时间是1s,因此部分乐音的持续时间见表1-2部分乐音对应的时间:
表1-2乐音对应的时间
乐音
1
5
1
5
1
2
3
1
5
1
5
1
时间(s)
1.5
0.5
0.5
0.5
0.5
0.5
4
1.5
0.5
0.5
0.5
0.5
乐音
2
2
1
5
1
5
2
1
1
2
时间(s)
0.5
4
1.5
0.5
0.5
0.5
0.5
0.5
2.5
0.5
0.5
0.5
乐音
1
5
1
5
1
1
时间(s)
1.5
0.5
0.5
0.5
0.5
0.5
4
而在MATLAB中表示乐音所用的抽样频率为fs=8000Hz,也就是所1s钟内有8000个点,抽样点数的多少就可表示出每个乐音的持续时间的长短。
用一个行向量来存储这段音乐对应的抽样点,在用sound函数播放即可。
2设计与实现
2.1简单的音乐合成
2.1.1原理分析
根据《荷塘夜色》片段的简谱和“十二平均律”计算出该片段中各个乐音的频率,在MATLAB中生成幅度为1、抽样频率为8000kHz的正弦信号表示这些乐音。
请用sound函数播放每个乐音,听一听音调是否正确,最后用这一系列乐音信号拼出《荷塘夜色》片段,注意控制每个乐音持续的时间要符合节拍,用sound函数播放合成的乐音。
2.1.2Matlab源代码
clear;clc;
fs=8000%抽样频率
f=[261.63392261.63392261.63293.66329.63261.63392261.63392261.63293.66293.66261.63392261.63392293.66261.63220220196261.63293.66261.63392261.63392261.63220261.63];%各个乐音对应的频率
time=fs*[3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,1/2,1/2,1/2,2,1/2,1/2,1/2,1/2,3/2,1/2,1/2,1/2,1/2,1/2,4];
%各个乐音的抽样点数
N=length(time);
n=1;
fornum=1:
N%利用循环产生抽样数据,num表示乐音编号
t=1/fs:
1/fs:
time(num)/fs;%产生第num个乐音的抽样点
hetangyuese(n:
n+time(num)-1)=sin(2*pi*f(num)*t);%抽样点对应的幅值
n=n+time(num);
end
sound(hetangyuese,8000);%播放音乐
2.1.3运行结果分析
初步合成的音乐音调符合曲谱,能听出《荷塘夜色》的旋律。
但是每个乐音之间有“啪”的杂声,且无法分辨是何种乐器演奏。
2.2除噪音,加包络
2.2.1原理分析
较为科学的包络如图2-1所示,每个乐音都经过冲激、衰减、持续、消失四个阶段。
图2-1音量变化
由上图可以看出这个包络是四段直线段构成的,因此只要确定了每段线段的端点,即可用端点数据写出直线方程,因为直线方程可以用通式写出(我用的是斜截式),因此这段包络可以用简单的循环来完成。
例如认为包络线上的数据如图2-2所示:
图2-2包络线上的数据
2.2.2Matlab源代码
clear;clc;
fs=8000;%抽样频率
f=[261.63392261.63392261.63293.66329.63261.63392261.63392261.63293.66293.66261.63392261.63392293.66261.63220220196261.63293.66261.63392261.63392261.63220261.63];
time=fs*[3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,1/2,1/2,1/2,4,3/2,1/2,1/2,1/2,1/2,1/2,2,1/2,1/2,1/2,1/2,3/2,1/2,1/2,1/2,1/2,1/2,4];%各个乐音对应的频率
N=length(time);%这段音乐的总抽样点数
hetangyuese=zeros(1,N);%用hetangyuese向量来储存抽样点
n=1;
fornum=1:
N%利用循环产生抽样数据,num表示乐音编号
t=1/fs:
1/fs:
(time(num))/fs;%产生第num个乐音的抽样点
P=zeros(1,time(num));%P为存储包络数据的向量
L=(time(num))*[01/5333/1000333/5001];%包络线端点对应的横坐标
T=[01.5110];%包络线端点对应的纵坐标
s=1;
b=1:
1:
time(num);%产生包络线抽样点
fork=1:
4
P(s:
L(k+1)-1)=(T(k+1)-T(k))/(L(k+1)-L(k))*(b(s:
L(k+1)-1)-L(k+1)*ones(1,L(k+1)-s))+T(k+1)*ones(1,L(k+1)-s);%包络线直线方程通式
s=L(k+1);
end
hetangyese(n:
n+time(num)-1)=sin(2*pi*f(num)*t).*P(1:
time(num));%给第num个乐音加上包络
n=n+time(num);
end
sound(hetangyese,8000);
plot(hetangyese);
wavwrite(hetangyese,'hetangyese2')
2.2.3运行结果分析
播放后可以听出