版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
DSP課程設計實驗報告DTMF信號的產(chǎn)生及檢測院〔系〕:電子信息工程學院-通信工程設計人員:周鈺哲學號:08211052苗祚雨08212075目錄一、設計任務書……………2二、設計內(nèi)容………………2三、設計方案、算法原理說明……………3四、程序設計、調(diào)試與結果分析…………6五、設計〔安裝〕與調(diào)試的體會…………16六、參考文獻………………16一設計任務要求雙音多頻DTMF〔DualToneMultiFrequency〕是在按鍵式機上得到廣泛應用的音頻撥號信令,一個DTMF信號由兩個頻率的音頻信號疊加構成。這兩個音頻信號的頻率分別來自兩組預定義的頻率組:行頻組和列頻組。每組分別包括4個頻率,分別抽出一個頻率進行組合就可以組成16種DTMF編碼,分別記作0~9、*、#、A、B、C、D。如下列圖1所示。圖1DTMF信令的編碼要用DSP產(chǎn)生DTMF信號,只要產(chǎn)生兩個正弦波疊加在一起即可;DTMF檢測時采用改良的Goertzel算法,從頻域搜索兩個正弦波的存在。1、根本局部:〔1〕使用C語言編寫DTMF信號的發(fā)生程序,要求循環(huán)產(chǎn)生0~9、*、#、A、B、C、D對應的DTMF信號,并且符合CCITT對DTMF信號規(guī)定的指標?!?〕使用C語言編寫DTMF信號的檢測程序,檢測到的DTMF編碼在屏幕上顯示。2、發(fā)揮局部:利用DTMF信號完成數(shù)據(jù)通訊的功能,并試改良DTMF信號的規(guī)定指標,使每秒內(nèi)傳送的DTMF編碼越多越好。3、要求完成的任務〔1〕編寫C語言程序,并在CCS集成開發(fā)環(huán)境下調(diào)試通過?!?〕實現(xiàn)設計所要求的各項功能?!?〕按要求撰寫設計報告。二、設計內(nèi)容DTMF發(fā)生器基于兩個二階數(shù)字正弦振蕩器,一個用于產(chǎn)生行頻,一個用于產(chǎn)生列頻。在輸入信號中檢測DTMF信號,需要在輸入的數(shù)據(jù)信號流中連續(xù)地搜索DTMF信號頻譜的存在。整個檢測過程分兩步:首先采用Goertzel算法在輸入信號中提取頻譜信息;接著作檢測結果的有效性檢查。Goertzel算法實質(zhì)是一個兩極點的IIR濾波器。三、設計方案、算法原理說明要用DSP產(chǎn)生DTMF信號,只要通過兩個正弦波疊加在一起即可;DTMF檢測時采用改良的Goertzel算法,從頻域搜索兩個正弦波的存在?!?〕DTMF信號的產(chǎn)生DTMF編碼器基于兩個二階數(shù)字正弦波振蕩器,一個用于產(chǎn)生行頻,一個用于產(chǎn)生列頻。向DSP裝入相應的系數(shù)和初始條件,就可以只用兩個振蕩器產(chǎn)生所需的八個音頻信號。典型的DTMF信號頻率范圍是700~1700Hz,選取8000Hz作為采樣頻率,即可滿足Nyquist條件。DTMF數(shù)字振蕩器對的二階系統(tǒng)函數(shù)的差分方程為:其中,,,為采樣頻率,為輸出正弦波的頻率,為輸出正弦波的幅度。該式初值為,。用sin函數(shù)產(chǎn)生離散的正弦值,生成DTMF的公式為:buffer[t]=sin(t*2*pi*f1/fs)+sin(t*2*pi*f2/fs)其中t為采樣序數(shù),由0開始遞增;f1,f2為生成DTMF信號的兩個正弦波的頻率;fs為采樣頻率;buffer[t]為序數(shù)t時的得出的采樣值。將這些數(shù)據(jù)轉換為Q15格式然后通過codec發(fā)送出去。CCITT對DTMF信號規(guī)定的指標是,傳送/接收率為每秒10個數(shù)字,即每個數(shù)字100ms。代表數(shù)字的音頻信號必須持續(xù)至少45ms,但不超過55ms。100ms內(nèi)其他時間為靜音,以便區(qū)別連續(xù)的兩個按鍵信號。我們使用8000Hz的采樣頻率〔信號的典型抽樣頻率為=8kHZ〕,即1秒采樣8000個點,那么100ms采樣800個點,我們設置800個點的緩存,其中用400個存產(chǎn)生的DTMF信號值,即音頻信號必須持續(xù)50ms,另外400個存0值,即靜音信號?!?〕DTMF信號的檢測DTMF檢測是對進入解碼端的信號進行檢測,并把雙音頻信號轉換成對應的數(shù)字信息。它是一個比DTMF產(chǎn)生更加復雜過程。由于數(shù)據(jù)流是連續(xù)的,為了保證DTMF檢測的實時性,因此要求檢測過程必須是實時連續(xù)的。在輸入信號中檢測DTMF信號,需要在輸入的數(shù)據(jù)信號流中連續(xù)地搜索DTMF信號頻譜的存在。整個檢測過程分兩步:首先采用Goertzel算法在輸入信號中提取頻譜信息;接著作檢測結果的有效性檢查。DTMF解碼時在輸入信號中搜索出有效的行頻和列頻。計算數(shù)字信號的頻譜可以采用DFT及其快速算法FFT,而在實現(xiàn)DTMF解碼時,采用Goertzel算法要比FFT更快。通過FFT可以計算得到信號所有譜線,了解信號整個頻域信息,而對于DTMF信號只需關心其8個行頻/列頻及其二次諧波信息即可,二次諧波的信息用于將DTMF信號與聲音信號區(qū)別開。此時Goertzel算法能更加快速的在輸入信號中提取頻譜信息。Goertzel算法實質(zhì)是一個兩極點的IIR濾波器。Goertzel算法原理:DTMF檢測器的核心是Goertzel算法。該算法利用二極點的IIR濾波器計算離散傅立葉變換值,能夠快速高效地提取輸入信號的頻譜信息。由于IIR濾波器是一個遞歸結構,它利用只有一個實系數(shù)的差分方程進行操作,并不像DFT或FFT算法那樣需要計算數(shù)據(jù)塊,而是每輸入一個樣值就執(zhí)行一次算法。完成時域到頻域的變換可以用離散傅立葉變換(DFT)或快速傅立葉變(FFT).FFT計算出所有點頻率,而DFT可以只計算感興趣的頻率點.如果要計算的頻率點數(shù)少于log2N(N為輸入信號點數(shù)),采用DFT的計算速度比FFT更快。直接計算DFT,需要很多復系數(shù),即使只計算一點的DFT也需要N個復系數(shù).采用數(shù)字信號處理中的Goertzel算法,如圖2,那么可明顯地提高速度。圖2Goertzel算法原理框圖X在實際的DTMF檢測中,只需DFT的幅度〔本算法為平方幅度〕信息就足夠了,因此在Goertzel濾波器中,當N點〔相當于DFT數(shù)據(jù)塊的長度〕樣值輸入濾波器后,濾波器輸出偽DFT值vk〔n〕,由vk〔n〕即可確定頻譜的平方幅度。其中k=f*N/fs,當N取值為125時,k的取值經(jīng)計算如表1所示:信號頻率(Hz)計算值k取整值k絕對誤差相對誤差69710.890625110.1093751.00430%77012.03125120.031250.25974%85213.3125130.31252.34741%94114.703125150.2968752.01912%120918.890625190.1093750.57899%133620.875210.1250.59880%147723.078125230.0781250.33852%163325.515625250.5156252.02082%表1一旦得到行/列頻率的頻譜平方幅度信息,就可以通過一系列的判決來確定音頻及數(shù)字結果的有效性。首先,檢測可能DTMF信號的強度是否足夠大。行頻率分量和列頻率分量的平方幅度和應高于某一確定門限。注意與DTMF頻率相符的正弦波的能量集中在頻域內(nèi)一段很窄的范圍當中,所以門限取值應占動態(tài)范圍的大局部。第二,如果DTMF信號存在,由于構成DTMF信號的行頻都低于列頻,因此從小到大依次判斷各個頻率點的頻譜幅度,得到的第一個到達門限要求的的頻率點即為行頻,第二個即為列頻,綜合行頻和列頻即可得出檢測到的按鍵信息。檢測流程圖:圖3檢測流程圖四、程序設計、調(diào)試與結果分析發(fā)送源程序代碼如下:/*****************************************************************//*DTMFsignal發(fā)送程序send.c*//*****************************************************************/#include<stdio.h>#include<math.h>#include<type.h>#include<board.h>#include<codec.h>#include<mcbsp54.h>voiddelay(intperiod);voidgenerate(intnum);HANDLEhHandset;floatbuffer[800];s16num=0;intcount=0;floatfreq[16][2]={941,1336,//鍵值0對應的行頻列頻697,1209,//1697,1336,//2697,1477,//3770,1209,//4770,1336,//5770,1477,//6852,1209,//7852,1336,//8852,1477,//9697,1633,//A770,1633,//B852,1633,//C941,1633,//D941,1209,//*941,1477//#};floatpi=3.1415926;voidmain(){ intcnt=2; if(brd_init(100)){return;} /*blinktheledsacoupletimes*/ while(cnt--)/*二極管閃兩次*/ { brd_led_toggle(BRD_LED0); //brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED1); //brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED2); //brd_delay_msec(1000); delay(1000); }/*OpenHandsetCodec*/hHandset=codec_open(HANDSET_CODEC);/*Acquirehandletocodec*//*Setcodecparameters*/codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DACin15-bitmode*/codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/codec_ain_gain(hHandset,CODEC_AIN_6dB);/*6dBgainonanaloginputtoADC*/codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB);/*-12dBgainonanalog*//*outputfromDAC*/codec_sample_rate(hHandset,SR_8000);/*8KHzsamplingrate*/generate(num);}voidgenerate(intnum){ f32x,y; intk=0; inti; i=0;while(1) { //Waitforsamplefromhandset while(!MCBSP_XRDY(HANDSET_CODEC)){}; *(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=buffer[i]; i++; if(i==800) { i=0;num++; if(num==16) num=0; x=freq[num][0]/8000; y=freq[num][1]/8000; for(k=0;k<400;k++) { buffer[k]=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k))*16384; buffer[k+400]=0; } } }}voiddelay(intperiod)/*延時子程序*/{inti,j;for(i=0;i<period;i++){for(j=0;j<period>>1;j++);}}檢測源程序代碼如下:/*****************************************************************//*DTMFsignal檢測程序receive.c*//*****************************************************************/#include<stdio.h>#include<math.h>#include<type.h>#include<board.h>#include<codec.h>#include<mcbsp54.h>HANDLEhHandset;floatbuffer[125];floatpi=3.1415926;s16receive[125];s16dacdata;intk=0;intdetect_result[100]={0};intl=0;intflag=0;voiddelay(intperiod);voiddetect();voidmain(){intcnt=2;/********************************************Description:*vk(n)=2*coef*vk(n-1)-vk(n-2)+x(n)**Coefficientsareinw[8]*x(n)isinbuffer[256]*vk(n-2)isa[i][0]*vk(n-1)isa[i][1] *vk(n)isa[i][2]*********************************************/ if(brd_init(100)){return;} //blinktheledsacoupletimes while(cnt--) { brd_led_toggle(BRD_LED0); //brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED1); //brd_delay_msec(1000); delay(1000); brd_led_toggle(BRD_LED2); //brd_delay_msec(1000); delay(1000); } /*OpenHandsetCodec*/hHandset=codec_open(HANDSET_CODEC);/*Acquirehandletocodec*/ /*Setcodecparameters*/codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DACin15-bitmode*/codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/codec_ain_gain(hHandset,CODEC_AIN_6dB);/*6dBgainonanaloginputtoADC*/codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);/*-6dBgainonanalogoutputfromDAC*/codec_sample_rate(hHandset,SR_8000);/*8KHzsamplingrate*/while(1){ while(!MCBSP_RRDY(HANDSET_CODEC)){}; dacdata=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC); receive[k]=dacdata; buffer[k]=dacdata/16384.0; k++; if(k==125) { k=0; detect(); } } }voiddetect(){inti,j,x,y;floatw[8],a[8][3],amp[8];w[0]=2*cos(2*pi*11/125); w[1]=2*cos(2*pi*12/125); w[2]=2*cos(2*pi*13/125); w[3]=2*cos(2*pi*15/125); w[4]=2*cos(2*pi*19/125); w[5]=2*cos(2*pi*21/125); w[6]=2*cos(2*pi*23/125); w[7]=2*cos(2*pi*26/125);for(i=0;i<8;i++) { a[i][0]=0; a[i][1]=0; for(j=1;j<=125;j++) { a[i][2]=w[i]*a[i][1]-a[i][0]+buffer[j-1]; a[i][0]=a[i][1]; a[i][1]=a[i][2]; }//計算頻譜的幅度平方值 amp[i]=a[i][1]*a[i][1]+a[i][0]*a[i][0]-w[i]*a[i][1]*a[i][0];} j=0; for(i=0;i<8;i++) { if(amp[i]>500)//門限設為500 {//printf("Theamplitude%dis%f.\r\n",i,amp[i]); j++; if(j==1) { x=i; } elseif(j==2) { y=i; } } } i=-1; if(flag==0){ if(j==2) { if(x==0&&y==4) {i='1';} elseif(x==0&&y==5) {i='2';} elseif(x==0&&y==6) {i='3';} elseif(x==1&&y==4) {i='4';} elseif(x==1&&y==5) {i='5';} elseif(x==1&&y==6) {i='6';} elseif(x==2&&y==4) {i='7';} elseif(x==2&&y==5) {i='8';} elseif(x==2&&y==6) {i='9';} elseif(x==3&&y==5) {i='0';} elseif(x==0&&y==7) {i='A'; } elseif(x==1&&y==7) {i='B';} elseif(x==2&&y==7) {i='C';} elseif(x==3&&y==7) {i='D';} elseif(x==3&&y==4) {i='*';} elseif(x==3&&y==6) {i='#';} } if(i!=-1) { detect_result[l]=i; l++; if(l==100) { for(l=0;l<100;l++) printf("TheDTMFsignalis%c.\r\n",detect_result[l]); } flag++;}}elseif(j==0)flag=0;}voiddelay(intperiod){inti,j;for(i=0;i<period;i++){for(j=0;j<period>>1;j++);}}cmd源代碼如下:/*###############################################################################$Id:$###################################################################################Copyright(c)1999DNAEnterprises,Inc.#################################################################################RevisionHistory####$Log:$##################################################################################################################################################################XFERMAKE.CMD####C54xLinkerCommandFilefor5402DSKMemoryTransferModule###############################################################################*//*****************************************************************************//*ObjectFiles*//*****************************************************************************//*****************************************************************************//*LinkerOptions*//*****************************************************************************//*****************************************************************************//*C5402DSKDSPMemoryMap*//**//*****************************************************************************/MEMORY{PAGE0:VECS:origin=0080h,length=0080h/*InternalProgramRAM*/PRAM:origin=0100h,length=8000h/*InternalProgramRAM*/PAGE1:SCRATCH:origin=0060h,length=0020h/*ScratchPadDataRAM*/DMARAM:origin=0C00h,length=0300h/*DMAbuffer*/DATA:origin=1100h,length=0080h/*InternalDataRAM*/STACK:origin=1180h,length=0560h/*StackMemorySpace*/INRAM:origin=1900h,length=0100h/*InternalDataRAM*/HPRAM0:origin=1A00h,length=0002h/*HPImemoryaccessiblebyHostandDSP*/HPRAM1:origin=1A02h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/HPRAM2:origin=1C82h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/EXRAM:origin=1F10h,length=4000h/*ExternalDataRAM*/}/*****************************************************************************//*DSPMemoryAllocation*//*****************************************************************************/SECTIONS{.cinit>PRAMPAGE0.text>PRAMPAGE0.vectors>VECSPAGE0init_var>PRAMPAGE0detect>PRAMPAGE0vrcprg >PRAMPAGE0matprg >PRAMPAGE0.stack>STACKPAGE1.trap>SCRATCHPAGE1.const>EXRAMPAGE1.data>EXRAMPAGE1.bss>EXRAMPAGE1.cio>EXRAMPAGE1.switch>EXRAMPAGE1tables>EXRAMPAGE1var>EXRAMPAGE1svctab>EXRAMPAGE1/*SS_VLSPtable*/vctab>EXRAMPAGE1/*VLSPtable*/uvctab>EXRAMPAGE1/*UVLSPtable*/cuvtab>EXRAMPAGE1/*Stochasticcodebook*/cdbktab>EXRAMPAGE1/*variouscodebooktables*/logtab>EXRAMPAGE1/*tableforlog2*/powtab>EXRAMPAGE1/*tableforpow2*/hamtab>EXRAMPAGE1/*tableforhamming*/lgwtab>EXRAMPAGE1/*tableforlagwindow*/acostab>EXRAMPAGE1/*tableforarccos*/sqrtab>EXRAMPAGE1/*tableforsquareroot*/acbtab>EXRAMPAGE1/*tableforthresholdsinacb*/pm03tab>EXRAMPAGE1/*tableforx^(-0.3)computation*/costab>EXRAMPAGE1/*tableforcosine*/V23>INRAMPAGE1FSK>INRAMPAGE1hpibuff0>HPRAM0PAGE1hpibuff1>HPRAM1PAGE1hpibuff2>HPRAM2PAGE1dma_buff>DMARAMPAGE1}調(diào)試與結果分析發(fā)送端的頻域圖形如圖4所示:圖4接收端的頻域圖形接受判決結果如圖5所示:圖5調(diào)試過程中產(chǎn)生的問題及解決方案1、起初采用每
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作服選購合同范本
- 長期醫(yī)藥配送合同
- 幼兒園物資選購協(xié)議范本
- 柴油購銷合同范本示例
- 焊錫絲采購合同簽訂后的履行
- 乳膠漆產(chǎn)品代理協(xié)議
- 地方特色月餅銷售合同
- 標準投資理財合同樣本
- 地址租賃協(xié)議
- 小學生科學繪本故事解讀
- 低血糖暈厥應急演練預案
- Unit 1 Making friends Part B(說課稿)-2024-2025學年人教PEP版(2024)英語三年級上冊
- 《涉江采芙蓉》 課件高中語文統(tǒng)編版必修上冊
- 2024年事業(yè)單位考試職業(yè)能力傾向測驗試題與參考答案
- 保定學院《自然語言處理》2022-2023學年第一學期期末試卷
- 北京市西城區(qū)2023-2024學年六年級上學期數(shù)學期末試卷(含答案)
- 2024年考研英語(二)真題及參考答案
- 2024年水稻種項目可行性研究報告
- 供應商質(zhì)量管理培訓課程
- 阿膠的課件教學課件
- 登高作業(yè)安全
評論
0/150
提交評論