版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《 MATLAB 實(shí)踐 》</p><p><b> 課程設(shè)計(jì)</b></p><p> 目 錄</p><p> 1.設(shè)計(jì)目的…………………………………………………3</p><p> 2.題目分析…………………………………………………3</p><p&g
2、t; 3.總體設(shè)計(jì)…………………………………………………4</p><p> 4.具體設(shè)計(jì)…………………………………………………4</p><p> 5.結(jié)果分析…………………………………………………15</p><p> 6.心得體會(huì)…………………………………………………15</p><p><b> 設(shè)計(jì)目的:<
3、/b></p><p> 運(yùn)用MATLAB實(shí)現(xiàn)MATLAB的GUI程序設(shè)計(jì)。</p><p><b> 2、題目分析:</b></p><p><b> 課程設(shè)計(jì)題目:</b></p><p> MATLAB GUI的音樂(lè)鍵盤仿真 </p><p> 課程設(shè)計(jì)
4、的基本要求:</p><p> 1)熟悉和掌握MATLAB 程序設(shè)計(jì)方法。</p><p> 2)掌握MATLAB GUI 程序設(shè)計(jì)。</p><p> 3)學(xué)習(xí)音樂(lè)合成基本知識(shí)。</p><p><b> 設(shè)計(jì)分析:</b></p><p> 這次使用的設(shè)計(jì)軟件是MATLAB的GUI模
5、塊,要設(shè)計(jì)一個(gè)音樂(lè)鍵盤要知道一個(gè)最簡(jiǎn)單的鍵盤本身要有36個(gè)發(fā)音鍵,既21個(gè)音階和15個(gè)輔音階。于是就要在界面上畫出36個(gè)pushbutton鍵,再根據(jù)其他要求的功能設(shè)計(jì)出其他相應(yīng)的模塊。</p><p> 模擬鍵盤發(fā)音是使用音頻函數(shù)soundsc將不同頻率的函數(shù)以聲音的模式表現(xiàn)出來(lái),而每個(gè)音階相差頻率f=440*2^2/12;音階與相應(yīng)的輔音階相差頻率f=440*2^1/12。有了音樂(lè)合成的這些基本知識(shí)后便可根
6、據(jù)自己需要設(shè)計(jì)界面根據(jù)功能編寫相應(yīng)的回調(diào)函數(shù)。</p><p><b> 課程設(shè)計(jì)的內(nèi)容:</b></p><p> 學(xué)習(xí)MATLAB GUI程序設(shè)計(jì),設(shè)計(jì)和實(shí)現(xiàn)一個(gè)音樂(lè)鍵盤仿真系統(tǒng)。要求:按照軟件工程方法,根據(jù)需求進(jìn)行程序的功能分析和界面設(shè)計(jì),給出設(shè)計(jì)詳細(xì)說(shuō)明。然后按照自己擬定的功能要求進(jìn)行程序設(shè)計(jì)和調(diào)試。</p><p> 1)設(shè)計(jì)音
7、樂(lè)鍵盤GUI界面,實(shí)現(xiàn)單音鍵盤的發(fā)聲。</p><p> 2)實(shí)現(xiàn)鍵盤的雙音多頻,即每個(gè)鍵盤對(duì)應(yīng)低音頻組的一個(gè)頻率和高音頻組的一個(gè)頻率,實(shí)現(xiàn)按鍵的發(fā)出雙音。</p><p> 3)能改變音樂(lè)包絡(luò)形式,實(shí)現(xiàn)音型的改變。</p><p> 4)能夠演奏一段音樂(lè)。</p><p> 5)改變鍵盤的音色,給基音加上泛音序列,模擬不同的樂(lè)器演奏
8、。</p><p> 6)選作:根據(jù)節(jié)奏節(jié)拍,根據(jù)簡(jiǎn)譜自動(dòng)演奏一段音樂(lè)。</p><p><b> 3、總體設(shè)計(jì)</b></p><p> 其中琴鍵區(qū)域?qū)崿F(xiàn)按鍵發(fā)聲,可用鼠標(biāo)點(diǎn)擊,也可以用鍵盤實(shí)現(xiàn);顯示屏區(qū)域?qū)崿F(xiàn)聲音波形的實(shí)時(shí)顯示;控制區(qū)域?qū)崿F(xiàn)對(duì)整個(gè)系統(tǒng)的控制,包括音樂(lè)播放、暫停、停止,視屏播放,樂(lè)器切換,節(jié)拍切換和諧波切換。</p
9、><p><b> 4、具體設(shè)計(jì)</b></p><p><b> 外板設(shè)計(jì)圖如下:</b></p><p> 4.1 琴鍵區(qū)域設(shè)計(jì)</p><p><b> 界面設(shè)計(jì)</b></p><p><b> 單個(gè)按鍵函數(shù)設(shè)計(jì)</b>
10、;</p><p> 該琴鍵設(shè)計(jì)為C調(diào),1對(duì)應(yīng)頻率為261.63Hz,相鄰兩鍵為一個(gè)半音,頻率比為:2^1/12,因此后面頻率類推,如2對(duì)應(yīng)293.67Hz。</p><p><b> 單個(gè)按鍵函數(shù)如下:</b></p><p> function pushbutton1_Callback(hObject, eventdata, hand
11、les)</p><p><b> f=261.63;</b></p><p> if get(handles.radiobutton3,'Value')==1;</p><p><b> N=8000;</b></p><p><b> end;</b>
12、;</p><p> if get(handles.radiobutton4,'Value')==1;</p><p><b> N=2000;</b></p><p><b> end;</b></p><p> if get(handles.radiobutton5,
13、39;Value')==1;</p><p><b> N=25000;</b></p><p><b> end;</b></p><p> if get(handles.radiobutton9,'Value')==1;</p><p><b> T=1
14、;</b></p><p><b> end;</b></p><p> if get(handles.radiobutton10,'Value')==1;</p><p><b> T=0.5;</b></p><p><b> end;</b&
15、gt;</p><p> if get(handles.radiobutton11,'Value')==1;</p><p><b> T=0.25;</b></p><p><b> end;</b></p><p> n=0:1/N:T;</p><p
16、> x=exp(-2*n);</p><p> if get(handles.radiobutton14,'Value')==1;</p><p> ft=x.*sin(f*2*pi*n);</p><p><b> end</b></p><p> if get(handles.radi
17、obutton13,'Value')==1;</p><p> ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n);</p><p><b> end</b></p><p> if get(handles.radiobutton12,'Value')==1;</p>
18、<p> ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);</p><p><b> end</b></p><p> voice=get(handles.voice,'Value')</p><p> sound(ft*voice,8
19、000);</p><p> plot(n,ft);</p><p> axis tight;</p><p><b> 實(shí)現(xiàn)結(jié)果:</b></p><p> 可以根據(jù)按下不同的鍵,發(fā)出不同音調(diào)的聲音,且沒(méi)有失真。</p><p> 4.2顯示屏區(qū)域設(shè)計(jì)</p><p
20、><b> ?。?)界面設(shè)計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> 改模塊主要功能是用來(lái)實(shí)現(xiàn)聲音波形實(shí)時(shí)顯示,因此只需要要在每個(gè)按鍵函數(shù)里面添加波形顯示函數(shù)即可:</p><p> plot(n,ft);</p><p> axis tight;&
21、lt;/p><p><b> ?。?)功能實(shí)現(xiàn)</b></p><p> 鋼琴,1/2節(jié)拍,單音波形</p><p> 敲擊,1/8節(jié)拍,2次諧波波形</p><p> 4.3 節(jié)拍切換設(shè)計(jì)</p><p><b> ?。?)界面設(shè)計(jì)</b></p><
22、p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> if get(handles.radiobutton3,'Value')==1;</p><p><b> N=8000;</b></p><p><b> end;</b></p><p>
23、 if get(handles.radiobutton4,'Value')==1;</p><p><b> N=2000;</b></p><p><b> end;</b></p><p> if get(handles.radiobutton5,'Value')==1;<
24、/p><p><b> N=25000;</b></p><p><b> end;</b></p><p> if get(handles.radiobutton9,'Value')==1;</p><p><b> T=1;</b></p>
25、<p><b> end;</b></p><p> if get(handles.radiobutton10,'Value')==1;</p><p><b> T=0.5;</b></p><p><b> end;</b></p><p&g
26、t; if get(handles.radiobutton11,'Value')==1;</p><p><b> T=0.25;</b></p><p><b> end;</b></p><p> n=0:1/N:T;</p><p><b> (3)功能實(shí)現(xiàn)
27、</b></p><p> ‘duo’音,1/2節(jié)拍:</p><p> ‘duo’音,1/4節(jié)拍:</p><p> ‘duo’音,1/8節(jié)拍:</p><p> 4.4 諧波切換設(shè)計(jì)</p><p><b> (1)界面設(shè)計(jì)</b></p><p>
28、;<b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> if get(handles.radiobutton14,'Value')==1;</p><p> ft=x.*sin(f*2*pi*n);</p><p><b> end</b></p><p> if get(h
29、andles.radiobutton13,'Value')==1;</p><p> ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n);</p><p><b> end</b></p><p> if get(handles.radiobutton12,'Value')==1
30、;</p><p> ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);</p><p><b> end</b></p><p><b> (3)功能實(shí)現(xiàn)</b></p><p> ‘duo’音,單音諧波:</p&
31、gt;<p> ‘duo’音,1次諧波:</p><p> ‘duo’音,2次諧波:</p><p> 4.5 音樂(lè)播放設(shè)計(jì)</p><p><b> (1)界面設(shè)計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> Mus
32、ic:選取音樂(lè)</p><p> function pushbutton35_Callback(hObject, eventdata, handles)</p><p> global yinyue;</p><p> [FileName,PathName]=uigetfile('*.wav','Music Play');<
33、;/p><p> [y,fs,bits]=wavread(FileName);</p><p> yinyue=audioplayer(y,fs)</p><p> voice=get(handles.voice,'Value')</p><p> play(yinyue);</p><p> P
34、auses:播放暫停</p><p> function pushbutton38_Callback(hObject, eventdata, handles)</p><p> global yinyue;</p><p> pause(yinyue);</p><p><b> Stop:播放停止</b><
35、;/p><p> function pushbutton37_Callback(hObject, eventdata, handles)</p><p> global yinyue;</p><p> stop(yinyue);</p><p> Resume:播放恢復(fù)</p><p> function pu
36、shbutton40_Callback(hObject, eventdata, handles)</p><p> global yinyue;</p><p> resume(yinyue);</p><p><b> ?。?)功能實(shí)現(xiàn)</b></p><p> 4.6 電影播放設(shè)計(jì)</p><
37、;p><b> (1)界面設(shè)計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> function pushbutton48_Callback(hObject, eventdata, handles)</p><p> [name,path]=uigetfile('*.*
38、39;,'');</p><p> file=sprintf('%s%s',path,name);</p><p> mplay(file,24);</p><p><b> ?。?)功能實(shí)現(xiàn)</b></p><p> 4.7 音量控制設(shè)計(jì)</p><p>&
39、lt;b> ?。?)界面設(shè)計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> voice=get(handles.voice,'Value')</p><p> sound(ft*voice,8000);</p><p><b> ?。?)功能
40、實(shí)現(xiàn)</b></p><p><b> 能實(shí)現(xiàn)對(duì)音量的調(diào)節(jié)</b></p><p> 4.8鍵盤控制發(fā)音設(shè)計(jì)</p><p><b> (1)界面設(shè)計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> fu
41、nction figure1_KeyPressFcn(hObject, eventdata, handles)</p><p> if get(gcf,'CurrentCharacter')==49, %Èç¹û°´ÏµÄÊÇ1</p><p>
42、 pushbutton10_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==50, %Èç¹û°´ÏµÄÊÇ2</p><p> p
43、ushbutton15_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==51, %Èç¹û°´ÏµÄÊÇ3</p><p> pus
44、hbutton16_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==52, %Èç¹û°´ÏµÄÊÇ4</p><p> pushb
45、utton17_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==53, %Èç¹û°´ÏµÄÊÇ5</p><p> pushbu
46、tton18_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')=='C', %Èç¹û°´ÏµÄÊÇC</p><p>
47、 pushbutton1_Callback(hObject,eventdata,handles); end</p><p> if get(gcf,'CurrentCharacter')==68, %Èç¹û°´ÏµÄÊÇD</p><p>
48、pushbutton2_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==69, %Èç¹û°´ÏµÄÊÇE</p><p> pus
49、hbutton3_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==70, %Èç¹û°´ÏµÄÊÇF</p><p> pushbu
50、tton4_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==71, %Èç¹û°´ÏµÄÊÇG</p><p> pushbutto
51、n5_Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==65, %Èç¹û°´ÏµÄÊÇA</p><p> pushbutton6_
52、Callback(hObject,eventdata,handles);end</p><p> if get(gcf,'CurrentCharacter')==66, %Èç¹û°´ÏµÄÊÇB</p><p> pushbutton7_Cal
53、lback(hObject,eventdata,handles);end</p><p><b> ?。?)功能實(shí)現(xiàn)</b></p><p> 能通過(guò)按下對(duì)應(yīng)鍵盤,發(fā)出對(duì)應(yīng)聲音。如按下C鍵,發(fā)“duo”音</p><p> 4.9界面美觀設(shè)計(jì):選自己的圖片作為背景</p><p><b> ?。?)界面設(shè)計(jì)
54、</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> function figure1_CreateFcn(hObject, eventdata, handles)</p><p> ha=axes('units','normalized','position
55、39;,[0.583 0.01 0.417 0.984]);</p><p> uistack(ha,'down')</p><p> II=imread('2.bmp');</p><p><b> image(II)</b></p><p> colormap gray<
56、/p><p> set(ha,'handlevisibility','off','visible','off');</p><p><b> (3)功能實(shí)現(xiàn)</b></p><p> 4.10樂(lè)譜播放設(shè)計(jì)</p><p><b> ?。?)界面設(shè)
57、計(jì)</b></p><p><b> ?。?)函數(shù)設(shè)計(jì)</b></p><p> function qinpu(a,b) </p><p> f=261.6*2^(a/12);</p><p> n=0:1/8000:b*0.5;</p><p> x=exp(-2*n);
58、</p><p> ft=x.*sin(f*2*pi*n)+0.2*sin(f*2*2*pi*n)+0.3*sin(f*3*2*pi*n);</p><p> soundsc(ft);</p><p> plot(n,ft);</p><p> axis tight;</p><p> function pu
59、shbutton49_Callback(hObject, eventdata, handles)</p><p> [name,path]=uigetfile('*.*',''); </p><p> file=sprintf('%s%s',path,name);</p><p> de=importdata(f
60、ile);</p><p> for k=1:length(de)</p><p> qinpu(de(k),de(k+length(de)));</p><p> pause(0.5)</p><p><b> end</b></p><p><b> (3)功能實(shí)現(xiàn)<
61、/b></p><p> 播放事先編輯好的樂(lè)譜</p><p><b> 5、結(jié)果分析</b></p><p> 基本上要求的內(nèi)容都能實(shí)現(xiàn),但是也純?cè)谝恍┣啡保?lt;/p><p> ?。?)使用鍵盤發(fā)聲時(shí)如果彈得太快,函數(shù)執(zhí)行的速度跟不上容易形成音階與節(jié)拍對(duì)不上位,在用其演奏歌曲時(shí)有點(diǎn)欠缺。</p>
62、<p> ?。?)在播放視頻時(shí)無(wú)法將食品中的聲音一起播出,我有上網(wǎng)查過(guò)好像MATLAB現(xiàn)在還無(wú)法實(shí)現(xiàn)播放視頻連帶視頻中的聲音。</p><p> ?。?)樂(lè)器切換功能做的不夠完善,一方面也是因?yàn)樽约簩?duì)音律知識(shí)的欠缺。</p><p> 在今后的學(xué)習(xí)過(guò)程中,希望能通過(guò)自己的努力去完成修補(bǔ)這些欠缺的點(diǎn)。</p><p><b> 6、心得體會(huì)
63、</b></p><p> 說(shuō)實(shí)在的這次的MATLAB實(shí)驗(yàn)的題目比較令人感興趣,無(wú)論是做PS,音樂(lè)鍵盤還是數(shù)據(jù)庫(kù)都讓人比較有興趣去嘗試。跟以往很學(xué)術(shù)性的實(shí)驗(yàn)課設(shè)題目大大不同,做完實(shí)驗(yàn)每個(gè)人都可以利用自己的作品要么玩弄自己的照片,要嘛編歌或者自彈自唱等!模板的設(shè)計(jì)多種做樣格局自己的審美可以設(shè)計(jì)不同的界面。查數(shù)據(jù)、編程序的過(guò)程也可以讓自己學(xué)到許多知識(shí)同時(shí)也培養(yǎng)了自己的動(dòng)手能力,總之,通過(guò)這次試驗(yàn)和同學(xué)的
64、交流學(xué)到了很多東西,培養(yǎng)了動(dòng)手實(shí)驗(yàn)的興趣也很有成就感。</p><p> 通過(guò)對(duì)電子琴此程序的研究與設(shè)計(jì),對(duì)我們以后論文的書寫打下了堅(jiān)實(shí)的基礎(chǔ),同時(shí)也使思想提前進(jìn)入了對(duì)論文的思考,這些無(wú)疑是給我們提供了一個(gè)很好的平臺(tái)。</p><p><b> 參考書目:</b></p><p> MATLAB實(shí)用教程(第二版)電子工業(yè)出版社</p
65、><p> 《信號(hào)與系統(tǒng)—MATLAB綜合實(shí)驗(yàn)》 谷源濤 高等教育出版社</p><p> 張志涌 等 精通MATLAB【M】6.5版 .北京:北京航空航天大學(xué)出版社,2003,3</p><p> 董霖. MATLAB使用詳解——基礎(chǔ)、開發(fā)及工程應(yīng)用 北京:電子工業(yè)出版社,2009.1</p><p> 蔡旭輝,劉衛(wèi)國(guó),蔡立燕. MA
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- matlab課程設(shè)計(jì)--gui圖像處理
- matlab課程設(shè)計(jì)報(bào)告---基于matlab_gui_的濾波器設(shè)計(jì)軟件
- matlab課程設(shè)計(jì)---matlab程序應(yīng)用與仿真
- matlab與通信仿真課程設(shè)計(jì)報(bào)告
- matlab與仿真系統(tǒng)課程設(shè)計(jì)報(bào)告
- matlab課程設(shè)計(jì)---利用matlab仿真軟件進(jìn)行繪圖
- matlab課程設(shè)計(jì)報(bào)告
- matlab課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告——matlab瑞利衰落信道仿真
- 課程設(shè)計(jì)報(bào)告——matlab瑞利衰落信道仿真
- matlab課程設(shè)計(jì)--matlab的繪圖
- matlab課程設(shè)計(jì)報(bào)告 (2)
- 《matlab課程設(shè)計(jì)》報(bào)告-matlab的基本運(yùn)算與繪圖
- matlab課程設(shè)計(jì)--matlab矩陣操作設(shè)計(jì)
- 自激振蕩系統(tǒng)matlab仿真課程設(shè)計(jì)
- matlab課程設(shè)計(jì)
- matlab課程設(shè)計(jì)
- matlab課程設(shè)計(jì)--ssb信號(hào)的仿真分析
- 基于matlab的am調(diào)制仿真課程設(shè)計(jì)
- 基于matlab的pcm系統(tǒng)仿真課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論