评分:
信号与系统课程设计
学院:电信学院
班级:测控10-2班
姓名:苏慧敏
学号:10034010206
指导教师:贺婷
设计日期:20##-6-18----20##-6-22
利用matlab合成音乐
一、实验目的
1. 熟悉MATLAB的软件和语言指令的使用;
2. 学习利用MATLAB进行连续信号的时域、频域分析;
3. 熟悉抽样信号与连续信号的区别。
二、实验内容
1.请根据《画心》片断的简谱和“十二平均律”计算出该片断中各个乐音的频率,在MATLAB 中生成幅度为1抽样频率为8kHz 的正弦信号表示这些乐音。请用sound 函数播放每个乐音,听一听音调是否正确。最后用这一系列乐音信号拼出《画心》片断,注意控制每个乐音持续的时间要符合节拍,用sound 播放你合成的音乐,听起来感觉如何?并用图显示生成的音乐信号。
程序:
A=[440 349.23 349.23 329.63 293.66 329.63 329.63 440 349.23 349.23 349.23 440 349.23 349.23 329.63 293.66 349.23 440 246.94 349.23 349.23 349.23 440 349.23];
fs=8000;
pu=[5 3 3 2 1 2 2 5 3 3 3 5 3 3 2 1 3 5 6 3 3 3 5 3
];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p ];
N=length(pu);
f=zeros(1,N);
for i=1:N
f(i)=A(pu(i)); ÷
end
point=fs*last_time;
total_point=sum(point);
store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
store(m:m+point(num)-1)=sin(2*pi*f(num)*t);
m=m+point(num);
end
sound(store,8000);
plot(store);
运行结果:
2、乐曲中相邻乐音之间有“啪”的杂声,这是由于相位不连续产生了高频分量。这种噪声严重影响合成音乐的质量,丧失真实感。为了消除它,使用包络修正每个乐音,以保证在乐音的邻接处信号幅度为零。
程序:
A=[440 349.23 349.23 329.63 293.66 329.63 329.63 440 349.23 349.23 349.23 440 349.23 349.23 329.63 293.66 349.23 440 246.94 349.23 349.23 349.23 440 349.23 ];
fs=8000;
pu=[ 5 3 3 2 1 2 2 5 3 3 3 5 3 3 2 1 3 5 6 3 3 3 5 3 ];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p ];
N=length(pu);
f=zeros(1,N);
for i=1:N
f(i)=A(pu(i));
end
point=fs*last_time;
total_point=sum(point);
store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
baoluo=zeros(1,point(num));
for j=1:point(num)
if (j<0.2*point(num))
y=7.5*j/point(num);
else
if (j<0.333*point(num))
y=-15/4*j/point(num)+9/4;
else
if (j<0.666*point(num))
y=1;
else
y=-3*j/point(num)+3;
end
end
end
baoluo(j)=y;
end
store(m:m+point(num)-1)=sin(2*pi*f(num)*t).*baoluo(1:point(num));
m=m+point(num);
end
sound(store,8000);
plot(store);
3、用最简单的方法将2中的音乐分别升高和降低一个八度。通过提高采样频率一倍可以升高一个八度,降低采样频率为原来的一半可以降低一个八度。并将合成音乐信号显示出来。
升高一个八度的程序:
A=[440 349.23 349.23 329.63 293.66 329.63 329.63 440 349.23 349.23 349.23 440 349.23 349.23 329.63 293.66 349.23 440 246.94 349.23 349.23 349.23 440 349.23 ];
fs=8000;
pu=[ 5 3 3 2 1 2 2 5 3 3 3 5 3 3 2 1 3 5 6 3 3 3 5 3 ];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p ];
N=length(pu);
f=zeros(1,N);
for i=1:N
f(i)=A(pu(i))*2;
end
point=fs*last_time;
total_point=sum(point);
store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
baoluo=zeros(1,point(num));
for j=1:point(num)
if (j<0.2*point(num))
y=7.5*j/point(num);
else
if (j<0.333*point(num))
y=-15/4*j/point(num)+9/4;
else
if (j<0.666*point(num))
y=1;
else
y=-3*j/point(num)+3;
end
end
end
baoluo(j)=y;
end
store(m:m+point(num)-1)=sin(2*pi*f(num)*t).*baoluo(1:point(num)); m=m+point(num);
end
sound(store,8000);
plot(store);
降低一个八度的程序:
A=[440 349.23 349.23 329.63 293.66 329.63 329.63 440 349.23 349.23 349.23 440 349.23 349.23 329.63 293.66 349.23 440 246.94 349.23 349.23 349.23 440 349.23 ]; fs=8000;
pu=[ 5 3 3 2 1 2 2 5 3 3 3 5 3 3 2 1 3 5 6 3 3 3 5 3 ];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p ];
N=length(pu);
f=zeros(1,N);
for i=1:N
f(i)=A(pu(i))/2;
end
point=fs*last_time;
total_point=sum(point);
store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
baoluo=zeros(1,point(num));
for j=1:point(num)
if (j<0.2*point(num))
y=7.5*j/point(num);
else
if (j<0.333*point(num))
y=-15/4*j/point(num)+9/4;
else
if (j<0.666*point(num))
y=1;
else
y=-3*j/point(num)+3;
end
end
end
baoluo(j)=y;
end
store(m:m+point(num)-1)=sin(2*pi*f(num)*t).*baoluo(1:point(num)); m=m+point(num);
end
sound(store,8000);
plot(store);
4、试着在(2) 的音乐中增加一些谐波分量,听一听音乐是否更有“厚度”了?注意谐波分量的能量要小,否则掩盖住基音反而听不清音调了。如果选择基波幅度为1 ,二次谐波幅度0.2,三次谐波幅度0.3。
A=[440 349.23 349.23 329.63 293.66 329.63 329.63 440 349.23 349.23 349.23 440 349.23 349.23 329.63 293.66 349.23 440 246.94 349.23 349.23 349.23 440 349.23 ];
fs=8000;
pu=[ 5 3 3 2 1 2 2 5 3 3 3 5 3 3 2 1 3 5 6 3 3 3 5 3 ];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p ];
N=length(pu);
f=zeros(1,N);
B=A-5;
for i=1:N
f(i)=B(pu(i));
end
point=fs*last_time;
total_point=sum(point);
store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
baoluo=zeros(1,point(num));
for j=1:point(num)
if (j<0.2*point(num))
y=7.5*j/point(num);
else
if (j<0.333*point(num))
y=-15/4*j/point(num)+9/4;
else
if (j<0.666*point(num))
y=1;
else
y=-3*j/point(num)+3;
end
end
end
baoluo(j)=y;
end
h=[1 0.2 0.3 0.1];
xiebo=zeros(1,length(t));
for i=1:length(m)
xiebo=xiebo+h(i)*sin(2*i*pi*f(num)*t);
end
store(m:m+point(num)-1)=xiebo.*baoluo(1:point(num)); m=m+point(num);
end
sound(store,8000);
plot(store);
5、自选其他音乐合成,并试着采用别的音乐包络和通过加入谐波的不同,看看效果有什么不同。
A=[440 440 349.23 493.88 440 349.23 349.23 349.23 349.23 329.63 293.66 293.66 293.66 587.33 587.33 587.33 587.33 493.88 493.88 349.23 493.88 440 440 440 493.88 587.33 493.88 587.33 587.33 493.88 440 440 440 349.23 329.63 293.66 220 349.23 329.63 329.63 329.63 329.63 293.66 293.66 246.94]; fs=8000;
pu=[5 5 3 6 5 3 3 3 3 2 1 1 1 1 1 1 1 6 6 3 6 5 5 5 5 6 1 6 1 6 5 5 5 3 2 1 5 3 2 2 2 2 1 1 6];
p=0.5;
last_time=[p/2 p/2 p/2 p/2 p p/2 p/2 p p p p/2 p/2 p p p/2 p/2 p/2 p/2 p p p p/2 p/2 p p/2 p/2 p/2 p/2 p/2 p/2 p p p/2 p/2 p/2 p/2 p p p p/2 p/2 p/2 p/2 p/2 p/2 p/2 p/2 p p p p ];
N=length(pu);
f=zeros(1,N);
for i=1:N
f(i)=A(pu(i));
end
point=fs*last_time;
total_point=sum(point); store=zeros(1,total_point);
m=1;
for num=1:N
t=1/fs:1/fs:point(num)/fs;
baoluo=zeros(1,point(num));
for j=1:point(num)
if (j<0.2*point(num))
y=7.5*j/point(num);
else
if (j<0.333*point(num))
y=-15/4*j/point(num)+9/4;
else
if (j<0.666*point(num))
y=1;
else
y=-3*j/point(num)+3;
end
end
end
baoluo(j)=y;
end
h=[1 0.2 0.3 0.1];
xiebo=zeros(1,length(t));
for i=1:length(m)
xiebo=xiebo+h(i)*sin(2*i*pi*f(num)*t);
end
store(m:m+point(num)-1)=sin(2*pi*f(num)*t).*baoluo(1:point(num)); m=m+point(num);
end
sound(store,8000);
plot(store);
信号课程设计心得体会:
课程实验报告20xx20xx学年第一学期实验名称用Matlab进行信号与系统的时频域分析专业学生姓名班级学号指导教师指导单位日期用…
信号与系统课程设计报告基于IIR的有噪声语音信号处理班姓名成绩指导教师日期目录1摘要及关键字22实验目的与具体任务33MATLAB…
沈阳理工大学课程设计专用纸成绩评定表沈阳理工大学沈阳理工大学课程设计专用纸课程设计任务书2沈阳理工大学沈阳理工大学课程设计专用纸摘…
评分信号与系统课程设计学院电信学院班级测控102班姓名苏慧敏学号10034010206指导教师贺婷设计日期20xx61820xx6…
信号与线性系统课程设计报告课题五基于FIR滤波的语音信号处理系统设计班级姓名学号组号及同组人成绩1指导教师日期课题五基于FIR滤波…
课程实验报告20xx20xx学年第一学期实验名称用Matlab进行信号与系统的时频域分析专业学生姓名班级学号指导教师指导单位日期用…
信号与系统课程设计报告学院电气与电子工程学院班级电气1010学号U20xx120xx姓名周超尘1目录一设计概述1设计题目32设计目…
信号系统与信号处理课程设计指导书信息工程学院一信号系统与信号处理课程设计目的通过课程设计主要达到以下目的1使学生进一步掌握信号处理…
信号与系统课程设计报告基于IIR的有噪声语音信号处理班姓名成绩指导教师日期目录1摘要及关键字22实验目的与具体任务33MATLAB…
信号与线性系统课程设计报告课题五基于FIR滤波的语音信号处理系统设计班级姓名学号组号及同组人成绩1指导教师日期课题五基于FIR滤波…