版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> DSP課程設(shè)計(jì)</b></p><p> 實(shí) 驗(yàn) 報(bào) 告</p><p> DTMF信號的產(chǎn)生及檢測</p><p> 院(系): 電子信息工程學(xué)院通信工程專業(yè)</p><p><b> 目錄</b></p><p> 一、設(shè)計(jì)
2、任務(wù)書- 3 -</p><p> 二、設(shè)計(jì)內(nèi)容- 3 -</p><p> 三、設(shè)計(jì)方案、算法原理說明- 4 -</p><p> 1.DTMF信號的產(chǎn)生- 4 -</p><p> 2.DTMF信號的檢測- 5 -</p><p> 四、程序設(shè)計(jì)、調(diào)試與結(jié)果分析- 7 -</p
3、><p> 1.程序設(shè)計(jì)部分:- 7 -</p><p> 2.調(diào)試與結(jié)果分析部分:- 28 -</p><p> 五、設(shè)計(jì)(安裝)與調(diào)試的體會(huì)- 33 -</p><p> 六、參考文獻(xiàn)- 33 -</p><p><b> 設(shè)計(jì)任務(wù)書</b></p><p
4、><b> 設(shè)計(jì)要求及目標(biāo)</b></p><p><b> 基本部分:</b></p><p> (1)使用C語言編寫DTMF信號的發(fā)生程序,要求循環(huán)產(chǎn)生0~9、*、#、A、B、C、D對應(yīng)的DTMF信號,并且符合CCITT對DTMF信號規(guī)定的指標(biāo)。</p><p> ?。?)使用C語言編寫DTMF信號的檢測程
5、序,檢測到的DTMF編碼在屏幕上顯示。</p><p><b> 發(fā)揮部分:</b></p><p> 利用DTMF信號完成數(shù)據(jù)通訊的功能,并試改進(jìn)DTMF信號的規(guī)定指標(biāo),使每秒內(nèi)傳送的DTMF編碼越多越好。</p><p><b> 設(shè)計(jì)內(nèi)容</b></p><p> 雙音多頻DTMF(D
6、ual Tone Multi Frequency)是在按鍵式電話機(jī)上得到廣泛應(yīng)用的音頻撥號信令,一個(gè)DTMF信號由兩個(gè)頻率的音頻信號疊加構(gòu)成。這兩個(gè)音頻信號的頻率分別來自兩組預(yù)定義的頻率組:行頻組和列頻組。每組分別包括4個(gè)頻率,分別抽出一個(gè)頻率進(jìn)行組合就可以組成16種DTMF編碼,分別記作0~9、*、#、A、B、C、D。如圖2-1所示。</p><p> 圖2-1 DTMF信令的編碼</p>&l
7、t;p> 要用DSP產(chǎn)生DTMF信號,只要產(chǎn)生兩個(gè)正弦波疊加在一起即可;DTMF檢測時(shí)采用改進(jìn)的Goertzel算法,從頻域搜索兩個(gè)正弦波的存在。</p><p> 設(shè)計(jì)方案、算法原理說明</p><p><b> DTMF信號的產(chǎn)生</b></p><p> DTMF發(fā)生器基于兩個(gè)二階數(shù)字正弦振蕩器,一個(gè)用于產(chǎn)生行頻,一個(gè)用于產(chǎn)
8、生列頻。DSP只要裝載相應(yīng)的系數(shù)和初始條件,就可以只用兩個(gè)振蕩器產(chǎn)生所需的八種音頻信號。典型的DTMF信號頻率范圍是700~1700Hz,選取8000Hz作為采樣頻率,即可滿足奈奎斯特定理。</p><p> 正弦波是任何波形構(gòu)成的基本元素,產(chǎn)生正弦波的方法一般有:查表法和計(jì)算法(泰勒級數(shù)展開法或數(shù)字正弦振蕩器法)。</p><p> 這里我們使用計(jì)算法產(chǎn)生正弦波,有以下兩種方案:&l
9、t;/p><p> 方案一:使用數(shù)字正弦振蕩器計(jì)算法產(chǎn)生正弦波</p><p> 圖3-1 DTMF數(shù)字振蕩器對</p><p> 由圖3-1所示數(shù)字振蕩器對的框圖,可以得到DTMF數(shù)字振蕩器對的二階系統(tǒng)函數(shù)的差分方程為:</p><p> 其中 , , , 為采樣頻率, 為輸出正弦波的頻率, 為輸出正弦波的幅度。該式初值為 , 。<
10、;/p><p> 其中,上面一個(gè)數(shù)字振蕩器用于產(chǎn)生行頻,下面一個(gè)數(shù)字振蕩器用于產(chǎn)生列頻,將行頻信號和列頻信號通過加法器進(jìn)行疊加即可產(chǎn)生DTMF信號。</p><p> 方案二:使用sin函數(shù)產(chǎn)生正弦波</p><p> 直接利用sin函數(shù)生成離散的正弦值,其生成DTMF信號的方程為:</p><p> y[t]=sin(t*2*pi*f1
11、/fs)+sin(t*2*pi*f2/fs)</p><p> 其中t為采樣序數(shù),由0開始遞增;f1,f2為生成DTMF信號的兩個(gè)正弦波的頻率;fs為采樣頻率,由前面的分析可知,采樣頻率應(yīng)該設(shè)定為8000Hz。</p><p> 將行頻信號的采樣值與列頻信號的采樣值進(jìn)行疊加,即可得到序數(shù)為t時(shí)的采樣值,即為y[t]。</p><p> 將兩種方案進(jìn)行比較后,我
12、們認(rèn)為,使用正弦振蕩器計(jì)算法這種方法計(jì)算時(shí)所需的計(jì)算量小,但是由于使用了迭代的方法產(chǎn)生樣點(diǎn)值,所以當(dāng)前時(shí)刻的輸出序列需要反饋到輸入端。在程序中實(shí)現(xiàn),就需要不斷對y(n-1)和y(n-2)的值進(jìn)行更新。同時(shí),當(dāng)前時(shí)刻的輸出序列也會(huì)影響下一時(shí)刻和下兩個(gè)時(shí)刻的輸出。因此,如果用這種方法來產(chǎn)生長時(shí)間連續(xù)的正弦信號和余弦信號,則累積誤差較大。</p><p> 直接使用sin函數(shù)產(chǎn)生正弦波的方法,其計(jì)算時(shí)所需的計(jì)算量與方
13、案一相當(dāng),并且也能達(dá)到誤差要求。同時(shí),由于使用方案二的方法產(chǎn)生正弦波,其當(dāng)前時(shí)刻的輸出序列只與當(dāng)前時(shí)刻行頻和列頻的輸入有關(guān),所以不會(huì)產(chǎn)生累積誤差,適合用來產(chǎn)生長時(shí)間連續(xù)的DTMF信號。</p><p> 綜上所述,我們使用方案二來產(chǎn)生DTMF信號。</p><p> 根據(jù)CCITT的規(guī)定,數(shù)字之間必須有適當(dāng)長度的靜音,因此編碼器有兩個(gè)任務(wù),一是產(chǎn)生雙音頻信號的任務(wù),二是靜音任務(wù)。由于采
14、樣頻率為8000Hz,所以DSP有足夠的計(jì)算時(shí)間,可以使用查詢模式通過D/A轉(zhuǎn)換器輸出DTMF信號。CCITT規(guī)定每秒傳送/接收10個(gè)數(shù)字,即每個(gè)數(shù)字持續(xù)100ms。由于1秒采樣8000個(gè)點(diǎn),則每個(gè)數(shù)字采樣800個(gè)點(diǎn)。由于代表數(shù)字的音頻信號必須持續(xù)至少45ms,但不超過55ms。100ms內(nèi)其他時(shí)間為靜音,以便區(qū)別連續(xù)的兩個(gè)按鍵信號。所以,需要設(shè)置800個(gè)點(diǎn)的緩存,其中400個(gè)點(diǎn)用于產(chǎn)生DTMF信號中的音頻信號,另外400個(gè)點(diǎn)用于產(chǎn)生D
15、TMF信號中的靜音信號。根據(jù)這樣的設(shè)計(jì),音頻信號的持續(xù)時(shí)間為50ms,在45ms和55ms之間,滿足CCITT的規(guī)定。靜音信號的持續(xù)時(shí)間為50ms。</p><p><b> DTMF信號的檢測</b></p><p> DTMF檢測是對進(jìn)入解碼端的信號進(jìn)行檢測,并把雙音頻信號轉(zhuǎn)換成對應(yīng)的數(shù)字信息。由于數(shù)據(jù)流是連續(xù)的,為了保證DTMF檢測的實(shí)時(shí)性,因此要求檢測過程
16、必須是實(shí)時(shí)連續(xù)的。</p><p> 在輸入信號中檢測DTMF 信號,需要在輸入的數(shù)據(jù)信號流中連續(xù)地搜索DTMF 信號頻譜的存在。檢測過程有兩部分的任務(wù),一是在輸入信號中提取頻譜信息;二是檢查檢測結(jié)果的有效性。</p><p> 任務(wù)一:在輸入信號中提取頻譜信息</p><p> DTMF 解碼時(shí)在輸入信號中搜索出有效的行頻和列頻。計(jì)算數(shù)字信號的頻譜可以采用D
17、FT 及其快速算法FFT,而在實(shí)現(xiàn)DTMF 解碼時(shí),采用Goertzel 算法要比FFT 更快。通過FFT 可以計(jì)算得到信號所有譜線,了解信號整個(gè)頻域信息,而對于DTMF 信號只需關(guān)心其8 個(gè)行頻/列頻及其二次諧波信息即可,二次諧波的信息用于將DTMF 信號與聲音信號區(qū)別開。此時(shí)Goertzel 算法能更加快速的在輸入信號中提取頻譜信息。Goertzel 算法實(shí)質(zhì)是一個(gè)兩極點(diǎn)的IIR 濾波器,其算法原理框圖如圖3-2所示。</p&
18、gt;<p> 圖3-2 Goertzel算法原理框圖</p><p><b> 其傳遞函數(shù)為:</b></p><p> DTMF檢測器的核心是Goertzel算法。該算法利用二極點(diǎn)的IIR濾波器計(jì)算離散傅立葉變換值,能夠快速高效地提取輸入信號的頻譜信息。由于IIR濾波器是一個(gè)遞歸結(jié)構(gòu),它利用只有一個(gè)實(shí)系數(shù)的差分方程進(jìn)行操作,并不像DFT或FFT
19、算法那樣需要計(jì)算數(shù)據(jù)塊,而是每輸入一個(gè)樣值就執(zhí)行一次算法。</p><p> DFT計(jì)算可以等價(jià)為:</p><p> 在實(shí)際的DTMF檢測中,只需DFT的幅度(本算法為平方幅度)信息就足夠了,因此在Goertzel濾波器中,當(dāng)N點(diǎn)(相當(dāng)于DFT數(shù)據(jù)塊的長度)樣值輸入濾波器后,濾波器輸出偽DFT值vk(n),由vk(n)即可確定頻譜的幅度平方。</p><p>
20、 其中k=f*N/fs,f為輸入信號的頻率,N為樣值的個(gè)數(shù),fs為抽樣頻率。</p><p> 任務(wù)二:檢查檢測結(jié)果的有效性</p><p> 嚴(yán)格來講,DTMF信號的有效性檢驗(yàn)應(yīng)該包括幾項(xiàng)內(nèi)容,在此不一一贅述。由于嚴(yán)格意義上DTMF信號有效性的檢查實(shí)現(xiàn)起來比較困難,所以在這里我們只是進(jìn)行了簡單的有效性檢測。</p><p> 當(dāng)?shù)玫筋l譜的幅度平方 之后,將
21、幅度平方與門限作比較。門限的設(shè)定,應(yīng)該保證能夠檢測到DTMF發(fā)送信號,同時(shí)應(yīng)該保證不產(chǎn)生誤判漏判的情況。所以,門限的設(shè)定至關(guān)重要。</p><p> 在我們看來,門限的取值應(yīng)該滿足下面兩點(diǎn)要求:一是門限的大小應(yīng)該小于DTMF發(fā)送信號行頻分量和列頻分量的幅度平方,這樣才能夠有效地檢測到信號;二是門限的取值也不能太小,否則噪聲會(huì)對判決產(chǎn)生很大的影響。</p><p> 同時(shí),為了防止重復(fù)檢
22、測,下一個(gè)判決必須在檢測到靜音信號后才能有效。</p><p> 程序設(shè)計(jì)、調(diào)試與結(jié)果分析</p><p><b> 1.程序設(shè)計(jì)部分:</b></p><p> DTMF信號產(chǎn)生流程圖如圖4-1所示。</p><p> 圖4-1 信號產(chǎn)生流程圖</p><p> DTMF信號產(chǎn)生程序如
23、下:</p><p> #include <stdio.h> //程序頭文件</p><p> #include <math.h></p><p> #include <type.h></p><p> #include <board.h></p><p&
24、gt; #include <codec.h></p><p> #include <mcbsp54.h></p><p> void delay(int period); //延時(shí)子程序delay</p><p> void send(int j); //判決子程序send</p><p>
25、 HANDLE hHandset; //codec句柄變量</p><p> s16 out_buffer[800]; //輸出緩沖區(qū),數(shù)據(jù)類型為S16 </p><p> float buffer[800]; //緩沖區(qū),數(shù)據(jù)類型為float</p><p> s16 num=0; //定義num,用于查詢頻率表<
26、;/p><p> int count=0; //定義count,用于控制發(fā)送的次數(shù)</p><p> int k=0; //定義k,用于控制采樣點(diǎn)數(shù)</p><p><b> int i;</b></p><p><b> int j;</b></
27、p><p> f32 x,y; //定義x和y,用于存放發(fā)送的行頻和列頻</p><p> float fs=8000; //定義fs為抽樣頻率8000Hz</p><p> float pi=3.1415926; //定義PI的值</p><p> char telephonenumber[18
28、]; //定義字符型數(shù)組telephonenumber</p><p> //用于存放鍵入的字符</p><p> float freq[16][2]={ 941,1336, //定義16行2列的二維數(shù)組,第一列用于</p><p> 697,1209,//存放行頻,第二列用于存放列頻</p><p> 697,1336,
29、</p><p> 697,1477, </p><p> 770,1209, </p><p> 770,1336, </p><p> 770,1477, </p><p> 852,1209, </p><p> 852,1336, </p><p>
30、 852,1477, </p><p> 697,1633, </p><p> 770,1633, </p><p> 852,1633, </p><p> 941,1633, </p><p> 941,1209, </p><p><b> 941,1477 <
31、;/b></p><p><b> };</b></p><p> void main() //主程序main</p><p><b> {</b></p><p> int cnt=3; //cnt=3控制亮燈的次數(shù)為3次&l
32、t;/p><p> if(brd_init(100)) //初始化DSK板</p><p><b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> while
33、( cnt-- ) </p><p><b> {</b></p><p> brd_led_toggle(BRD_LED0); //LED0亮</p><p> delay(1000); //延時(shí)1000個(gè)時(shí)間單位</p><p> brd_led_toggle(B
34、RD_LED1);//LED1亮</p><p> delay(1000); //延時(shí)1000個(gè)時(shí)間單位</p><p> brd_led_toggle(BRD_LED2);//LED2亮</p><p> delay(1000); //延時(shí)1000個(gè)時(shí)間單位</p><p><
35、b> }</b></p><p> // 打開codec,獲取DAC的句柄</p><p> hHandset = codec_open(HANDSET_CODEC); </p><p> //設(shè)置DAC的工作參數(shù)</p><p> codec_dac_mode(hHandset, CODEC_DAC_15BI
36、T); //D/A工作在15bit模式</p><p> codec_adc_mode(hHandset, CODEC_ADC_15BIT); //A/D工作在15bit模式 </p><p> codec_ain_gain(hHandset, CODEC_AIN_6dB); //模擬輸入增益為6dB</p><p> codec_aout_gain(
37、hHandset, CODEC_AOUT_MINUS_12dB); //模擬輸出增益為</p><p><b> //-12dB</b></p><p> codec_sample_rate(hHandset,SR_8000); //D/A轉(zhuǎn)換頻率為8kHz</p><p> gets(telephonenumber); //gets函
38、數(shù),用于將鍵入的字符存入數(shù)組</p><p><b> j=0;</b></p><p> send(j); //調(diào)用send函數(shù)對發(fā)送的第一個(gè)字符進(jìn)行判定</p><p> x=freq[num][0]/fs;//查表得行頻,并賦給x</p><p> y=freq[num][1]/fs;//查表得列頻,并賦
39、給y</p><p> for(k=0;k<400;k++)</p><p> {//前400個(gè)點(diǎn)為音頻信號,存入buffer</p><p> buffer[k]=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k))*16384;</p><p> out_buffer[k]=buffer[k];//
40、將float型強(qiáng)行轉(zhuǎn)化為s16型</p><p> //后400個(gè)點(diǎn)為靜音信號,存入buffer</p><p> buffer[k+400]=0;</p><p> out_buffer[k+400]=buffer[k]; //將float型強(qiáng)行轉(zhuǎn)化為s16型</p><p><b> } </b></p
41、><p><b> i=0;</b></p><p><b> j=0;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> while (!MCBSP_XR
42、DY(HANDSET_CODEC)) {};//等待D/A轉(zhuǎn)換器準(zhǔn)備好</p><p><b> //發(fā)送</b></p><p> *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=buffer[i]; </p><p><b> i++;</b></p>&
43、lt;p> if(i==400) //采足400個(gè)樣值點(diǎn),完成第一次發(fā)送</p><p><b> {</b></p><p><b> i=0;</b></p><p><b> count++;</b></p><p> if(count
44、==20) //控制每一個(gè)數(shù)反復(fù)發(fā)送20次</p><p><b> {</b></p><p><b> count=0;</b></p><p><b> j++;</b></p><p> if(j==16) //如果發(fā)送完16個(gè)字符,則返
45、回</p><p><b> return; </b></p><p> send(j); //調(diào)用send函數(shù),對發(fā)送的字符進(jìn)行判定,返回num</p><p> x=freq[num][0]/fs; //查表得行頻,并賦給x</p><p> y=freq[num][1]/fs; //查表得列頻,并賦給y
46、</p><p> for(k=0;k<400;k++)</p><p> {//前400個(gè)點(diǎn)為音頻信號,存入buffer</p><p> buffer[k]=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k))*16384;</p><p> out_buffer[k]=buffer[k];<
47、/p><p> //后400個(gè)點(diǎn)為靜音信號,存入buffer</p><p> buffer[k+400]=0;</p><p> out_buffer[k+400]=buffer[k];</p><p><b> } </b></p><p><b> }</b>&l
48、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void send(int j) //判決子程序send,輸入j的值,輸出num的值</p><p><
49、b> {</b></p><p> switch(telephonenumber[j])</p><p><b> {</b></p><p> case '1':num=1;break;</p><p> case '2':num=2;break;</p
50、><p> case '3':num=3;break;</p><p> case '4':num=4;break;</p><p> case '5':num=5;break;</p><p> case '6':num=6;break;</p><p&
51、gt; case '7':num=7;break;</p><p> case '8':num=8;break;</p><p> case '9':num=9;break;</p><p> case 'A':num=10;break;</p><p> case &
52、#39;B':num=11;break;</p><p> case 'C':num=12;break;</p><p> case '0':num=0;break;</p><p> case 'D':num=13;break;</p><p> case '*'
53、;:num=14;break;</p><p> case '#':num=15;break;</p><p><b> }</b></p><p><b> }</b></p><p> void delay(int period) //延時(shí)子程序delay,運(yùn)用了指
54、令循環(huán)的原理,延時(shí)</p><p> { //時(shí)間的長短由輸入period決定</p><p><b> int i, j;</b></p><p> for(i=0; i<period; i++)</p><p><b> {</b></p
55、><p> for(j=0; j<period>>1; j++);</p><p><b> }</b></p><p><b> }</b></p><p> DTMF信號檢測流程圖如下:</p><p> DTMF信號檢測程序基本部分如下:<
56、/p><p> #include <stdio.h> //頭文件</p><p> #include <math.h></p><p> #include <type.h></p><p> #include <board.h></p><p
57、> #include <codec.h> </p><p> #include <mcbsp54.h></p><p> HANDLE hHandset; //codec句柄變量</p><p> float buffer[256];
58、 //DTMF樣點(diǎn)緩沖區(qū),定義其容量為256</p><p> float pi=3.1415926;</p><p> s16 test[256]; //定義數(shù)組test</p><p><b> s16 data;</b></p><p><b> int k=0
59、;</b></p><p> int detect_result[256]={0}; //緩存DTMF檢測結(jié)果</p><p><b> int l=0;</b></p><p> void delay(int period); //延時(shí)子程序delay</p><p&g
60、t; void DTMF_detect(void); //檢測子程序DTMF_detect</p><p> void main() //主函數(shù)main</p><p><b> {</b></p><p> int cnt=3; //控制燈閃爍
61、的次數(shù)為3次,如果燈循環(huán)</p><p> //亮三次,則程序運(yùn)行正常</p><p> if(brd_init(100)) //初始化DSK板</p><p><b> return;</b></p><p> while(cnt--)</p><p><b
62、> {</b></p><p> brd_led_toggle(BRD_LED0);</p><p> delay(1000);</p><p> brd_led_toggle(BRD_LED1);</p><p> delay(1000);</p><p> brd_led_toggle
63、(BRD_LED2);</p><p> delay(1000);</p><p><b> }</b></p><p> // 打開codec,獲取ADC的句柄</p><p> hHandset = codec_open(HANDSET_CODEC);</p><p> //設(shè)置D/
64、A工作在15bit模式</p><p> codec_dac_mode(hHandset, CODEC_DAC_15BIT);</p><p> //設(shè)置A/D工作在15bit模式</p><p> codec_adc_mode(hHandset, CODEC_ADC_15BIT); </p><p> //設(shè)置輸入增益為6dB<
65、;/p><p> codec_ain_gain(hHandset, CODEC_AIN_6dB);</p><p> //設(shè)置輸出增益為-6dB</p><p> codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); </p><p> //設(shè)置取樣頻率為8000Hz</p>&l
66、t;p> codec_sample_rate(hHandset,SR_8000);</p><p><b> while(1)</b></p><p><b> {</b></p><p> while (!MCBSP_RRDY(HANDSET_CODEC)) {};//等待A/D轉(zhuǎn)換器輸出數(shù)據(jù)</p&
67、gt;<p> data=*(volatile u16*)DRR1_ADDR(HANDSET_CODEC);</p><p> test[k]=data;將A/D的輸出存入數(shù)組test</p><p> buffer[k++]=data/16384.0;將16進(jìn)制整數(shù)轉(zhuǎn)化為浮點(diǎn)數(shù)存入數(shù)組buffer</p><p> if(k==256) &l
68、t;/p><p> {k=0; //當(dāng)采集滿256個(gè)樣點(diǎn)值后,調(diào)用DTMF_detect對采集</p><p> DTMF_detect();} //到的信號進(jìn)行判決</p><p><b> }</b></p><p><b> }</b></p><
69、;p> void DTMF_detect(void)</p><p><b> {</b></p><p> float w[8],a[8][3];//數(shù)組w[8]用于存放 的系數(shù)</p><p> float result[8]; //數(shù)組result[8]用于存放判決后的輸出結(jié)果</p><p>
70、 int i,j,x,y;</p><p> //k=f*N/fs,N為DFT數(shù)據(jù)塊的長度,這里取N=205,k的計(jì)算結(jié)果取整數(shù)</p><p> w[0]=2*cos(2*pi*18/205); //f=697Hz,k=18</p><p> w[1]=2*cos(2*pi*20/205); //f=770Hz,k=20</p><
71、p> w[2]=2*cos(2*pi*22/205); //f=852Hz,k=22</p><p> w[3]=2*cos(2*pi*24/205); //f=941Hz,k=24</p><p> w[4]=2*cos(2*pi*31/205); //f=1209Hz,k=31</p><p> w[5]=2*cos(2*pi*34/205)
72、; //f=1336Hz,k=34</p><p> w[6]=2*cos(2*pi*37/205); //f=1477Hz,k=37</p><p> w[7]=2*cos(2*pi*42/205); //f=1633Hz,k=42</p><p> for(i=0;i<8;i++)</p><p> { a[i
73、][0]=0; //vk(n-2)=0</p><p> a[i][1]=0; // vk(n-1)=0</p><p> for(j=0;j<205;j++)</p><p><b> {</b></p><p> a[i][2]=w[i]*a[i][1]-a[i][0]+buffer[j];/
74、/對vk(n)的值進(jìn)行計(jì)算</p><p> a[i][0]=a[i][1]; //對vk(n-2)的值進(jìn)行更新</p><p> a[i][1]=a[i][2]; //對vk(n-1)的值進(jìn)行更新</p><p><b> }</b></p><p> result[i]=a[i][1]*a[i
75、][1]+a[i][0]*a[i][0]-w[i]*a[i][1]*a[i][0];//計(jì)算 的值</p><p><b> }</b></p><p><b> j=0;</b></p><p> for(i=0;i<8;i++)</p><p><b> {</b&
76、gt;</p><p> if(result[i]>1500) //判決門限設(shè)置為1500</p><p><b> {</b></p><p><b> j++;</b></p><p> if(j==1) //第一個(gè)大于門限的是行頻信號</p><
77、p> x=i; //將行頻信號的編號賦給x</p><p> else if(j==2) //第二個(gè)大于門限的是列頻信號</p><p> y=i; //將列頻信號的編號賦給x</p><p><b> }</b></p><p><b> }</b><
78、;/p><p><b> i=-2;</b></p><p> if(j==2) //利用行頻信號的編號x和列頻信號的y確定接收到的字</p><p> //符,并將其輸出。</p><p><b> {</b></p><p> if(x==3 &&a
79、mp; y==5)</p><p><b> i=0;</b></p><p> else if(x==0 && y==4)</p><p><b> i=1;</b></p><p> else if(x==0 && y==5)</p><
80、;p><b> i=2;</b></p><p> else if(x==0 && y==6)</p><p><b> i=3;</b></p><p> else if(x==1 && y==4)</p><p><b> i=4;<
81、;/b></p><p> else if(x==1 && y==5)</p><p><b> i=5;</b></p><p> else if(x==1 && y==6)</p><p><b> i=6;</b></p><p
82、> else if(x==2 && y==4)</p><p><b> i=7;</b></p><p> else if(x==2 && y==5)</p><p><b> i=8;</b></p><p> else if(x==2 &
83、& y==6)</p><p><b> i=9;</b></p><p> else if(x==0 && y==7)</p><p> printf("The DTMF signal is A\n");</p><p> else if(x==1 &&am
84、p; y==7)</p><p> printf("The DTMF signal is B\n");</p><p> else if(x==2 && y==7)</p><p> printf("The DTMF signal is C\n");</p><p> els
85、e if(x==3 && y==7)</p><p> printf("The DTMF signal is D\n");</p><p> else if(x==3 && y==4)</p><p> printf("The DTMF signal is *\n");</p&g
86、t;<p> else if(x==3 && y==6)</p><p> printf("The DTMF signal is #\n");</p><p><b> }</b></p><p><b> if(i!=-2)</b></p><
87、;p><b> {</b></p><p> printf("The DTMF signal is %d.\r\n ",i); </p><p><b> }</b></p><p><b> }</b></p><p> void del
88、ay(int period) //延時(shí)子程序 </p><p><b> {</b></p><p><b> int i, j;</b></p><p> for(i=0; i<period; i++)</p><p&
89、gt;<b> {</b></p><p> for(j=0; j<period>>1; j++);</p><p><b> }</b></p><p><b> }</b></p><p><b> CMD文件如下: </b>
90、;</p><p><b> MEMORY</b></p><p><b> {</b></p><p> PAGE 0: VECS: origin = 0080h, length = 0080h </p><p> PRAM: origin = 7600h, length
91、 = 8000h </p><p> PAGE 1: SCRATCH: origin = 0060h, length = 0020h </p><p> DMARAM: origin = 0C00h, length = 0300h </p><p> DATA: origin = 1100h, length = 0080h </p>
92、<p> STACK: origin = 1180h, length = 0560h </p><p> INRAM: origin = 1900h, length = 0100h </p><p> HPRAM0: origin = 1A00h, length = 0002h </p><p> HPRAM1: ori
93、gin = 1A02h, length = 0280h </p><p> HPRAM2: origin = 1C82h, length = 0280h </p><p> EXRAM: origin = 1F10h, length = 4000h </p><p><b> }</b></p><p&g
94、t;<b> SECTIONS</b></p><p><b> {</b></p><p> .cinit > PRAM PAGE 0</p><p> .text > PRAM PAGE 0</p><p> .vectors > VECS PA
95、GE 0</p><p> init_var > PRAM PAGE 0</p><p> detect > PRAM PAGE 0</p><p> vrcprg > PRAM PAGE 0</p><p> matprg > PRAM PAGE 0</p><p>
96、; .stack > STACK PAGE 1</p><p> .trap > SCRATCH PAGE 1</p><p> .const > EXRAM PAGE 1</p><p> .data > EXRAM PAGE 1</p><p> .bss >
97、EXRAM PAGE 1</p><p> .cio > EXRAM PAGE 1</p><p> .switch > EXRAM PAGE 1</p><p> tables > EXRAM PAGE 1</p><p> var > EXRAM PAGE 1</p&g
98、t;<p> svctab > EXRAM PAGE 1 </p><p> vctab > EXRAM PAGE 1 </p><p> uvctab > EXRAM PAGE 1 </p><p> cuvtab > EXRAM PAGE 1
99、 </p><p> cdbktab > EXRAM PAGE 1 </p><p> logtab > EXRAM PAGE 1 </p><p> powtab > EXRAM PAGE 1 </p><p> hamtab >
100、EXRAM PAGE 1 </p><p> lgwtab > EXRAM PAGE 1 </p><p> acostab > EXRAM PAGE 1 </p><p> sqrtab > EXRAM PAGE 1 </p><p&
101、gt; acbtab > EXRAM PAGE 1 </p><p> pm03tab > EXRAM PAGE 1 </p><p> costab > EXRAM PAGE 1 </p><p> V23 > INRAM PAGE 1</p>
102、<p> FSK > INRAM PAGE 1</p><p> hpibuff0 > HPRAM0 PAGE 1</p><p> hpibuff1 > HPRAM1 PAGE 1</p><p> hpibuff2 > HPRAM2 PAGE 1</p><p> dma_bu
103、ff > DMARAM PAGE 1</p><p> DTMF信號檢測程序發(fā)揮部分:</p><p> 由于在做接收實(shí)驗(yàn)時(shí),發(fā)現(xiàn)發(fā)送端每發(fā)送一個(gè)DTMF信號,接收端總會(huì)重復(fù)輸出幾次接收到的DTMF信號。我希望能夠?qū)Τ绦蜻M(jìn)行改進(jìn),使發(fā)送端每發(fā)送一個(gè)信號,接收端只對接收到的DTMF信號進(jìn)行一次輸出。</p><p> 對基本檢測程序的改動(dòng)如下:(與基本檢
104、測程序相同的部分用省略號代替)</p><p><b> ……</b></p><p> char num_1[50];</p><p> char num_2[16];</p><p><b> int m=0;</b></p><p><b> int
105、 n=0;</b></p><p><b> ……</b></p><p><b> if(j==2)</b></p><p><b> {</b></p><p> if(x==0 && y==4)</p><p>
106、 { i=1; }</p><p> else if(x==0 && y==5)</p><p> { i=2; }</p><p> else if(x==0 && y==6)</p><p> { i=3; }</p><p> else if(x==1 &a
107、mp;& y==4)</p><p> { i=4; }</p><p> else if(x==1 && y==5)</p><p> { i=5; }</p><p> else if(x==1 && y==6)</p><p> { i=6; }<
108、;/p><p> else if(x==2 && y==4)</p><p> { i=7; }</p><p> else if(x==2 && y==5)</p><p> { i=8; }</p><p> else if(x==2 && y==6)&
109、lt;/p><p> { i=9; }</p><p> else if(x==3 && y==5)</p><p> { i=0; }</p><p> else if(x==0 && y==7)</p><p> { num_1[m]='A';m++
110、;}</p><p> else if(x==1 && y==7)</p><p> { num_1[m]='B';m++ ;}</p><p> else if(x==2 && y==7)</p><p> { num_1[m]='C';m++ ; }</
111、p><p> else if(x==3 && y==7)</p><p> { num_1[m]='D';m++ ; }</p><p> else if(x==3 && y==4)</p><p> { num_1[m]='*';m++;}</p>
112、<p> else if(x==3 && y==6)</p><p> { num_1[m]='#';m++; }</p><p><b> }</b></p><p><b> if(i!=-1)</b></p><p> { num_
113、1[m]='i'; m++ ;}</p><p><b> if(m==1)</b></p><p><b> {</b></p><p> num_2[0]=num_1[0]; //將num_1[m]中的第一個(gè)數(shù)送入 num_2[n]中。 </p><p><b
114、> n++;</b></p><p><b> }</b></p><p><b> if(m>1)</b></p><p><b> {</b></p><p> if(num_1[m-1]!=num_1[m-2]) //將num_1[m]中
115、的后一個(gè)元素與前一個(gè)元素比較</p><p><b> {</b></p><p> num_2[n]=num_1[m-1]; //若兩者不相同,則將元素存入num_2[n] </p><p><b> n++;</b></p><p><b> }</b><
116、/p><p><b> }</b></p><p> for(n=0;n<16;n++) //將num_2中的元素輸出</p><p><b> {</b></p><p> printf("The DTMF signal is %s.\r\n ",nu
117、m_2[n]);</p><p><b> }</b></p><p><b> } </b></p><p> 由上述程序可以很容易看出,我們對于接收程序的輸出進(jìn)行了判別控制,將接收到信號先存入數(shù)組num_1[m],再對數(shù)組num_1[m]中的元素進(jìn)行比較。若num_1[m+1]與num_1[m]不相同,則將num
118、_1[m+1]中的元素送入num_2[n];反之,則不進(jìn)行操作。這樣就能夠保證接收到相同信號時(shí)只進(jìn)行一次輸出。但是,由此也帶來一點(diǎn)點(diǎn)小的問題,就是如果發(fā)送端發(fā)送兩個(gè)相同的信號時(shí),接收端也只是輸出一個(gè)信號,所以此時(shí)要求發(fā)送的前后兩個(gè)信號不能相同,這會(huì)給實(shí)際應(yīng)用帶來一定的麻煩。</p><p> 2.調(diào)試與結(jié)果分析部分:</p><p><b> 調(diào)試步驟:</b>&
119、lt;/p><p><b> 啟動(dòng)CCS軟件;</b></p><p><b> 新建工程;</b></p><p> 向工程中添加源文件、cmd文件、庫文件和頭文件;</p><p><b> 編譯并運(yùn)行程序;</b></p><p> 待運(yùn)行無
120、錯(cuò)后,將第四步生成的.out文件下載到DSK板中,并點(diǎn)擊run,開始在DSK板中運(yùn)行程序。(注意在進(jìn)行DTMF雙機(jī)通信時(shí),應(yīng)該先運(yùn)行接收程序,等待接收,然后再運(yùn)行發(fā)送程序,這樣才能保證完整接收到發(fā)送信號。)</p><p><b> 結(jié)果與結(jié)果分析:</b></p><p> 1.運(yùn)行發(fā)送端程序后,發(fā)送端的LED燈循環(huán)亮三次,證明程序正常運(yùn)行。之后,發(fā)送端電腦屏幕
121、上出現(xiàn)如下所示的對話框,通過鍵盤輸入要發(fā)送的按鍵信號,注意不要超過16位。</p><p> 2.要觀測發(fā)送端信號的時(shí)域波形,需要對CCS軟件的Graph Property Dialog的參數(shù)進(jìn)行如下圖所示的設(shè)置。設(shè)置的具體含義如下,Single Time是指觀察時(shí)域波形,out_buffer是發(fā)送程序的輸出緩沖區(qū),其數(shù)據(jù)類型為是s16,所以下面應(yīng)該相應(yīng)設(shè)定為16-bit signed integer。Buff
122、er size 為需要觀察的樣點(diǎn)數(shù)目,在這里設(shè)為200,得實(shí)驗(yàn)結(jié)果如下:</p><p> 由于發(fā)送的DTMF信號是兩個(gè)正弦信號的疊加,實(shí)驗(yàn)所得波形很好地驗(yàn)證了這一點(diǎn)。由于觀察時(shí)域波形時(shí),只取了200個(gè)取樣點(diǎn)。由于發(fā)送一個(gè)字符,需要發(fā)送400個(gè)音頻信號和400個(gè)靜音信號。由于取樣點(diǎn)的個(gè)數(shù)取得較少,沒能觀察到靜音信號。當(dāng)取樣點(diǎn)數(shù)大于800時(shí),即可分辨出靜音信號和音頻信號。</p><p>
123、 3.要觀測發(fā)送端信號的頻域波形,需要對CCS軟件的Graph Property Dialog的參數(shù)進(jìn)行如下圖所示的設(shè)置。設(shè)置的具體含義如下,F(xiàn)FTMagnitude是指觀察頻域波形,out_buffer是發(fā)送程序的輸出緩沖區(qū),其數(shù)據(jù)類型為是s16,所以下面應(yīng)該相應(yīng)設(shè)定為16-bit signed integer。Buffer size 為需要觀察的樣點(diǎn)數(shù)目,在這里設(shè)為200,得實(shí)驗(yàn)結(jié)果如下:</p><p>
124、 由于發(fā)送的最后一個(gè)DTMF信號為‘#’,所以觀測到的頻譜波形即為發(fā)‘#’時(shí)的頻域波形。由實(shí)驗(yàn)結(jié)果可知,兩個(gè)尖峰的頻率分別在950Hz和1500Hz左右,這與‘#’的行頻和列頻是一致的。所以實(shí)驗(yàn)正確。</p><p> 4.接收端電腦屏幕上出現(xiàn)如下所示:</p><p> 由實(shí)驗(yàn)結(jié)果可知接收到的信號與發(fā)送的信號一致,所以可以驗(yàn)證程序能夠正常接收。</p><p&g
125、t; 5.接收端的時(shí)域波形如下所示:</p><p> 6.接收端的頻域波形如下所示:</p><p> 由實(shí)驗(yàn)結(jié)果可知,兩個(gè)尖峰的所在的頻率分別約為500Hz和3500Hz。可以得知,在接收端信號的頻率發(fā)生了偏移,接收的效果沒有達(dá)到理想的狀態(tài)。</p><p> 設(shè)計(jì)(安裝)與調(diào)試的體會(huì)</p><p> 在這次實(shí)驗(yàn)的設(shè)計(jì)部分,我
126、們先搞懂了DTMF的基本原理,然后又搞懂了書上的程序,然后取其精華,為我所用,搞出了自己的程序。</p><p> 在調(diào)試程序時(shí),我們終于明白了什么叫做“紙上得來終覺淺,絕知此事要躬行”。首先遇到的一個(gè)問題就是發(fā)送0信號時(shí),接收端沒有相應(yīng)的輸出。經(jīng)過反復(fù)測試,我們終于發(fā)現(xiàn)增大存放鍵入字符的數(shù)組telephonenumber的容量就可以解決這一問題。我們將其從16位數(shù)組改為20位數(shù)組后,該問題得到了解決。 <
127、;/p><p> 上機(jī)調(diào)試時(shí)的另外一個(gè)問題就是每次接收到的第一個(gè)信號總是上次發(fā)送的最后一個(gè)信號。又是經(jīng)過反復(fù)測試,我們發(fā)現(xiàn),先對第一個(gè)數(shù)進(jìn)行判決,在將判決所得的值寫入D/A轉(zhuǎn)換器進(jìn)行發(fā)送,這樣就能保證每次接收到的第一個(gè)值都為發(fā)送的第一個(gè)值,于是我們將發(fā)送程序改為先將發(fā)送的第一個(gè)數(shù)進(jìn)行判決(send(0)),然后等待D/A轉(zhuǎn)化器發(fā)送,之后再對其他的數(shù)進(jìn)行判決,再循環(huán)等待發(fā)送。</p><p>
128、<b> 參考文獻(xiàn)</b></p><p> (1)高海林、錢滿義.DSP技術(shù)及其應(yīng)用講義.2005年10月</p><p> (2) TMS320C54x DSP Reference Set Volume 1: CPU and Peripherals.SPRU131G Texas Instrument Inc,2001</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- dtmf產(chǎn)生傳輸及檢測軟件仿真課程設(shè)計(jì)
- dsp課程設(shè)計(jì)正余弦信號的產(chǎn)生
- 基于DSP的DTMF信號檢測.pdf
- 基于dsp的dtmf的信號檢測與識(shí)別
- dtmf信號系統(tǒng)的matlab課程設(shè)計(jì)
- 基于dsp的dtmf的信號檢測與識(shí)別0
- dsp課程設(shè)計(jì)報(bào)告---設(shè)計(jì)回聲信號產(chǎn)生器
- dsp課程設(shè)計(jì)---基于dsp的回波的產(chǎn)生與抵消
- dsp課程設(shè)計(jì)---fsk信號調(diào)制
- dsp語音信號處理課程設(shè)計(jì)
- 基于dsp技術(shù)的正弦信號發(fā)生課程設(shè)計(jì)
- dsp課程設(shè)計(jì)---正弦信號發(fā)生器的設(shè)計(jì)
- dsp課程設(shè)計(jì)--正弦信號發(fā)生器的設(shè)計(jì)
- dsp課程設(shè)計(jì)——信號發(fā)生器(方波)
- 數(shù)字信號處理(dsp)課程設(shè)計(jì)報(bào)告
- 基于dsp技術(shù)的正弦信號發(fā)生課程設(shè)計(jì)
- dsp課程設(shè)計(jì)--正弦信號發(fā)生器的設(shè)計(jì)
- dsp課程設(shè)計(jì)--正弦信號發(fā)生器的設(shè)計(jì)
- 課程設(shè)計(jì)--信號波形產(chǎn)生與濾波電路設(shè)計(jì)
- dsp課程設(shè)計(jì)--基于dsp開發(fā)板的語言信號濾波處理
評論
0/150
提交評論