信号与系统课程设计报告

                                          评分:

信号与系统课程设计

             学院:电信学院

班级:测控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);  

      

运行结果:

第一幅图.png

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);

包络的图像.png

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);

声调升高图像.png

降低一个八度的程序:

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);

声调降低图像.png

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);

加谐波的图像.png

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);

14的图像.png

信号课程设计心得体会:

相关推荐