1.實驗目的1.本實驗內容基于對電話通信系統中撥號音合成與識別的仿真實現。主要涉及到電話撥號音合成的基本原理及識別的主要方法,利用 MATLAB 軟件以及 FFT 算法實現對電話通信系統中撥號音的合成與識別。并進一步利用 MATLAB 中的圖形用戶界面 GUI 制作簡單直觀的模擬界面。使其對電話通信系統撥號音的合成與識別有個基本的了解。
2.能夠利用矩陣不同的基頻合成 0 - 9 不同按鍵的撥號音,并能夠對不同的撥號音加以正確的識別,實現由撥號音解析出電話號碼的過程。進一步利用 GUI 做出簡單的圖形操作界面。要求界面清楚,畫面簡潔,易于理解,操作簡單。從而實現對電話撥號音系統的簡單的實驗仿真。
2.實驗原理
1. DTMF 信號的組成
雙音多頻 DTMF ( Dual Tone Multi-Frequency )信號,是用兩個特定的單音頻率信號的組合來代表數字或功能。在 DTMF 電話機中有 16 個按鍵,其中 10 個數字鍵 0 — 9 , 6 個功能鍵 * 、 # 、 A 、 B 、 C 、 D 。其中 12 個按鍵是我們比較熟悉的按鍵,另外由第 4 列確定的按鍵作為保留,作為功能鍵留為今后他用。 根據 CCITT 建議,國際上采用 697Hz 、 770Hz 、 852Hz 、 94lHz 低頻群及 1209Hz 、 1336Hz 、 1477H: 、 1633Hz 高頻群。從低頻群和高頻群任意各抽出一種頻率進行組合,共有 16 種組合,代表 16 種不同的數字鍵或功能,每個按鍵唯一地由一組行頻和列頻組成,如表 1 所示。
轉載請注明出處。)
DTMF 的組合功能
3.實驗步驟
1. DTMF 信號的產生合成
現在將對上節制作的圖形電話撥號面板上的各控件單位的動作和變化進行設置,即對 tu1.m 文件進行編輯。其主要的功能是使對應的按鍵,按照表 1 的對應關系產生相應的撥號音,完成對應行頻及列頻的疊加輸出。此外,對于圖形界面的需要,還要使按鍵的號碼數字顯示在撥號顯示窗口中。
鑒于 CCITT 對 DTMF 信號規定的指標,這里每個數字信號取 1000 個采樣點模擬按鍵信號,并且每兩個數字之間用 100 個 0 來表示間隔來模擬靜音。以便區別連續的兩個按鍵信號。間隔的靜音信號也是在按鍵時產生的。
以按鍵 0 為例,簡單介紹撥號音產生的過程:
% 按鍵 0 的響應函數
function varargout = pushbutton0_Callback(h, eventdata, handles, varargin)
n=[1:1000]; % 每個數字 1000 個采樣點表示
d0=sin(0.7217*n)+sin(1.0247*n); % 對應行頻列頻疊加
n0=strcat(get(handles.edit1,'string'),'0'); % 獲取數字號碼
set(handles.edit1,'string',n0); % 顯示號碼
space=zeros(1,100); %100 個 0 模擬靜音信號
global NUM
phone=[NUM,d0];
NUM=[phone,space]; % 存儲連續的撥號音信號
wavplay(d0,8192); % 產生撥號音
程序解釋:
NUM 為定義的全局變量,用于存儲連續的撥號音( DTMF )信號,包括數字信號音以及靜音信號。
d0=sin(0.7217*n)+sin(1.0247*n) 中的行頻與列頻是由表 1 中 0 鍵對應的計算得出,已知聲音取樣頻率,則取樣后。
對于保留的兩個功能鍵“ * ”“#”,按照現行鍵盤式撥號電話的習慣,將“ * ”作為刪除鍵,“#”作為確認鍵。“ * ”刪除鍵的作用是將前面撥錯的號碼刪除退回,表現為將顯示窗口已經顯示的錯誤號碼退回一位數字,并且將連續撥號音信號的存儲單元 NUM 中退回一位撥號音信號和靜音信號。刪除可以進行連續的操作。“#”確認鍵的作用是將前面撥過的號碼進行確認保留,意味著此時連續撥號音信號的存儲單元 NUM 中的信號即為最后用于識別的連續撥號音 DTMF 信號,并在顯示窗口中顯示“#”號作為標記。
% 刪除鍵的響應函數
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.圖形電話撥號面板的制作
利用 GUI 圖形用戶界面設計工具制作電話撥號面板,把 DTMF 信號和電話機的鍵盤矩陣對應起來。其中選用我們熟悉的 10 個數字鍵 0 — 9 , 2 個功能鍵“ * ”、“#”,另四個鍵省略。按照圖 1 電話機鍵盤矩陣的排列方式制作四行三列的按鍵控件。每個按鍵可用( Push Button )添加。
然后,為了更直觀的反應對應的按鍵號碼,可以設置一個編輯框,用于動態的顯示撥號號碼,模擬實際電話的撥號顯示窗口。編輯框可用( Edit Text )添加。
另外,為了圖形電話撥號面板的簡潔美觀,可以添加空白區域作為背景,并用靜態文本框制作文字信息。背景可用( Frame )添加,靜態文本框可用( Static Text )添加。
最終利用 GUI 圖形用戶界面設計工具生成的圖形電話撥號面板用于撥號音的合成產生部分,如下圖所示:
3.DTMF 信號的檢測識別
對電話撥號音( DTMF )信號的檢測識別的仿真實現,可以直接計算付里葉變換得到輸入的信號頻率。這里采用 FFT 算法對信號進行解碼分析。首先對接收到的數字信號作 FFT 分析,計算出其幅頻譜,進而得到功率譜。對于連續的雙音多頻( DTMF )信號,需要把有效的數字撥號信號從靜音間隔信號中分割提取出來,然后再用 FFT 算法對信號進行解碼分析。
MATLAB 實現信號音的識別如下:
% 信號音識別 ----------------------------------------------------------------
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); % 截取出每個數字
f=fft(d,2048); % 以 N=2048 作 FFT 變換
a=abs(f);
p=a.*a/10000; % 計算功率譜
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; % 確定行數
elseif (num(1) < 200) row=2;
elseif (num(1) < 220) row=3;
else row=4;
end
if (num(2) < 320) column=1; % 確定列數
elseif (num(2) < 340) column=2;
else column=3;
end
z=[row,column]; % 確定數字
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);
程序解釋:
確定行頻和列頻的數值范圍是通過計算得出的:已知輸入信號的取樣頻率,而做FFT的N=2048,則頻譜分辨率為,由此可算出頻譜圖上任意點對應的頻率。例如,數字8的高、低端頻率為,則在譜圖上對應的點。
4.實驗內容實驗報告要求:(1) 簡述實驗目的及原理。(2) 打印出一個數字撥號音的頻譜圖,加以分析說明,并解釋DTMF 信號的檢測識別的原理。(3) 總結實驗得出主要結論。
轉載請注明出處。)