基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)_第1頁
基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)_第2頁
基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)_第3頁
基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)_第4頁
基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于MATLAB的數(shù)字信號發(fā)生器及簡易電子琴設(shè)計(jì)摘 要數(shù)字信號發(fā)生器是一種基于軟硬件結(jié)合實(shí)現(xiàn)的函數(shù)波形產(chǎn)生儀器。在工程實(shí)踐中需要檢測和分析的各種復(fù)雜信號均可分解成各種簡單信號之和,而這些簡單信號皆可由數(shù)字信號發(fā)生器模擬產(chǎn)生,因此它在工程分析和實(shí)驗(yàn)教學(xué)中有著廣泛的應(yīng)用。MATLAB是一個數(shù)據(jù)分析和處理功能十分強(qiáng)大的工程實(shí)用軟件,它的數(shù)據(jù)采集工具箱為實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出提供了十分方便的函數(shù)和命令,在數(shù)字信號處理方面方便實(shí)用。本文介紹了一種使用MATLAB建立一個簡單數(shù)字信號發(fā)生器的基本流程,并詳細(xì)敘述了簡單波形(正弦波、方波、三角波、鋸齒波、白噪聲、脈沖、階躍、斜坡)信號的具體實(shí)現(xiàn)方法。最后,利用

2、簡單的正弦波信號和PC的聲卡設(shè)計(jì)了一個簡易電子琴。關(guān)鍵字:MATLAB,數(shù)字信號發(fā)生器,簡易電子琴1 概述隨著計(jì)算機(jī)技術(shù)和測試技術(shù)的不斷發(fā)展,傳統(tǒng)的測試儀器正向虛擬化方向發(fā)展,特別是在試驗(yàn)教學(xué)領(lǐng)域。虛擬儀器作為現(xiàn)代儀器技術(shù)和計(jì)算機(jī)技術(shù)深層次結(jié)合的產(chǎn)物,更是得到了廣泛應(yīng)用。信號發(fā)生器原本是模擬電子技術(shù)發(fā)展的產(chǎn)物,但本文設(shè)計(jì)出的數(shù)字信號發(fā)生器是基于計(jì)算機(jī)軟硬件實(shí)現(xiàn)的數(shù)字信號發(fā)生器,是一種虛擬儀器。2 設(shè)計(jì)原理常用的數(shù)字信號發(fā)生器一般可產(chǎn)生正弦信號、方波信號、三角波信號、鋸齒波信號、白噪聲信號、脈沖信號、階躍信號、斜坡信號等。此時的數(shù)字信號又可稱為離散信號,即時間為離散變量的信號。它只在離散時間上給

3、出函數(shù)值,是時間上不連續(xù)的“序列”。離散時間的間隔是均勻的,以表示。的值由信號的采樣頻率決定。為保證采樣后信號能真實(shí)地保留原始模擬信號信息,信號采樣頻率必須至少為原信號中最高頻率成分的2倍。這是采樣的基本法則,稱為采樣定理。本文為了使產(chǎn)生的數(shù)字信號更接近原始的模擬信號,采用的采樣頻率為原始信號頻率的30倍。MATLAB程序提供了常用的各種基本信號的生成函數(shù)。本設(shè)計(jì)需模擬的八種信號大部分都直接使用了MATLAB提供的函數(shù),只有少數(shù)幾個信號沒有調(diào)用函數(shù),直接編寫的。為了模擬信號發(fā)生器的設(shè)置,本設(shè)計(jì)也將常用信號的幅值、頻率、相位設(shè)計(jì)成可調(diào)的。2.1 正弦信號的實(shí)現(xiàn)正弦波信號的數(shù)學(xué)表達(dá)式如下式(2.1

4、)所示, (2.1) 其中:為幅值;為頻率;為相位。在MATLAB中,將時間變量離散化并構(gòu)造成一個一維數(shù)組,如下式(2.2)所示, (2.2)其中:為采樣頻率。相應(yīng)的正弦波信號的數(shù)字信號表達(dá)式如下式(2.3)所示, (2.3) 幅值、頻率、相位參數(shù)可以由用戶界面上的滑動條或編輯框輸入。在分別得到與的離散值后,用plot作圖函數(shù)即可獲得波形顯示。2.2 方波信號的實(shí)現(xiàn)在MATLAB中,可以用函數(shù)直接生成一個方波信號,其函數(shù)原型為,該函數(shù)可生成一個周期為,峰值為,占空比為的方波,的默認(rèn)值為50%。利用該函數(shù),可得到幅值、頻率、相位可調(diào)的方波信號函數(shù)如下式(2.4)所示, (2.4) 2.3 三角波

