完整版使用matlab進行簡單音樂合成_第1頁
完整版使用matlab進行簡單音樂合成_第2頁
完整版使用matlab進行簡單音樂合成_第3頁
完整版使用matlab進行簡單音樂合成_第4頁
完整版使用matlab進行簡單音樂合成_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、信號與系統(tǒng)-綜合實驗之音樂合成(1)請根據(jù)?東方紅?片斷的簡譜和“十二平均律計算出該片斷中各個樂音的頻率,在MATLAB中生成幅度為1、抽樣頻率為8kHz的正弦信號表示這些樂音.請用sound函數(shù)播放每個樂音,聽一聽音調是否正確.最后用這一系列樂音信號拼出?東方紅?片斷,注意限制每個樂音持續(xù)的時間要符合節(jié)拍,用sound播放你合成的音樂,聽起來感覺如何代碼如下: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=sin(2*pi*om

2、g5*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);聽的時候發(fā)現(xiàn)在相鄰樂音之間有雜音,這是由于相位不連續(xù)造成的.你一定注意到(1)的樂曲中相鄰樂音之間有“啪的雜聲,這是由于相位不連續(xù) 產生了高頻分量.這種噪聲嚴重影響合成音樂的質量,喪失真實感.為了消 除它,我們可以用圖1

3、.5所示包絡修正每個樂音,以保證在樂音的鄰接處信號幅度為零.此外建議用指數(shù)衰減的包絡來表示我采用的是指數(shù)衰減的包絡. 代碼如下: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).*sin(2*pi*omg2*t

4、2); 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);第一次我采用的指數(shù)衰減沒有時間前面的系數(shù),即每個都只乘expt,沒有系數(shù);后來根據(jù)不同節(jié)拍,更改了不同的衰減系數(shù),這樣聲音聽起來感覺更加圓潤.3請用最簡單的方法將2中的音樂分別升高和降低一個八度.提示:音樂播放的時間可以變化再難一些,請用 res

5、ample函數(shù)也可以用interp和decimate函數(shù)將上述音樂升高半個音階.提示:視計算復雜度,不必特別精確答:最簡單的方法是直接更改抽樣頻率f o將f從8徵為4K,那么升高一個八度,并 且播放速度增快了一倍;將f從8k改為16k,那么降低一個八度,速度也變慢了一倍.改為4000或者16000升高半個音階,只須在2代碼最后加一句resample m,1000,1059即可.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=ex

6、p(-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*omg2*t2);m=m1 m2 m3 m4 m6 m7 m8 m9;resample(m,100

7、0,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*t4).*sin(2*pi*omg5*t4)+0.2*exp(-2*t4).*sin(2*pi*2*om

8、g5*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*omg6*t8);m4=exp(-1*t2).*sin(2*pi*omg2*t2)+0.2*exp(-1*t

9、2).*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*t8).*sin(2*pi*3*omg1*t8);m8=exp(-4*t8).*sin(2*pi*omg6

10、l*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);參加諧波分量后,音色有所變化,感覺更加清脆一些.(5)自選其它音樂合成,例如貝多芬第五交響樂的開頭兩小節(jié).我選取的是?晴天?的第一句代碼如下:f=8000;t

