2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論