您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > MATLAB音乐合成
matlabmatlabmatlabmatlab实验一音乐合成综合实验电子系无717171712007011252200701125220070112522007011252李乾(6.2.26.2.26.2.26.2.2部分第二题由realwaverealwaverealwaverealwave得到wave2procwave2procwave2procwave2proc思路为参考资料得到,其它都为原创)6.2.16.2.16.2.16.2.1(1111)思路:1,定义出小字a(220Hz)为基准,分别循环列出其1/12倍的各个音阶,以备组合乐谱。2,用矩形窗函数选取出各个需要音符,并将其相加,得到需要的音乐x。3,查表得所需音符,与对应小字a的倍数为:4,为编程方便,把第一小节分为16份。代码:f=8000;E=1;t=[0:1/f:4-1/f];forn=1:16u{n}=(t(n-1)/4&tn/4);endK=2^(1/12);a0=220*2*pi;forn=1:20a(n)=a0.*K^n;enda(25)=0;music=[15251516102525258258510252525];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)).*u{n};endplot(x);sound(x,8000);5621低音6空1516108525可以听出东方红的曲调。只是音调单一,不生动。而且衔接部分由啪啪的噪声。由题可知,是高频分量所致。(2)为音符加包络时发现,按照书上的方法并不能消除噪声。代码:f=8000;E=2;t=[0:1/f:16-1/f];forn=1:16u{n}=(tn-1.1&tn-0.8).*((1/0.3)*(t+0.1-n+1))+(tn-0.8&tn-0.35)+(tn-0.35&tn+0.1).*(-2*(t-1.15-n+1));endfigure;plot(t,u{2},t,u{3});set(gca,'YLim',[-0.51.5],'XLim',[04]);a0=220*pi;K=2^(1/12);a0=220*pi/2;forn=1:20a(n)=a0.*K^n;enda(25)=0;music=[15251516102525258258510252525];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)).*u{n};endsound(x,32000);包络波形:00.511.522.533.54-0.500.511.5用指数衰减也不行。经过与同学对比,发现对音符间隔理解不用。如果向(1)中那样,第一个5演奏后,停顿一个音符,虽然更好听些,但是加包络以后,还是会造成有高频分量。所以改变方法,将5延长至下一个5.代码:f=8000;E=1;t=[0:1/f:16];forn=1:16u1{n}=(tn-1&tn);end;K=2^(1/12);a0=220*pi/2;forn=1:20a(n)=a0.*K^n;enda(25)=0;music=[1515151610101010888510101010];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)).*u1{n};endx(1:2*f)=exp(-t(1:2*f)/2).*x(1:2*f);x(2*f+1:3*f)=exp(2-t(2*f+1:3*f)).*x(2*f+1:3*f);x(3*f+1:4*f)=exp(3-t(3*f+1:4*f)).*x(3*f+1:4*f);x(4*f+1:8*f)=exp((4-t(4*f+1:8*f))/4).*x(4*f+1:8*f);x(8*f+1:10*f)=exp((8-t(8*f+1:10*f))/2).*x(8*f+1:10*f);x(10*f+1:11*f)=exp(10-t(10*f+1:11*f)).*x(10*f+1:11*f);x(11*f+1:12*f)=exp(11-t(11*f+1:12*f)).*x(11*f+1:12*f);x(12*f+1:16*f)=exp((12-t(12*f+1:16*f))/4).*x(12*f+1:16*f);sound(x,32000);figure;plot(x);02468101214x104-1-0.8-0.6-0.4-0.200.20.40.60.81(3)可以改变播放速度的情况下,可以将sound函数的采样频率提高一倍。即:代码:sound(x,32000);改为:sound(x,64000);(因为为了使分音符更方便,选取了标准的四倍时间,所以基准音调降低了四倍,播放速度比正常提高了4倍。实际原采样率为8000.)在不改变播放速度的情况下,则将基准音调频率小字一组a1提高到二倍。代码:a0=220*pi/2;改为:a0=220*pi;用resample函数时,可以将代码:sound(x,32000);改为:y=resample(x,50,53);%大约为高一个音阶sound(y,32000);这样,采样率为原来的50/53,即提高了半个音阶。但是这样做会使播放时间发生变化。而且根据数据可以看出:采样点减少,是一种有损数据的改变方式。(4)加入谐波后,代码如下:代码:f=8000;E=1;t=[0:1/f:16-1/f];forn=1:16u{n}=(tn-1&tn);end;K=2^(1/12);a0=220*pi/2;forn=1:20a(n)=a0.*K^n;endb0=a0*2;forn=1:20b(n)=b0.*K^n;endc0=a0*3;forn=1:20c(n)=c0.*K^n;enda(25)=0;b(25)=0;c(25)=0;music=[1515151610101010888510101010];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)+0.2*sin(b(music(n)).*t)+0.3*sin(c(music(n)).*t)).*u{n};endx(1:2*f)=exp(-t(1:2*f)/2).*x(1:2*f);x(2*f+1:3*f)=exp((2-t(2*f+1:3*f))).*x(2*f+1:3*f);x(3*f+1:4*f)=exp((3-t(3*f+1:4*f))).*x(3*f+1:4*f);x(4*f+1:8*f)=exp((4-t(4*f+1:8*f))/4).*x(4*f+1:8*f);x(8*f+1:10*f)=exp((8-t(8*f+1:10*f))/2).*x(8*f+1:10*f);x(10*f+1:11*f)=exp((10-t(10*f+1:11*f))).*x(10*f+1:11*f);x(11*f+1:12*f)=exp((11-t(11*f+1:12*f))).*x(11*f+1:12*f);x(12*f+1:16*f)=exp((12-t(12*f+1:16*f))/4).*x(12*f+1:16*f);sound(x,32000);声音明显厚重了许多。但不像风琴,而是像某种弦乐器。可能是由于才用的是指数衰减,造成每个音节开始都很高,然后突然降低,类似于弦乐器的拨弦动作。如果采用的是书中所画的包络进行修正,声音很像风琴。代码如下:f=8000;E=2;t=[0:1/f:16-1/f];forn=1:16u{n}=(tn-1.1&tn-0.8).*((1/0.3)*(t+0.1-n+1))+(tn-0.8&tn-0.35)+(tn-0.35&tn+0.1).*(-2*(t-1.15-n+1));enda0=220*pi/2;K=2^(1/12);a0=220*pi/2;forn=1:20a(n)=a0.*K^n;endb0=a0*2;forn=1:20b(n)=b0.*K^n;endc0=a0*3;forn=1:20c(n)=c0.*K^n;enda(25)=0;b(25)=0;c(25)=0;music=[15251516102525258258510252525];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)+0.2*sin(b(music(n)).*t)+0.3*sin(c(music(n)).*t)).*u{n};endsound(x,32000);(5)合成音乐选择为:《小星星》代码:f=8000;E=1;t=[0:1/f:16];forn=1:16u{n}=(tn-1&tn-1+0.35).*(1.3/0.35*(t-n+1))+(tn-1+0.35&tn-1+0.55).*((1-1.3)/(0.55-0.35)*(t-n+1-0.55)+1)+...(tn-1+0.55&tn-1+0.75)+(tn-1+0.75&tn-1+1.3).*((1/(0.75-1.3))*(t-n+1-1.3));endK=2^(1/12);a0=220*pi/2;forn=1:20a(n)=a0.*K^n;endb0=a0*2;forn=1:20b(n)=b0.*K^n;endc0=a0*3;forn=1:20c(n)=c0.*K^n;enda(25)=0;b(25)=0;c(25)=0;music=[33101012121025887755325];x=0*t;forn=1:16x=x+E*(sin(a(music(n)).*t)+0.2*sin(b(music(n)).*t)+0.3*sin(c(music(n)).*t)).*u{n};endsound(x,32000);6.2.26.2.26.2.26.2.2(1)(1)(1)(1)代码:x=wavread('fmt.wav');plot(x);sound(x,8000);02468101214x104-0.8-0.6-0.4-0.200.20.40.6是真实多了。(2)思路:刚开始不理解原理,不知道为什么用resample。查阅resample帮助发现,该函数自带滤波功能,以为只要多做几次抽样滤波就行,结果,毫无效果。然后在网上查阅了图片噪声消除的方法,现做傅里叶变换,然后滤去杂波噪声。结果也失败。后来在CSDN发现一类似程序,问题得以解决。因为非线性谐波和噪声有一个共同点,就是随机产生,无周期性变化。所以可以把波形进行若干次叠加,然后取平均值,可以想到,叠加次数越多,其平均值就越接近于周期波形。读出realwave波形,发现采样点为243,重复十次,可得周期为24.3,所以可以将其延长至十倍,这样,周期就是整数。代码:loadguitar.mat;l=length(realwave);sample1=resample(realwave,10,1);sample2=zeros(1,l);form=1:10sample2=sample2+(sample1((m-1)*l+1:m*l))';endsample1=[sample2,sample2,sample2,sample2,sample2,sample2,sample2,sample2,sample2,sample2];sample2=resample(sample1/10,1,10);figure;subplot(3,1,1);plot(wave2proc);title('wave2proc');subplot(3,1,2);plot(sample2);title('sample2');subplot(3,1,3);plot(sample2-wave2proc');title('sample2-wave2proc');050100150200250-0.500.5wave2proc050100150200250-0.500.5sample2050100150200250-202x10-16sampl
本文标题:MATLAB音乐合成
链接地址:https://www.777doc.com/doc-5065196 .html