5、信號的實(shí)現(xiàn)在MATLAB中,可以用函數(shù)直接生成一個三角波信號,其函數(shù)原型為,該函數(shù)可生成一個周期為,峰值為,最大值出現(xiàn)在位置的三角波。利用該函數(shù),可得到幅值、頻率、相位可調(diào)的三角波信號函數(shù)如下式(2.5)所示, (2.5)2.4 鋸齒波信號的實(shí)現(xiàn)將上述2.3節(jié)中函數(shù)中的參數(shù)值設(shè)為1,即可得到鋸齒波。利用該函數(shù)得到的幅值、頻率、相位可調(diào)的鋸齒波信號函數(shù)如下式(2.6)所示, (2.6)2.5 白噪聲信號的實(shí)現(xiàn)白噪聲是指功率譜密度在整個頻域內(nèi)均勻分布的噪聲。白噪聲的實(shí)現(xiàn)可借助于MATLAB中的函數(shù),它的功能是產(chǎn)生一個均值為0,標(biāo)準(zhǔn)差為1的隨機(jī)數(shù)列或矩陣,該函數(shù)有多種調(diào)用形式,下式(2.7)即可得到

6、一個均值為0,標(biāo)準(zhǔn)差為的維的隨機(jī)矩陣。 (2.7) 其中,為幅值;。2.6 脈沖信號的實(shí)現(xiàn)考慮到脈沖信號與方波信號波形相似,故以方波信號函數(shù)函數(shù)為基礎(chǔ),將函數(shù)值加1,即可得到最大值為2,最小值為0的脈沖波形,原函數(shù)的參數(shù)可以用來調(diào)節(jié)脈沖的寬度。利用該函數(shù),得到的幅值、頻率、相位可調(diào)的脈沖信號函數(shù)如下式(2.8)所示, (2.8) 2.7 階躍信號的實(shí)現(xiàn)階躍信號的數(shù)學(xué)表達(dá)式如下式(2.9)所示, (2.9) 將上式用MATLAB程序語言轉(zhuǎn)換一下,即可得階躍信號函數(shù)如下式(2.10)所示, (2.10)2.8 斜坡信號的實(shí)現(xiàn)斜坡信號的數(shù)學(xué)表達(dá)式如下式(2.11)所示, (2.11) 其中,為斜坡的

7、斜率。將上式中的時間離散化后,即可得到斜坡信號的數(shù)字信號函數(shù)。2.9 簡易電子琴的實(shí)現(xiàn)數(shù)字電子琴的功能是基于數(shù)字信號發(fā)生器的,通過調(diào)用數(shù)字信號發(fā)生器產(chǎn)生一系列指定的頻率的聲音,從而達(dá)到虛擬的電子琴的功能。設(shè)計(jì)界面中包含A、B、O共15個琴鍵,每個按鍵對應(yīng)一個頻率的正弦波信號,各按鍵對應(yīng)的信號頻率分別為131、147、165、175、196、220、247、262、294、330、349、392、440、494、523Hz。當(dāng)用鼠標(biāo)按下對應(yīng)的鍵時即可發(fā)出相應(yīng)頻率的聲音。聲音的大小可由滑動條進(jìn)行調(diào)節(jié)。最后,利用電子琴發(fā)聲原理做了一首簡單的生日歌。3 MATLAB程序設(shè)計(jì)3.1 圖形界面設(shè)計(jì)首先打開