11、2=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);m4=exp(-1*t2).*sin(2*pi*omg1*t2);m5=exp(-2*t4).*sin(2*

12、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);m13=exp(-4*t8).*sin(2*pi*omg2*t8);m14=exp(-4*t8).*sin(

13、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函數(shù)載入光盤中的fmt.wav文件,播放出來聽聽效果如何是否比剛剛的合成音樂真實多了 x=wavread( 'fmt.wav' );sound(x);(7)你知道待處理的wave2proc是如何從真實值realwave中得到的么這個預處理過程可以去除真實樂曲中的非線性諧波和噪聲,對于正確分析音調是非常重要的.提示:從時域做,可以繼

14、續(xù)使用 resample函數(shù).realwave中的波形有十個周期,要除去其中的噪聲可以采用時域求均值的方 法.步驟如下:首先用resample函數(shù)將其采樣率增大為十倍,再等分十份取平均, 然后重復這個平均后的波形十次,復原其長度,最后在用resample函數(shù)復原采樣率到1/10.代碼如下:load( 'Guitar.MAT' );wavetemp = zeros(length(realwave), 1);waveresampled = resample(realwave,10,1);for n = 1 : 10wavetemp = wavetemp + waveresample

15、d(n - 1) * length(realwave) + 1 : n* length(realwave) / 10;endmywave2proc = repmat(wavetemp, 10, 1);mywave2proc = resample(mywave2proc, 1, 10);figure;subplot(3, 1, 1);plot(realwave);subplot(3, 1,2);plot(wave2proc);subplot(3, 1, 3);plot(mywave2proc);0.5 11c1:Ar,iRftrikAft0 - aj 3小h V/j 小 -0.5 1:05010

16、0150200250(8)這段音樂的基頻是多少是哪個音調請用傅里葉級數(shù)或者變換的方法分析它的諧波分量分別是什么.提示:簡單的方法是近似取出一個周期求傅里葉級數(shù)但這樣明顯不準確,由于你應該已經發(fā)現(xiàn)基音周期不是整數(shù)(這里不允許使用resample函數(shù)).復雜些的方法是對整個信號求傅里葉變換(回憶周期性信號 的傅里葉變換),但你可能發(fā)現(xiàn)無論你如何提升頻域的分辨率,也得不到精確的 包絡(應該近似于沖激函數(shù)而不是sinc函數(shù)),可選的方法是增加時域的數(shù)據(jù) 量,即再把時域信號重復假設干次,看看這樣是否效果好多了請解釋之.答:共計221-2=219個周期;基因頻率約為8000 / (219 / 9) = 3

17、28.7671Hz. 用FFT寸該信號做DF筏換:10ad( 'Guitar.MAT' );my_wave2proc = repmat(wave2proc, 25, 1);Fs = 8000;Length = 1ength(my_wave2proc);NFFT = 2 " nextpow2(Length);Y = fft(my_wave2proc, NFFT) / Length;amplitude = 2 * abs(Y(1 : NFFT / 2 + 1);frequency = Fs / 2 * linspace(0, 1 ,NFFT / 2 + 1);plot(f

18、requency, amplitude);max_rate_of_grade, max_position = max(amplitude(1 : 100);frequency(max_position)05001000150020002500300035004000算得基頻為329.1016Hz,和前面通過周期估算得到的很相近.對照可得,為“調mi.(9)再次載入fmt.wav ,現(xiàn)在要求你寫一段程序,自動分析出這段樂曲的音調和節(jié)拍!如果你覺得太難就允許手工標定出每個音調的起止時間,再不行你就把每個音調的數(shù)據(jù)都單獨保存成一個文件,然后讓MATLAB對這些文件進行批處理.注意:不允許逐一地手工分

19、析音調.編輯音樂文件,推薦使用 CoolEdit編輯軟 件.此問參考了學長的版本.看了版本才明白了算法主要分2個步驟:1、分割出單個音符,計算每個音符的時間,2、計算每個音符的頻率,把頻率轉化為音名.分割音符即將一個一個的音符片段從整個曲子中切下.音符的起始都伴隨時域上瞬時能量的激增,即時域上波形幅度突然變大.利用這一點特征對音符進行提取.0.01選擇小步幅對fmt.wav進行掃描,步幅選為0.01秒最為適宜.具體方法如下:在秒的范圍內找極大點,而且是后續(xù)能量連續(xù)下降的極大點,這個極大點如果滿足以下三個條件,那么為有效的音符的起始點:1、這個極大點比前一段的極大點能量高出80%;Pw>1

20、.8*Pwp2、這個極大點比整個樂曲的平均能量高;St>Stp+10003、距前面最近的一個音符的起始點時間差1/8秒以上.Pw>Avg分割的結果:LanHW.S一共分割得30個音,和 CoolEdit的分析根本一致.過度局部Time=diff(StartPoint Len)/8000;EndPoint=StartPoint(2:Num) Len-200;Power=Power/max(Power);STime=Time-200/8000;每個音符的持續(xù)時間用于傅立葉變換的區(qū)間能量修正(歸一)用于傅立葉變換的區(qū)間長度計算頻率并轉化對每個音符內部的一個區(qū)間(我選這個音符的起始到結束前

21、的0.025秒,即StartPoint到EndPoint)做快速傅立葉變換,然后在頻譜中選出基頻.關于自動尋找基頻: 一般的,基波不是幅度最大的頻率,由于有很多音調的諧波, 甚至非線性諧波的幅度大于基波.一般來說,一次諧波的幅度不太大,不會大于基波幅度的2倍,這樣,在有可能出現(xiàn)基波的地方,利用每個點的幅度值除以該點的頻率,也就是每個點 對于原點的斜率做為判定基波的標準,經過這樣的簡化處理, 找到斜率最大的點, 根本上就能夠判定基波出現(xiàn)在什么位置.FO=F_fft./omg;%每個點的幅度值除以該點的頻率M1 M2=max(FO);%找到斜率最大的點,判定為基波Freq(p)=omg(M2)/2

22、/pi;% 記下頻率值Name(p尸F(xiàn)req2Name(Freq(p);%把頻率值轉化為音名(關于函數(shù) Freq2Name(Freq):把頻率與十幾個標準音的頻率作比較,選出最接近的一 個,作為這個頻率對應的音名.)display('Score : ');display(Name);display(Time); %輸出結果:#音名時長#音名時長#音名時長#音名時長1-60.16769-40.504417-60.38902510.47182-61.486610-40.74841850.268726-40.53363-70.476411-71.23731940.230527-60.

23、46274-60.45911230.78692030.202128-70.5771520.458413-60.22362120.261029-60.6410630.450014-60.47132210.473130-51.39747-50.466015-60.472823-70.44378-40.44691660.49792420.5484如此,便完成了樂曲的音調和節(jié)拍的自動分析.把此結果用函數(shù)CreateMusic處理并回放,聽到的音樂是很接近原來的fmt.wav的,僅僅有兩個左右的音符有偏差.代碼如下:fmt=wavread( 'fmt.wav' );%sound(fmt,

24、 8000)Len=length(fmt);Avg=norm(fmt)/sqrt(Len);Num=0;Step=80;Pwp=0;Stp=-1000;St=1;for n=1:Step:Len-StepM=0;St=n;while M=1 & St+Step-1<=LenPw M=max(fmt(St:St+Step-1);St=St+M-1;endif Pw>1.8*Pwp & St>Stp+1000 & Pw>AvgNum=Num+1;StartPoint(Num)=St;Power(Num)=Pw;Stp=St; endPwp=Pw; e

25、ndTime=diff(StartPoint Len)/8000;STime=Time-200/8000;EndPoint=StartPoint(2:Num) Len-200;Power=Power/max(Power);figure;hold on ;plot(fmt);axis(0 length(fmt) 0 0.6);title( ' o ? ? ?);xlabel( 'Time' );ylabel( 'Signal' );for p=1:Numplot(StartPoint(p) StartPoint(p),0 0.6,'r*-'

26、);endFreqLimit=170;for p=1:Numf=fmt(StartPoint(p):EndPoint(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(T

27、ime);UnknownMusic=Name;Time;Power;Music=CreateMusic( 'C' ,UnknownMusic, 'Exp' , 'Guitar+' );PlayAndPlot(Music);(10)用(7)計算出來的傅里葉級數(shù)再次完成第(4)題,聽一聽是否像演奏fmt.wav的吉他演奏出來的答:在(7)中計算出來的傅里葉級數(shù)中取前四項,后面的諧波并不顯著將其略 去.基波和2、3、4次諧波的系數(shù)為如下,將其歸一后再合成即可.合成的方法 參考了學長的報告.music_score = 5 5 6 2 1 1 6 2;0

28、0 0 0 0 0 -1 0;1 0.5 0.5 2 1 0.5 0.5 2;time = 5;harmonic_coefficient = 0.0538 0.0753 0.0464 0.0482;harmonic_coefficient = harmonic_coefficient /norm(harmonic_coefficient);diationic_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;sp

29、eed = 0.5;for n = 1 : length(music_score)frequency = 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)還不是很像,由于對于一把泛音豐富的吉他而言,不可能每個音調 對應的泛音數(shù)量和幅度都相同.但是通過完成第(8)題,你已經提取出fmt.wav中的很多音調,或者說,掌握了每個音調對應的傅里葉級數(shù),大致了解了這把吉他的特征.現(xiàn)在就來演奏一曲?東方紅?吧.提

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論