2024年2月20日发(作者:海傲南)
MATLAB
数学实验报告
姓名:
学号:
指导老师:
专业班级:
音乐合成
学号
实验题目
班级
姓名 指导教师
评 分
音乐合成
1.实验目的:
1.熟悉MATLAB的软件和语言指令的使用;
2. 学习利用MATLAB进行连续信号的时域、频域分析;
3. 通过电子音乐合成方面的练习增进对傅里叶级数的理解
2.实验内容:
使用matlab演奏《当你孤单你会想起谁》
3.详细设计:
1.
本次音乐合成所作曲目为《当你孤单你会想起谁》简谱
首先介绍matlab函数的玩法:
matlab播放音乐是由sound(Y,fs,bits)函数完成的,该函数的3个参数代表输入信号、采样率、比特率。先说采样率fs的设置,人耳能够听到的声音范围是20~20000Hz。根据采样定理fs只需要大于40000即可。此处采样率的设置采用了MP3的标准,即fs=44.1k.再说输入信号Y,Y一般是一个正弦波,如A*sin(2*pi*w*t)。其中A控制着声音的大小,w控制着声音的高低,t的范围控制着声音的长短,所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质(音色音质很难用参数量化,我问了一下学语音的同学,这个东西跟音频谱重心,音频扩展度和音频谱平坦度有关系,这里不作讨论)。比特率采用默认值即可,该参数省略。
于是用下面的公式就可以播放出标准音la:
fs=44100;
t=0: 1/fs: 0.5;
la = sin(2*pi*440*t);
sound(la, fs)
据所知,音高和频率是指数的关系,它们满足下面的公式,其中p是音高,f是频率
标准音la,即钢琴的A4键,定义为p=69。音高每上升一个半音,p加1。
设计代码:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% when you are lonely,who will you think about? //当你孤单你会想起谁 on Matlab
fs = 44100; % sample rate
dt = 1/fs;
T16 = 0.125;
t16 = [0:dt:T16];
[temp k] = size(t16);
t4 = linspace(0,4*T16,4*k);
t8 = linspace(0,2*T16,2*k);
[temp i] = size(t4);
[temp j] = size(t8);
% Modification functions
mod4=(t4.^4).*exp(-30*(t4.^0.5));
mod4=mod4*(1/max(mod4));
mod8=(t8.^4).*exp(-50*(t8.^0.5));
mod8=mod8*(1/max(mod8));
mod16=(t16.^4).*exp(-90*(t16.^0.5));
mod16=mod16*(1/max(mod16));
f0 = 2*146.8; % reference frequency
ScaleTable = [2/3 3/4 5/6 15/16 ...
1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...
2 9/4 5/2 8/3 3 10/3 15/4 4 ...
1/2 9/16 5/8];
% 1/4 notes
do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);
re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);
mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);
fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);
so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);
la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);
ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);
do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);
re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);
mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);
fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);
so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);
la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);
tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);
ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);
do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);
re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);
mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);
fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);
so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);
la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);
ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
blkf = zeros(1,i);
% 1/8 notes
do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8);
mi0e = mod8.*cos(2*pi*ScaleTable(23)*f0*t8);
fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);
so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);
la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);
ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);
la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);
tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
blke = zeros(1,j);
% 1/16 notes
do0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16);
re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16);
mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);
fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);
so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);
do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);
re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);
mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);
fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);
so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);
la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);
tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);
ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);
do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);
re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);
mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);
fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);
so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);
la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);
ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);
do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);
blks = zeros(1,k);
% Melody by Schau_mal
part1 = [mi1e fa1e so1e so1e so1e so1e so1f
so1e so1e so1e so1e so1f
do2f mi1f mi1e re1e mi1e mi1e mi1e mi1e ...
];
part2=[ so1e so1e fa1e fa1e mi1e re1e do1e
mi1e fa1e mi1e do1e do1f
so1e fa1e fa1e mi1e fa1e so1e so1e mi1e mi1e re1e re1e re1e ...
];
part3 = [mi1e fa1e so1e so1e so1e so1e so1f
so1e so1e so1e so1e so1f
do2f mi1f mi1e re1e mi1e mi1e mi1e mi1e
];
part4 = [ so1e so1e fa1e fa1e mi1e re1e do1e do1e mi1e mi1e fa1e mi1e do1e
so1e fa1e fa1e mi1e fa1e so1e so1e la1e la1e so1e so1e
do2e do2e re2e do2e do2f
ti1e do2e ti1e so1e so1e
la1f do1f do1f re1e mi1e mi1e so1e so1e mi1e re1f
do2e do2e re2e do2e do2f
ti1e do2e ti1e so1e so1f
la1e do2e do2e do2e do2e
do2e re2s re2e do2e mi2e re2e re2f re2f re2f re2f re2f ...
];
part5 = [mi2f mi2e fa2e mi2e re2f do2e re2e so2e re2e
do2f do2e re2e do2f
ti1f mi2e ti1e ti1e ...
la1f re2e mi2e re2e do2e la1f ...
so1f re2e mi2e re2e
];
% Combination, v1 is complete version, v2 is simple version.
v1 = [part1 part2 part3 part4 part5];
s = v1;
sound(s,fs);
输入此代码后,即可使《当你孤单你会想起谁》以matlab的形式播放出来
4:实验结果:
经过matlab的处理后,《当你孤单你会想起谁》通过matlab播放了出来,并可以画出如下图片。
播放后可以听出没有噪音,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,因为此代码已经使用包络来消噪音。所使用的包络为最简单的包络为指数衰减。
5.实验总结
使用matlab合成音乐,通过这次音乐合成数学实验,我了解到了matlab的博大精深和强大的魅力,让我无所适从,只能说matlab太神奇了了,这次实验不仅考验了我们的能力并考验了我们团队的合作能力,增强了同学们之间的互帮互助,提高了默契。 而且MATLAB中的帮助文件对我们提供了很大的帮助,想很多函数之前并没有接触过,都是通过帮助文件学习了它们的使用方法。同时在遇到问题时跟同学讨论、交流,也产生了不少好想法。
2024年2月20日发(作者:海傲南)
MATLAB
数学实验报告
姓名:
学号:
指导老师:
专业班级:
音乐合成
学号
实验题目
班级
姓名 指导教师
评 分
音乐合成
1.实验目的:
1.熟悉MATLAB的软件和语言指令的使用;
2. 学习利用MATLAB进行连续信号的时域、频域分析;
3. 通过电子音乐合成方面的练习增进对傅里叶级数的理解
2.实验内容:
使用matlab演奏《当你孤单你会想起谁》
3.详细设计:
1.
本次音乐合成所作曲目为《当你孤单你会想起谁》简谱
首先介绍matlab函数的玩法:
matlab播放音乐是由sound(Y,fs,bits)函数完成的,该函数的3个参数代表输入信号、采样率、比特率。先说采样率fs的设置,人耳能够听到的声音范围是20~20000Hz。根据采样定理fs只需要大于40000即可。此处采样率的设置采用了MP3的标准,即fs=44.1k.再说输入信号Y,Y一般是一个正弦波,如A*sin(2*pi*w*t)。其中A控制着声音的大小,w控制着声音的高低,t的范围控制着声音的长短,所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质(音色音质很难用参数量化,我问了一下学语音的同学,这个东西跟音频谱重心,音频扩展度和音频谱平坦度有关系,这里不作讨论)。比特率采用默认值即可,该参数省略。
于是用下面的公式就可以播放出标准音la:
fs=44100;
t=0: 1/fs: 0.5;
la = sin(2*pi*440*t);
sound(la, fs)
据所知,音高和频率是指数的关系,它们满足下面的公式,其中p是音高,f是频率
标准音la,即钢琴的A4键,定义为p=69。音高每上升一个半音,p加1。
设计代码:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% when you are lonely,who will you think about? //当你孤单你会想起谁 on Matlab
fs = 44100; % sample rate
dt = 1/fs;
T16 = 0.125;
t16 = [0:dt:T16];
[temp k] = size(t16);
t4 = linspace(0,4*T16,4*k);
t8 = linspace(0,2*T16,2*k);
[temp i] = size(t4);
[temp j] = size(t8);
% Modification functions
mod4=(t4.^4).*exp(-30*(t4.^0.5));
mod4=mod4*(1/max(mod4));
mod8=(t8.^4).*exp(-50*(t8.^0.5));
mod8=mod8*(1/max(mod8));
mod16=(t16.^4).*exp(-90*(t16.^0.5));
mod16=mod16*(1/max(mod16));
f0 = 2*146.8; % reference frequency
ScaleTable = [2/3 3/4 5/6 15/16 ...
1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...
2 9/4 5/2 8/3 3 10/3 15/4 4 ...
1/2 9/16 5/8];
% 1/4 notes
do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);
re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);
mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);
fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);
so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);
la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);
ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);
do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);
re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);
mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);
fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);
so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);
la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);
tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);
ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);
do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);
re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);
mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);
fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);
so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);
la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);
ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
blkf = zeros(1,i);
% 1/8 notes
do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8);
mi0e = mod8.*cos(2*pi*ScaleTable(23)*f0*t8);
fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);
so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);
la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);
ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);
la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);
tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
blke = zeros(1,j);
% 1/16 notes
do0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16);
re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16);
mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);
fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);
so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);
do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);
re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);
mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);
fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);
so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);
la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);
tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);
ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);
do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);
re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);
mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);
fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);
so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);
la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);
ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);
do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);
blks = zeros(1,k);
% Melody by Schau_mal
part1 = [mi1e fa1e so1e so1e so1e so1e so1f
so1e so1e so1e so1e so1f
do2f mi1f mi1e re1e mi1e mi1e mi1e mi1e ...
];
part2=[ so1e so1e fa1e fa1e mi1e re1e do1e
mi1e fa1e mi1e do1e do1f
so1e fa1e fa1e mi1e fa1e so1e so1e mi1e mi1e re1e re1e re1e ...
];
part3 = [mi1e fa1e so1e so1e so1e so1e so1f
so1e so1e so1e so1e so1f
do2f mi1f mi1e re1e mi1e mi1e mi1e mi1e
];
part4 = [ so1e so1e fa1e fa1e mi1e re1e do1e do1e mi1e mi1e fa1e mi1e do1e
so1e fa1e fa1e mi1e fa1e so1e so1e la1e la1e so1e so1e
do2e do2e re2e do2e do2f
ti1e do2e ti1e so1e so1e
la1f do1f do1f re1e mi1e mi1e so1e so1e mi1e re1f
do2e do2e re2e do2e do2f
ti1e do2e ti1e so1e so1f
la1e do2e do2e do2e do2e
do2e re2s re2e do2e mi2e re2e re2f re2f re2f re2f re2f ...
];
part5 = [mi2f mi2e fa2e mi2e re2f do2e re2e so2e re2e
do2f do2e re2e do2f
ti1f mi2e ti1e ti1e ...
la1f re2e mi2e re2e do2e la1f ...
so1f re2e mi2e re2e
];
% Combination, v1 is complete version, v2 is simple version.
v1 = [part1 part2 part3 part4 part5];
s = v1;
sound(s,fs);
输入此代码后,即可使《当你孤单你会想起谁》以matlab的形式播放出来
4:实验结果:
经过matlab的处理后,《当你孤单你会想起谁》通过matlab播放了出来,并可以画出如下图片。
播放后可以听出没有噪音,同时因为不同时长的乐音衰减的快慢不一样,音乐听起来更有起伏感,因为此代码已经使用包络来消噪音。所使用的包络为最简单的包络为指数衰减。
5.实验总结
使用matlab合成音乐,通过这次音乐合成数学实验,我了解到了matlab的博大精深和强大的魅力,让我无所适从,只能说matlab太神奇了了,这次实验不仅考验了我们的能力并考验了我们团队的合作能力,增强了同学们之间的互帮互助,提高了默契。 而且MATLAB中的帮助文件对我们提供了很大的帮助,想很多函数之前并没有接触过,都是通过帮助文件学习了它们的使用方法。同时在遇到问题时跟同学讨论、交流,也产生了不少好想法。