8、MATLAB,在命令窗口中輸入guide命令進(jìn)入GUI圖形設(shè)計(jì)界面。再新建一個空白的圖形界面文件,添加如下的控件并設(shè)計(jì)它們的布局。(1) 添加1個axes控件,用于顯示波形;(2) 添加10個static text控件,用于窗口及其他控件的說明使用;(3) 添加3個panel控件,將一組相關(guān)的控件框在一起;(4) 添加4個slider 控件,其中3個用于輸入信號的幅值、頻率、相位參數(shù)值,另1個用于調(diào)節(jié)電子琴的音量;(5) 添加3個edit text控件,用于輸入和顯示幅值、頻率和相位參數(shù)值;(6) 添加28個push button控件,其中8個用于控制輸出8種相應(yīng)的信號波形,4個用于控制放大和

9、縮小坐標(biāo)系中顯示的波形圖形的大小,15個用于控制輸出電子琴的15個音符,最后1個控制輸出一首簡單的生日歌。雙擊各個控件,打開其屬性編輯窗,即可修改其名稱、顏色、大小、初始值及位置等屬性。最終編輯好的界面如下圖所示:3.2 MATLAB編程當(dāng)界面控件及布局創(chuàng)建完成以后,點(diǎn)擊運(yùn)行即可自動生成包含各控件回調(diào)函數(shù)在內(nèi)的m文件。MATLAB對于輸入框、按鈕及滑動條等控件的響應(yīng)都是通過自動調(diào)用相應(yīng)的回調(diào)函數(shù)來實(shí)現(xiàn)的。回調(diào)函數(shù)即在一定的操作下自動執(zhí)行的指令代碼。信號發(fā)生器相關(guān)的控制控件有幅值、頻率和相位的輸入控件:滑動條和編輯框;顯示對應(yīng)波形的按鈕以及放大和縮小顯示圖形的按鈕。下面以正弦波信號發(fā)生器為例,依

