版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精品文档信号与系统 综合实验之音乐合成(1) 请根据东方红片断的简谱和“十二平均律”计算出该片断中各个乐音的频 率,在MATLAB中生成幅度为1、抽样频率为8kHz的正弦信号表示这些乐 音。请用 sound 函数播放每个乐音,听一听音调是否正确。最后用这一系列 乐音信号拼出东方红片断,注意控制每个乐音持续的时间要符合节拍, 用sou nd播放你合成的音乐,听起来感觉如何?代码如下:f =8000;t2=0:1/f:1;t4=0:1/f:0.5;t8=0:1/f:0.25;omg5=523.35;omg6=587.33;omg2=392;omg1=349.23;omg6l=293.66;m1=s
2、in(2*pi*omg5*t4);m2=sin(2*pi*omg5*t8);m3=sin(2*pi*omg6*t8);m4=sin(2*pi*omg2*t2);m6=sin(2*pi*omg1*t4);m7=sin(2*pi*omg1*t8);m8=sin(2*pi*omg6l*t8);m9=sin(2*pi*omg2*t2);m=m1 m2 m3 m4 m6 m7 m8 m9;sound(m);听的时候发现在相邻乐音之间有杂音,这是由于相位不连续造成的。(2) 你一定注意到 (1) 的乐曲中相邻乐音之间有“啪”的杂声,这是由于相位不连续 产生了高频分量。这种噪声严重影响合成音乐的质量,丧失真
3、实感。为了消 除它,我们可以用图 1.5 所示包络修正每个乐音,以保证在乐音的邻接处信 号幅度为零。此外建议用指数衰减的包络来表示 。我采用的是指数衰减的包络。代码如下:f =8000;t2=0:1/f:1;t4=0:1/f:0.5;t8=0:1/f:0.25;omg5=523.35;omg6=587.33;omg2=392;omg1=349.23;omg6l=293.66;m1=exp(-2*t4).*sin(2*pi*omg5*t4);m2=exp(-4*t8).*sin(2*pi*omg5*t8);m3=exp(-4*t8).*sin(2*pi*omg6*t8);m4=exp(-1*t2
4、).*sin(2*pi*omg2*t2);m6=exp(-2*t4).*sin(2*pi*omg1*t4);m7=exp(-4*t8).*sin(2*pi*omg1*t8); m8=exp(-4*t8).*sin(2*pi*omg6l*t8);m9=exp(-1*t2).*sin(2*pi*omg2*t2);m=m1 m2 m3 m4 m6 m7 m8 m9;sound(m);第一次我采用的指数衰减没有时间前面的系数, 即每个都只乘 exp(t), 没有系数; 后来根据不同节拍,更改了不同的衰减系数,这样声音听起来感觉更加圆润。(3) 请用最简单的方法将 (2) 中的音乐分别升高和降低一个八度
5、。(提示:音乐 播放的时间可以变化)再难一些,请用 resample 函数(也可以用 interp 和 decimate 函数)将上述音乐升高半个音阶。(提示:视计算复杂度,不必 特别精确)答:最简单的方法是直接更改抽样频率f。将f从8K改为4K,则升高一个八度,并 且播放速度增快了一倍;将f从8k改为16k,则降低一个八度,速度也变慢了一倍。 升高半个音阶,只须在(2)代码最后加一句resample ( m,1000,1059)即可。f =8000;%改为 4000 或者 16000t2=0:1/f:1;t4=0:1/f:0.5;t8=0:1/f:0.25;omg5=523.35;omg6=
6、587.33;omg2=392;omg1=349.23;omg6l=293.66;m1=exp(-2*t4).*sin(2*pi*omg5*t4);m2=exp(-4*t8).*sin(2*pi*omg5*t8);m3=exp(-4*t8).*sin(2*pi*omg6*t8);m4=exp(-1*t2).*sin(2*pi*omg2*t2);m6=exp(-2*t4).*sin(2*pi*omg1*t4);m7=exp(-4*t8).*sin(2*pi*omg1*t8);m8=exp(-4*t8).*sin(2*pi*omg6l*t8);m9=exp(-1*t2).*sin(2*pi*omg
7、2*t2);m=m1 m2 m3 m4 m6 m7 m8 m9;resample(m,1000,1059);sound(m);(4) 试着在 (2) 的音乐中增加一些谐波分量, 听一听音乐是否更有“厚度”了?注意谐波分量的能量要小,否则掩盖住基音反而听不清音调了。(如果选择基波幅度为1 ,二次谐波幅度0:2 ,三次谐波幅度0:3 ,听起来像不像象风琴?) 代码如下: f =8000;t2=0:1/f:1;t4=0:1/f:0.5;t8=0:1/f:0.25;omg5=523.35;omg6=587.33;omg2=392;omg1=349.23;omg6l=293.66; m1=exp(-2*
8、t4).*sin(2*pi*omg5*t4)+0.2*exp(-2*t4).*sin(2*pi*2*omg5*t4)+ 0.3*exp(-2*t4).*sin(2*pi*3*omg5*t4);m2=exp(-4*t8).*sin(2*pi*omg5*t8)+0.2*exp(-4*t8).*sin(2*pi*2*omg5*t8)+0.3*exp(-4*t8).*sin(2*pi*3*omg5*t8); m3=exp(-4*t8).*sin(2*pi*omg6*t8)+0.2*exp(-4*t8).*sin(2*pi*2*omg6*t8)+0.3*exp(-4*t8).*sin(2*pi*3*om
9、g6*t8);m4=exp(-1*t2).*sin(2*pi*omg2*t2)+0.2*exp(-1*t2).*sin(2*pi*2*omg2*t2)+0.3*exp(-1*t2).*sin(2*pi*3*omg2*t2); m6=exp(-2*t4).*sin(2*pi*omg1*t4)+0.2*exp(-2*t4).*sin(2*pi*2*omg1*t4)+0.3*exp(-2*t4).*sin(2*pi*3*omg1*t4); m7=exp(-4*t8).*sin(2*pi*omg1*t8)+0.2*exp(-4*t8).*sin(2*pi*2*omg1*t8)+0.3*exp(-4*t
10、8).*sin(2*pi*3*omg1*t8); m8=exp(-4*t8).*sin(2*pi*omg6l*t8)+0.2*exp(-4*t8).*sin(2*pi*2*omg6l*t8 )+0.3*exp(-4*t8).*sin(2*pi*3*omg6l*t8);m9=exp(-1*t2).*sin(2*pi*omg2*t2)+0.2*exp(-1*t2).*sin(2*pi*2*omg2*t2)+0.3*exp(-1*t2).*sin(2*pi*3*omg2*t2); m=m1 m2 m3 m4 m6 m7 m8 m9; sound(m);加入谐波分量后,音色有所变化,感觉更加清脆一些(
11、5) 自选其它音乐合成,例如贝多芬第五交响乐的开头两小节。我选取的是晴天的第一句代码如下:f=8000;t2=0:1/f:1;t4=0:1/f:0.5;t8=0:1/f:0.25;t=0:1/f:0.125;omg1=392;omg2=440;omg3=493.88;omg4=523.25;omg5=587.33;omg6=659.25;omg7=698.45;omg5l=293.66;m0=0;m1=exp(-2*t4).*sin(2*pi*omg5*t4);m2=exp(-2*t4).*sin(2*pi*omg5*t4);m3=exp(-2*t4).*sin(2*pi*omg1*t4);m
12、4=exp(-1*t2).*sin(2*pi*omg1*t2);m5=exp(-2*t4).*sin(2*pi*omg2*t4);m6=exp(-2*t2).*sin(2*pi*omg3*t2);m7=exp(-2*t4).*sin(2*pi*omg5*t4);m8=exp(-2*t4).*sin(2*pi*omg5*t4);m9=exp(-2*t4).*sin(2*pi*omg1*t4);m10=exp(-2*t4).*sin(2*pi*omg1*t4);m11=exp(-4*t8).*sin(2*pi*omg2*t8);m12=exp(-4*t8).*sin(2*pi*omg3*t8);m
13、13=exp(-4*t8).*sin(2*pi*omg2*t8);m14=exp(-4*t8).*sin(2*pi*omg1*t8);m15=exp(-2*t2).*sin(2*pi*omg5l*t2);m=m0 m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15;sound(m);(6) 先用 wavread 函数载入光盘中的 fmt.wav 文件,播放出来听听效果如何?是 否比刚才的合成音乐真实多了?x=wavread( 'fmt.wav' ); sound(x);( 7)你知道待处理的 wave2proc 是如何从真实值
14、realwave 中得到的么?这个 预处理过程可以去除真实乐曲中的非线性谐波和噪声, 对于正确分析音调是非常 重要的。提示:从时域做,可以继续使用 resample 函数。realwave中的波形有十个周期,要除去其中的噪声可以采用时域求均值的方 法。步骤如下:首先用resample函数将其采样率增大为十倍,再等分十份取平均, 然后重复这个平均后的波形十次,还原其长度,最后在用resample函数还原采样率到1/10 。代码如下:load( 'Guitar.MAT' ); wavetemp = zeros(length(realwave), 1); waveresampled
15、= resample(realwave,10,1);for n = 1 : 10wavetemp = wavetemp + waveresampled(n - 1) * length(realwave) + 1 : n * length(realwave) / 10;end mywave2proc = repmat(wavetemp, 10, 1); mywave2proc = resample(mywave2proc, 1, 10); figure;subplot(3, 1, 1);plot(realwave); subplot(3, 1, 2);plot(wave2proc);subplo
16、t(3, 1, 3);plot(mywave2proc);精品文档0.5-0.5105010015020025005:(:r, A A l A A A0 -宀 m虫、沁 VAj丿虫Y J vcj Z'*、:-0.5 1:0501001502002500.5:I人;0 7、二< hw VA%1 VAj 丿 I几;J V<V 7g S、:-0.51:050100150200250(8) 这段音乐的基频是多少?是哪个音调?请用傅里叶级数或者变换的方法分 析它的谐波分量分别是什么。提示:简单的方法是近似取出一个周期求傅里叶级 数但这样明显不准确,因为你应该已经发现基音周期不是整数(
17、这里不允许使用resample函数)。复杂些的方法是对整个信号求傅里叶变换(回忆周期性信号 的傅里叶变换),但你可能发现无论你如何提高频域的分辨率,也得不到精确的 包络(应该近似于冲激函数而不是sine函数),可选的方法是增加时域的数据 量,即再把时域信号重复若干次,看看这样是否效果好多了?请解释之。答:共计221-2=219个周期;基因频率约为8000 / (219 / 9) = 328.7671Hz.用FFT寸该信号做DF变换:load( 'Guitar.MAT' );my_wave2proc = repmat(wave2proc, 25, 1);Fs = 8000;Len
18、 gth = len gth(my_wave2proc);NFFT = 2 人 nextpow2(Le ngth);Y = fft(my_wave2proc, NFFT) / Len gth;amplitude = 2 * abs(Y(1 : NFFT / 2 + 1);freque ncy = Fs / 2 * lin space(O, 1 ,NFFT / 2 + 1);plot(freque ncy, amplitude);max_rate_of_grade, max_positi on = max(amplitude(1 : 100); freque ncy(max_positi on)
19、算得基频为329.1016Hz,和前面通过周期估算得到的很相近。对照可得,为C大调mi。(9) 再次载入fmt.wav,现在要求你写一段程序,自动分析出这段乐曲的音调和 节拍!如果你觉得太难就允许手工标定出每个音调的起止时间,再不行你就把每个音调的数据都单独保存成一个文件,然后让MATLAB对这些文件进行批处理。 注意:不允许逐一地手工分析音调。编辑音乐文件,推荐使用CoolEdit"编辑软件。此问参考了学长的版本。看了版本才明白了算法。主要分2个步骤:1、分割出单个音符,计算每个音符的时间,2、计算每个音符的频率,把频率转化为音名。分割音符即将一个一个的音符片段从整个曲子中切下。音
20、符的起始都伴随时域上瞬时能量的激增,即时域上波形幅度突然变大。利用这一点特征对音符进行提取。0.01选择小步幅对fmt.wav进行扫描,步幅选为 0.01秒最为适宜。具体方法如下:在秒的范围内找极大点,而且是后续能量连续下降的极大点,这个极大点如果满足以下三个条件,则为有效的音符的起始点:1、 这个极大点比前一段的极大点能量高出80% ;Pw>1.8*Pwp2、 这个极大点比整个乐曲的平均能量高;St>Stp+10003、 距前面最近的一个音符的起始点时间差1/8秒以上。Pw>Avg分割的结果:LaDOS25 4 3 2 1 0 o o o o O,r A *音符分割468T
21、ime104X 10一共分割得30个音,和 CoolEdit的分析基本一致。Time=diff(StartPoint Len)/8000;En dPoi nt=StartPoi nt(2:Num) Len 卜200; Power=Power/max(Power);STime=Time-200/8000;过度部分每个音符的持续时间 用于傅立叶变换的区间 能量修正(归一)用于傅立叶变换的区间长度计算频率并转化对每个音符内部的一个区间(我选这个音符的起始到结束前的0.025秒,即StartPoint 到EndPoint)做快速傅立叶变换,然后在频谱中选出基频。关于自动寻找基频: 一般的,基波不是幅度
22、最大的频率,因为有很多音调的谐波, 甚至非线性谐波的幅度大于基波。一般来说,一次谐波的幅度不太大,不会大于基波幅度的2倍,这样,在有可能出现基波的地方,禾U用每个点的幅度值除以该点的频率,也就是每个点 对于原点的斜率做为判定基波的标准,经过这样的简化处理, 找到斜率最大的点, 基本上就能够判定基波出现在什么位置。FO=F_fft./omg;%每个点的幅度值除以该点的频率M1 M2=max(FO);%找到斜率最大的点,判定为基波Freq(p)=omg(M2)/2/pi;% 记下频率值Name(p)=Freq2Name(Freq(p);% 把频率值转化为音名(关于函数 Freq2Name(Freq
23、):把频率与十几个标准音的频率作比较,选出最接近的一 个,作为这个频率对应的音名。)display('Score : ');display(Name);display(Time);%输出结果:#音名时长#音名时长#音名时长#音名时长11-60.16769-40.504417-60.38902510.47182-61.486610-40.74841850.268726-40.53363-70.476411-71.23731940.230527-60.46274-60.45911230.78692030.201028-70.5771520.458413-60.2236630.450
24、014-60.47137-50.466015-60.4728-480.44691660.49792120.261029-60.64102210.473130-51.397423-70.44372420.5484如此,便完成了乐曲的音调和节拍的自动分析。把此结果用函数CreateMusic处理并回放,听到的音乐是很接近原来的fmt.wav的,仅仅有两个左右的音符有偏差。代码如下:fmt=wavread( 'fmt.wav' );%sou nd(fmt, 8000)Len=len gth(fmt);Avg=norm(fmt)/sqrt(Le n);Num=0;Step=80;Pwp
25、=0;Stp=-1000;St=1;for n=1:Step:Le n-StepM=0;St=n;while M=1 & St+Step-1<=Le nPw M=max(fmt(St:St+Step-1);St=St+M-1;endif Pw>1.8*Pwp & St>Stp+1000 & Pw>AvgNum=Num+1;StartPoi nt(Num)=St;Power(Num)=Pw;Stp=St;endPwp=Pw;endTime=diff(StartPo in t Len )/8000;STime=Time-200/8000;En dPo
26、 in t=StartPo in t(2:Num) Len-200;Power=Power/max(Power);figure;holdon ;plot(fmt);axis(0 len gth(fmt) 0 0.6);title(' o ? ? ?);xlabel( 'Time' );ylabel('Sig nal');for p=1:Num'r*-');plot(StartPoint(p) StartPoint(p),0 0.6, endFreqLimit=170;for p=1:Numf=fmt(StartPoint(p):EndPo
27、int(p)-1); F_fft,t,omg=FastFourier(f);omg(floor(STime(p)*(4000-FreqLimit):ceil(STime(p)*(4000+FreqLimit)=1e5;FO=F_fft./omg;M1 M2=max(FO);Freq(p)=omg(M2)/2/pi;Name(p)=Freq2Name(Freq(p);enddisplay( 'Score £ o' );display(Name);display(Time);UnknownMusic=Name;Time;Power;Music=CreateMusic( &
28、#39;C' ,UnknownMusic, 'Exp' , 'Guitar+' );PlayAndPlot(Music);(10) 用 (7) 计算出来的傅里叶级数再次完成第 (4) 题,听一听是否像演奏fmt.wav 的吉他演奏出来的?答:在( 7)中计算出来的傅里叶级数中取前四项,后面的谐波并不显著将其略 去。基波和 2、3、4次谐波的系数为如下,将其归一后再合成即可。合成的方法 参考了学长的报告。music_score = 5 5 6 2 1 1 6 2;0 0 0 0 0 0 -1 0;1 0.5 0.5 2 1 0.5 0.5 2;time =
29、 5;harmonic_coefficient = 0.0538 0.0753 0.0464 0.0482;harmonic_coefficient = harmonic_coefficient / norm(harmonic_coefficient);diatio ni c_scale = 220 * 2.A(3 5 7 8 10 12 14 + 5) / 12);t = 0 : 1 / 8000 : time;music_wave = zeros(1, length(t);time_start = 0;speed = 0.5;for n = 1 : length(music_score)f
30、requency = diationic_scale(music_score(1, n) * 2 A music_score(2,n);time_end = time_start + music_score(3, n) * speed ;envelope = GetEnvelope3(time, time_start, time_end);for m = 1 : 4music_wave = music_wave + harmonic_coefficient(m) * sin(2 * pi *m * frequency * t) .* (t >= time_start & t < time_end) .* envelope;endtime_start = time_end;endmusic_wave = music_wave / max(music_wave);sound(music_wave, 8000);(11) 也许(9) 还不是很像, 因为对于一把泛音丰富的吉他而言, 不可能每个音调 对应的泛音数量和幅度都相同。但是通过完成第 (8) 题,你已经提取出 fmt.wav 中的很多音调, 或者说, 掌握了每个音调对应的傅里叶级数, 大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清远工厂门禁考勤制度
- 煤矿掘进队考勤制度规定
- 生产车间员工考勤制度
- 疫情居家考勤制度范本
- 直播电商团队考勤制度
- 社区安保队员考勤制度
- 秦皇岛市税务局考勤制度
- 细化帮扶干部考勤制度
- 考勤制度幽默通知模板
- 职工工作纪律及考勤制度
- 2024年山西新华书店集团有限公司招聘笔试参考题库含答案解析
- 智能制造企业制造成熟度能力域打分表
- 3000 吨-年果蔬干、果蔬脯生产加工项目环评报告表
- 卢氏去世前后纳兰性德词风变化探究
- 双重预防机制制度
- 欧姆龙cx-programmer操作手册
- 古代汉语(第2版)PPT完整全套教学课件
- 土地复垦-损毁预测
- GA/T 1772-2021机动车查验场地设置规范
- GB/T 4108-2004镁粉和铝镁合金粉粒度组成的测定干筛分法
- 小学二年级第二学期开学第一课课件
评论
0/150
提交评论