版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
DSP課程設(shè)計實驗報告DTMF信號的產(chǎn)生及檢測院〔系〕:電子信息工程學(xué)院-通信工程設(shè)計人員:周鈺哲學(xué)號:08211052苗祚雨08212075目錄一、設(shè)計任務(wù)書……………2二、設(shè)計內(nèi)容………………2三、設(shè)計方案、算法原理說明……………3四、程序設(shè)計、調(diào)試與結(jié)果分析…………6五、設(shè)計〔安裝〕與調(diào)試的體會…………16六、參考文獻………………16一設(shè)計任務(wù)要求雙音多頻DTMF〔DualToneMultiFrequency〕是在按鍵式機上得到廣泛應(yīng)用的音頻撥號信令,一個DTMF信號由兩個頻率的音頻信號疊加構(gòu)成。這兩個音頻信號的頻率分別來自兩組預(yù)定義的頻率組:行頻組和列頻組。每組分別包括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對應(yīng)的DTMF信號,并且符合CCITT對DTMF信號規(guī)定的指標(biāo)?!?〕使用C語言編寫DTMF信號的檢測程序,檢測到的DTMF編碼在屏幕上顯示。2、發(fā)揮局部:利用DTMF信號完成數(shù)據(jù)通訊的功能,并試改良DTMF信號的規(guī)定指標(biāo),使每秒內(nèi)傳送的DTMF編碼越多越好。3、要求完成的任務(wù)〔1〕編寫C語言程序,并在CCS集成開發(fā)環(huán)境下調(diào)試通過?!?〕實現(xiàn)設(shè)計所要求的各項功能?!?〕按要求撰寫設(shè)計報告。二、設(shè)計內(nèi)容DTMF發(fā)生器基于兩個二階數(shù)字正弦振蕩器,一個用于產(chǎn)生行頻,一個用于產(chǎn)生列頻。在輸入信號中檢測DTMF信號,需要在輸入的數(shù)據(jù)信號流中連續(xù)地搜索DTMF信號頻譜的存在。整個檢測過程分兩步:首先采用Goertzel算法在輸入信號中提取頻譜信息;接著作檢測結(jié)果的有效性檢查。Goertzel算法實質(zhì)是一個兩極點的IIR濾波器。三、設(shè)計方案、算法原理說明要用DSP產(chǎn)生DTMF信號,只要通過兩個正弦波疊加在一起即可;DTMF檢測時采用改良的Goertzel算法,從頻域搜索兩個正弦波的存在?!?〕DTMF信號的產(chǎn)生DTMF編碼器基于兩個二階數(shù)字正弦波振蕩器,一個用于產(chǎn)生行頻,一個用于產(chǎn)生列頻。向DSP裝入相應(yīng)的系數(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ù)轉(zhuǎn)換為Q15格式然后通過codec發(fā)送出去。CCITT對DTMF信號規(guī)定的指標(biāo)是,傳送/接收率為每秒10個數(shù)字,即每個數(shù)字100ms。代表數(shù)字的音頻信號必須持續(xù)至少45ms,但不超過55ms。100ms內(nèi)其他時間為靜音,以便區(qū)別連續(xù)的兩個按鍵信號。我們使用8000Hz的采樣頻率〔信號的典型抽樣頻率為=8kHZ〕,即1秒采樣8000個點,那么100ms采樣800個點,我們設(shè)置800個點的緩存,其中用400個存產(chǎn)生的DTMF信號值,即音頻信號必須持續(xù)50ms,另外400個存0值,即靜音信號?!?〕DTMF信號的檢測DTMF檢測是對進入解碼端的信號進行檢測,并把雙音頻信號轉(zhuǎn)換成對應(yīng)的數(shù)字信息。它是一個比DTMF產(chǎn)生更加復(fù)雜過程。由于數(shù)據(jù)流是連續(xù)的,為了保證DTMF檢測的實時性,因此要求檢測過程必須是實時連續(xù)的。在輸入信號中檢測DTMF信號,需要在輸入的數(shù)據(jù)信號流中連續(xù)地搜索DTMF信號頻譜的存在。整個檢測過程分兩步:首先采用Goertzel算法在輸入信號中提取頻譜信息;接著作檢測結(jié)果的有效性檢查。DTMF解碼時在輸入信號中搜索出有效的行頻和列頻。計算數(shù)字信號的頻譜可以采用DFT及其快速算法FFT,而在實現(xiàn)DTMF解碼時,采用Goertzel算法要比FFT更快。通過FFT可以計算得到信號所有譜線,了解信號整個頻域信息,而對于DTMF信號只需關(guān)心其8個行頻/列頻及其二次諧波信息即可,二次諧波的信息用于將DTMF信號與聲音信號區(qū)別開。此時Goertzel算法能更加快速的在輸入信號中提取頻譜信息。Goertzel算法實質(zhì)是一個兩極點的IIR濾波器。Goertzel算法原理:DTMF檢測器的核心是Goertzel算法。該算法利用二極點的IIR濾波器計算離散傅立葉變換值,能夠快速高效地提取輸入信號的頻譜信息。由于IIR濾波器是一個遞歸結(jié)構(gòu),它利用只有一個實系數(shù)的差分方程進行操作,并不像DFT或FFT算法那樣需要計算數(shù)據(jù)塊,而是每輸入一個樣值就執(zhí)行一次算法。完成時域到頻域的變換可以用離散傅立葉變換(DFT)或快速傅立葉變(FFT).FFT計算出所有點頻率,而DFT可以只計算感興趣的頻率點.如果要計算的頻率點數(shù)少于log2N(N為輸入信號點數(shù)),采用DFT的計算速度比FFT更快。直接計算DFT,需要很多復(fù)系數(shù),即使只計算一點的DFT也需要N個復(fù)系數(shù).采用數(shù)字信號處理中的Goertzel算法,如圖2,那么可明顯地提高速度。圖2Goertzel算法原理框圖X在實際的DTMF檢測中,只需DFT的幅度〔本算法為平方幅度〕信息就足夠了,因此在Goertzel濾波器中,當(dāng)N點〔相當(dāng)于DFT數(shù)據(jù)塊的長度〕樣值輸入濾波器后,濾波器輸出偽DFT值vk〔n〕,由vk〔n〕即可確定頻譜的平方幅度。其中k=f*N/fs,當(dāng)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ù)字結(jié)果的有效性。首先,檢測可能DTMF信號的強度是否足夠大。行頻率分量和列頻率分量的平方幅度和應(yīng)高于某一確定門限。注意與DTMF頻率相符的正弦波的能量集中在頻域內(nèi)一段很窄的范圍當(dāng)中,所以門限取值應(yīng)占動態(tài)范圍的大局部。第二,如果DTMF信號存在,由于構(gòu)成DTMF信號的行頻都低于列頻,因此從小到大依次判斷各個頻率點的頻譜幅度,得到的第一個到達門限要求的的頻率點即為行頻,第二個即為列頻,綜合行頻和列頻即可得出檢測到的按鍵信息。檢測流程圖:圖3檢測流程圖四、程序設(shè)計、調(diào)試與結(jié)果分析發(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對應(yīng)的行頻列頻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)//門限設(shè)為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)試與結(jié)果分析發(fā)送端的頻域圖形如圖4所示:圖4接收端的頻域圖形接受判決結(jié)果如圖5所示:圖5調(diào)試過程中產(chǎn)生的問題及解決方案1、起初采用每
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)施工合同附件格式
- 北京市朝陽區(qū)農(nóng)村集體資產(chǎn)租賃合同書
- 經(jīng)營管理優(yōu)化
- 浙江省初中名校發(fā)展共同體期中聯(lián)考2024-2025學(xué)年七年級上學(xué)期11月期中數(shù)學(xué)試題(含答案)
- 內(nèi)蒙古赤峰市名校2024-2025學(xué)年高一上學(xué)期期中聯(lián)考歷史試題(含答案)
- 廣東省惠州市惠東縣2024-2025學(xué)年九年級上學(xué)期期中物理試卷(含答案)
- 安徽省合肥市新站高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)2024-2025學(xué)年七年級上學(xué)期期中英語試題(含答案)
- 廣東省廣州市番禺區(qū)2024-2025學(xué)年三年級上冊期中語文試卷(含答案)
- 系列自動遙測氣象站相關(guān)行業(yè)投資方案
- 非鐵分選提純設(shè)備行業(yè)相關(guān)投資計劃提議范本
- MSAGRR數(shù)據(jù)自動生成工具(已經(jīng)解密)
- 影響氣候的主要因素第三課時
- 微課腳本設(shè)計案例
- 水利工程項目管理課件課件
- ISO 14971-2019 醫(yī)療器械 風(fēng)險管理對醫(yī)療器械的應(yīng)用 -中文版
- 投資預(yù)算(投入預(yù)算
- 搞笑個性YY娛樂頻道分組設(shè)計圖
- 鋁板幕墻安裝工藝
- 如何應(yīng)對網(wǎng)絡(luò)謠言PPT優(yōu)秀課件
- 60立方油罐容積細表
- 鋁土礦采礦項目可行性研究報告寫作范文
評論
0/150
提交評論