1.實(shí)驗(yàn)?zāi)康?/span> 2.能夠利用矩陣不同的基頻合成 0 - 9 不同按鍵的撥號(hào)音,并能夠?qū)Σ煌膿芴?hào)音加以正確的識(shí)別,實(shí)現(xiàn)由撥號(hào)音解析出電話號(hào)碼的過(guò)程。進(jìn)一步利用 GUI 做出簡(jiǎn)單的圖形操作界面。要求界面清楚,畫(huà)面簡(jiǎn)潔,易于理解,操作簡(jiǎn)單。從而實(shí)現(xiàn)對(duì)電話撥號(hào)音系統(tǒng)的簡(jiǎn)單的實(shí)驗(yàn)仿真。 2.實(shí)驗(yàn)原理 1. DTMF 信號(hào)的組成 雙音多頻 DTMF ( Dual Tone Multi-Frequency )信號(hào),是用兩個(gè)特定的單音頻率信號(hào)的組合來(lái)代表數(shù)字或功能。在 DTMF 電話機(jī)中有 16 個(gè)按鍵,其中 10 個(gè)數(shù)字鍵 0 — 9 , 6 個(gè)功能鍵 * 、 # 、 A 、 B 、 C 、 D 。其中 12 個(gè)按鍵是我們比較熟悉的按鍵,另外由第 4 列確定的按鍵作為保留,作為功能鍵留為今后他用。 根據(jù) CCITT 建議,國(guó)際上采用 697Hz 、 770Hz 、 852Hz 、 94lHz 低頻群及 1209Hz 、 1336Hz 、 1477H: 、 1633Hz 高頻群。從低頻群和高頻群任意各抽出一種頻率進(jìn)行組合,共有 16 種組合,代表 16 種不同的數(shù)字鍵或功能,每個(gè)按鍵唯一地由一組行頻和列頻組成,如表 1 所示。
(文章來(lái)自:http://hi.baidu.com/forestlong/blog/item/dd33911a24b5fbf3ae5133ee.html 轉(zhuǎn)載請(qǐng)注明出處。) DTMF 的組合功能
3.實(shí)驗(yàn)步驟 1. DTMF 信號(hào)的產(chǎn)生合成 現(xiàn)在將對(duì)上節(jié)制作的圖形電話撥號(hào)面板上的各控件單位的動(dòng)作和變化進(jìn)行設(shè)置,即對(duì) tu1.m 文件進(jìn)行編輯。其主要的功能是使對(duì)應(yīng)的按鍵,按照表 1 的對(duì)應(yīng)關(guān)系產(chǎn)生相應(yīng)的撥號(hào)音,完成對(duì)應(yīng)行頻及列頻的疊加輸出。此外,對(duì)于圖形界面的需要,還要使按鍵的號(hào)碼數(shù)字顯示在撥號(hào)顯示窗口中。 鑒于 CCITT 對(duì) DTMF 信號(hào)規(guī)定的指標(biāo),這里每個(gè)數(shù)字信號(hào)取 1000 個(gè)采樣點(diǎn)模擬按鍵信號(hào),并且每?jī)蓚€(gè)數(shù)字之間用 100 個(gè) 0 來(lái)表示間隔來(lái)模擬靜音。以便區(qū)別連續(xù)的兩個(gè)按鍵信號(hào)。間隔的靜音信號(hào)也是在按鍵時(shí)產(chǎn)生的。 以按鍵 0 為例,簡(jiǎn)單介紹撥號(hào)音產(chǎn)生的過(guò)程: % 按鍵 0 的響應(yīng)函數(shù) function varargout = pushbutton0_Callback(h, eventdata, handles, varargin) n=[1:1000]; % 每個(gè)數(shù)字 1000 個(gè)采樣點(diǎn)表示 d0=sin(0.7217*n)+sin(1.0247*n); % 對(duì)應(yīng)行頻列頻疊加 n0=strcat(get(handles.edit1,'string'),'0'); % 獲取數(shù)字號(hào)碼 set(handles.edit1,'string',n0); % 顯示號(hào)碼 space=zeros(1,100); %100 個(gè) 0 模擬靜音信號(hào) global NUM phone=[NUM,d0]; NUM=[phone,space]; % 存儲(chǔ)連續(xù)的撥號(hào)音信號(hào) wavplay(d0,8192); % 產(chǎn)生撥號(hào)音
程序解釋: NUM 為定義的全局變量,用于存儲(chǔ)連續(xù)的撥號(hào)音( DTMF )信號(hào),包括數(shù)字信號(hào)音以及靜音信號(hào)。 d0=sin(0.7217*n)+sin(1.0247*n) 中的行頻與列頻是由表 1 中 0 鍵對(duì)應(yīng)的 對(duì)于保留的兩個(gè)功能鍵“ * ”“#”,按照現(xiàn)行鍵盤式撥號(hào)電話的習(xí)慣,將“ * ”作為刪除鍵,“#”作為確認(rèn)鍵。“ * ”刪除鍵的作用是將前面撥錯(cuò)的號(hào)碼刪除退回,表現(xiàn)為將顯示窗口已經(jīng)顯示的錯(cuò)誤號(hào)碼退回一位數(shù)字,并且將連續(xù)撥號(hào)音信號(hào)的存儲(chǔ)單元 NUM 中退回一位撥號(hào)音信號(hào)和靜音信號(hào)。刪除可以進(jìn)行連續(xù)的操作。“#”確認(rèn)鍵的作用是將前面撥過(guò)的號(hào)碼進(jìn)行確認(rèn)保留,意味著此時(shí)連續(xù)撥號(hào)音信號(hào)的存儲(chǔ)單元 NUM 中的信號(hào)即為最后用于識(shí)別的連續(xù)撥號(hào)音 DTMF 信號(hào),并在顯示窗口中顯示“#”號(hào)作為標(biāo)記。 % 刪除鍵的響應(yīng)函數(shù) function varargout = pushbuttonback_Callback(h, eventdata, handles, varargin) n=[1:1000]; num=get(handles.edit1,'string'); l=length(num); n11=strrep(num,num,num(1:l-1)); d11=sin(0.7217*n)+sin(0.9273*n); set(handles.edit1,'string',n11); global NUM L=length(NUM); NUM=NUM(1:L-1100); wavplay(d11,8192);
2.圖形電話撥號(hào)面板的制作 利用 GUI 圖形用戶界面設(shè)計(jì)工具制作電話撥號(hào)面板,把 DTMF 信號(hào)和電話機(jī)的鍵盤矩陣對(duì)應(yīng)起來(lái)。其中選用我們熟悉的 10 個(gè)數(shù)字鍵 0 — 9 , 2 個(gè)功能鍵“ * ”、“#”,另四個(gè)鍵省略。按照?qǐng)D 1 電話機(jī)鍵盤矩陣的排列方式制作四行三列的按鍵控件。每個(gè)按鍵可用 然后,為了更直觀的反應(yīng)對(duì)應(yīng)的按鍵號(hào)碼,可以設(shè)置一個(gè)編輯框,用于動(dòng)態(tài)的顯示撥號(hào)號(hào)碼,模擬實(shí)際電話的撥號(hào)顯示窗口。編輯框可用 另外,為了圖形電話撥號(hào)面板的簡(jiǎn)潔美觀,可以添加空白區(qū)域作為背景,并用靜態(tài)文本框制作文字信息。背景可用 最終利用 GUI 圖形用戶界面設(shè)計(jì)工具生成的圖形電話撥號(hào)面板用于撥號(hào)音的合成產(chǎn)生部分,如下圖所示:
![]()
3.DTMF 信號(hào)的檢測(cè)識(shí)別 對(duì)電話撥號(hào)音( DTMF )信號(hào)的檢測(cè)識(shí)別的仿真實(shí)現(xiàn),可以直接計(jì)算付里葉變換得到輸入的信號(hào)頻率。這里采用 FFT 算法對(duì)信號(hào)進(jìn)行解碼分析。首先對(duì)接收到的數(shù)字信號(hào)作 FFT 分析,計(jì)算出其幅頻譜,進(jìn)而得到功率譜。對(duì)于連續(xù)的雙音多頻( DTMF )信號(hào),需要把有效的數(shù)字撥號(hào)信號(hào)從靜音間隔信號(hào)中分割提取出來(lái),然后再用 FFT 算法對(duì)信號(hào)進(jìn)行解碼分析。 MATLAB 實(shí)現(xiàn)信號(hào)音的識(shí)別如下: % 信號(hào)音識(shí)別 ---------------------------------------------------------------- function varargout = pushbuttonNUM_Callback(h, eventdata, handles, varargin) global NUM wavplay(NUM,8192); L=length(NUM); n=L/1100; number=''; for i=1:n j=(i-1)*1100+1; d=NUM(j:j+999); % 截取出每個(gè)數(shù)字 f=fft(d,2048); % 以 N=2048 作 FFT 變換 a=abs(f); p=a.*a/10000; % 計(jì)算功率譜 num(1)=find(p(1:250)==max(p(1:250))); % 找行頻 num(2)=300+find(p(300:380)==max(p(300:380))); % 找列頻 if (num(1) < 180) row=1; % 確定行數(shù) elseif (num(1) < 200) row=2; elseif (num(1) < 220) row=3; else row=4; end if (num(2) < 320) column=1; % 確定列數(shù) elseif (num(2) < 340) column=2; else column=3; end z=[row,column]; % 確定數(shù)字 if z==[4,2] tel=0; elseif z==[1,1] tel=1; elseif z==[1,2] tel=2; elseif z==[1,3] tel=3; elseif z==[2,1] tel=4; elseif z==[2,2] tel=5; elseif z==[2,3] tel=6; elseif z==[3,1] tel=7; elseif z==[3,2] tel=8; elseif z==[3,3] tel=9; end t(i)=tel; c=strcat(number,int2str(tel)); number=c; i=i+1; end set(handles.edit3,'string',number);
程序解釋:
轉(zhuǎn)載請(qǐng)注明出處。) |
聯(lián)系客服