10、次介紹各類功能控件回調(diào)函數(shù)的編寫。(1)以幅值輸入為例,說明將滑動條和編輯框關(guān)聯(lián)起來,都作為波形的參數(shù)輸入的方法。實(shí)現(xiàn)的代碼及說明如下:% - Executes on slider movement.function slider_amplitude_Callback(hObject, eventdata, handles)w=get(hObject,'value');set(handles.edit_amplitude,'string',num2str(w);上面代碼為幅值對應(yīng)的滑動條的回調(diào)函數(shù),第一句獲取滑動條的值,第二句將獲取到的值轉(zhuǎn)換輸出到編輯框中。fu

11、nction edit_amplitude_Callback(hObject, eventdata, handles)v=get(hObject,'string');set(handles.slider_amplitude,'value',str2double(v); 上面代碼為幅值對應(yīng)的編輯框的回調(diào)函數(shù),第一句獲取編輯框的值,第二句將獲取到的值轉(zhuǎn)換輸出給滑動條。(2)以正弦波的顯示為例,說明生成并顯示正弦波的方法。實(shí)現(xiàn)的代碼如下:function pushbutton_sine_Callback(hObject, eventdata, handles)a=st

12、r2double(get(handles.edit_amplitude,'String');f=str2double(get(handles.edit_frequency,'String');q=str2double(get(handles.edit_phase,'String');Ts=4.0/f; % 設(shè)定默認(rèn)顯示周期if f<2000 % 設(shè)定采樣率 fs=44100;else fs=30*f;endt=0:1/fs:1.0; % 設(shè)定采樣時間y=a*sin(2*pi*(f*t+q/360);plot(t,y);xlabel('

13、;Time: s','fontweight','bold');ylabel('Voltage: V','fontweight','bold');wavplay(y,fs,'async'); % 播放生成的信號grid on;axis(0,Ts,-(a+1),(a+1);上面代碼為正弦波生成和顯示對應(yīng)按鈕的回調(diào)函數(shù)。首先利用get函數(shù)獲取編輯框中的參數(shù)值,然后設(shè)置采樣率,并將時間和對應(yīng)正弦函數(shù)值離散化,最后用plot函數(shù)輸出到坐標(biāo)系中。(3)以X軸圖形放大為例,說明放大坐標(biāo)系中圖形的方法。實(shí)現(xiàn)

14、的代碼如下:function pushbutton_xup_Callback(hObject, eventdata, handles)x=get(handles.axes1,'xlim');temp=x(1);x(1)=(3*x(1)+x(2)/4;x(2)=(3*x(2)+temp)/4;set(handles.axes1,'xlim',x);上面代碼為X軸圖形放大功能按鈕的回調(diào)函數(shù)。首先利用get函數(shù)獲取到X軸顯示區(qū)間數(shù)組值,然后將獲取到的區(qū)間縮小為原區(qū)間的一半大小,最后利用set函數(shù)重新設(shè)置X軸的顯示區(qū)間數(shù)組值。4 波形顯示(1) 正弦波(2) 方波(3)

15、 三角波(4) 鋸齒波(5) 白噪聲(6) 脈沖信號(7) 階躍信號(8) 斜坡信號(9) 電子琴聲音信號5 存在的問題由于本人之前只用過C和C+語言進(jìn)行程序設(shè)計(jì),對MATLAB比較陌生。這次也是初次使用MATLAB的GUI模塊,在用MATLAB語言進(jìn)行程序設(shè)計(jì)的過程中,由于受到C語言語法的影響,出現(xiàn)了很多錯誤。但經(jīng)過查閱資料后,得到了解決,并發(fā)現(xiàn)了MATLAB語言與C語言的差異。設(shè)計(jì)過程中遇到的主要問題有:(1) 對MATLAB語言語法的不熟悉,造成了一些錯誤。比如:MATLAB中的數(shù)組元素標(biāo)號是從1開始,而不是從0開始;當(dāng)數(shù)組元素較多需要換行時,不能直接換行,而要用“”符號進(jìn)行續(xù)行;還有f

16、or、switch等語句的語法不同等。(2) MATLAB中的GUI界面與VC+中MFC對話框界面操作不同,導(dǎo)致在添加和編輯控件時由于不夠美觀,往往需要先刪除再重復(fù)添加,效率很低;(3) 由于自己對MATLAB的語法以及其函數(shù)庫不熟悉,導(dǎo)致自己的一些編程思路無法用MATLAB語言實(shí)現(xiàn),然后只好換一種思路,浪費(fèi)了一些時間。(4) 在進(jìn)行GUI界面設(shè)計(jì)時,由于對MATLAB程序不熟以及時間有限,一些可以更加美化界面的想法還不會用MATLAB實(shí)現(xiàn),比如:添加漂亮的旋鈕控件等。(5) 在進(jìn)行簡易數(shù)字電子琴的設(shè)計(jì)時,由于對音樂樂譜的認(rèn)識很淺,不能很好的理解音樂的音色、音調(diào)以及節(jié)拍等知識,導(dǎo)致最終制作出得

17、生日歌,在音色和節(jié)拍上可能存在問題。6 結(jié)束語本文通過對數(shù)字信號發(fā)生器常用幾種信號波形進(jìn)行分析,并用MATLAB中提供的函數(shù)實(shí)現(xiàn)了八種信號波形的生成和顯示。通過GUI模塊進(jìn)行界面設(shè)計(jì),最終程序運(yùn)行的結(jié)果非常好。完全實(shí)現(xiàn)了設(shè)計(jì)的任務(wù)要求。該程序可以作為數(shù)字信號處理課程的演示程序,或者作為MATLAB的應(yīng)用程序。致 謝通過本設(shè)計(jì)使我對工程數(shù)字信號處理算法與實(shí)踐這門課有了更直觀的認(rèn)識。通過理論結(jié)合實(shí)踐,既加深了我們對理論知識的理解,同時又提高了我們的實(shí)際動手應(yīng)用的能力。在課程的學(xué)習(xí)過程中,何嶺松老師一直強(qiáng)調(diào)要以提高學(xué)生的能力為目的。何老師設(shè)置的課程任務(wù)開放性很強(qiáng),每個人都可以有自己的設(shè)計(jì)思想。這樣就可以激發(fā)每個人的能動性和創(chuàng)造性。在設(shè)計(jì)過程中,遇到的所有問題都需要自己通過各種途徑想

溫馨提示

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

最新文檔

評論

0/150

提交評論