数字信号处理综合MATLAB设计 双音多频拨号系统

一、实验目的
1. 了解数字信号处理当今应用的基本情况。
2. 对该课程做系统地总结。
3.将所学知识运用到实践中,能够学以致用。

二、实验原理
双音多频 DTMF( Dual Tone Multi-Frequency )信号,是用两个特定的单音频率信号的组合来代表数字或功能。在 DTMF 电话机中有 16 个按键,其中 10 个数字键 0 —9 , 6 个功能键 * 、 # 、 A 、 B 、 C 、 D 。其中 12 个按键是我们比较熟悉的按键另外由第 4 列确定的按键作为保留,作为功能键留为今后他用。 根据 CCITT 建议,国际上采用 697Hz 、770Hz 、852Hz 、94lHz 低频群及 1209Hz 、1336Hz 、1477Hz 、1633Hz高频群。对应的 DTMF 信号用sin(2πf₁t) + sin(2πf₂t) 表示。从低频群和高频群任意各抽出一种频率进行组合,共有 16 种组合,代表 16 种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如表1 所示。[10]

(1)DTMF信号的产生合成
        一般用数字方法产生DTMF信号:规定用8kHz对DTMF信号进行采样,采样后得到时域离散信号为:x(n) = sin(2πf1n / 8000) + sin(2πf2n / 8000)(式4-1)
        有计算法和查表法两种方法可形成上述序列,计算法运行速度慢,查表法速度快但要占用一定的存储空间。因为采样频率是8kHz,既要求每125ms输出一个样本,得到的序列再送到D/A转换器。输出经过平滑滤波便是连续的DTMF信号, DTMF信号通过电话线路再送到交换机。
(2)DTMF信号的检测
        要实现电话拨号音( DTMF )信号的检测识别,可以先将收到的连续信号经过 A/D 变换,变成数字信号再进行检测。可用 DFT(FFT)对双音多频信号进行频谱分析,由信号的幅度谱判断信号的两个频率,最后确定对应的数字和符号。当检测的频率数目较少时,用滤波器组实现更适合。FFT 是 DFT 的快速算法,但当要计算的频率点数目远小于 DFT 的区间长度时,用 FFT 快速算法的效果并不明显,而且还要占用很多内存,因此不如直接用 DFT 合适。戈泽尔(Goertzel)算法是计算 DFT 的一种线性滤波方法,用该算法实现软件实验。对于戈泽尔算法建议同学们自己查阅相关资料,掌握算法的基本思想。
(3) 检测 DTMF 信号的DFT 参数选择
        用 DFT 检测模拟信号 DTMF 信号所含的两个音频频率,即为用 DFT 对模拟信号进行频谱分析的问题。根据数字信号处理所学知识,要确定三个参数:采样频率 Fs ,DFT 的变换点数 N ,需要对信号的观察时间的长度Tp  。这三个参数不能随意选取,要根据对信号频谱分析要求确定。对信号频谱分析有三个要求:
        1.频谱分析的分辨率。观察要检测到的 8 个频率,相邻间隔最小的是第一和第二个频率,间隔是 73Hz,即要求 DFT 至少能分辨相隔 73Hz 的两个信号。所以对信号的观察时间应为Tp  = 1/ F = 1/ 73 = 13.7ms 。考虑到可靠性,应留有富裕量,要求按键时间在 40ms 以上。
        2. 频谱分析的频率范围  要检测信号的频率范围是 697—1633Hz,但考虑到存在语音干扰,除检测这 8 个频率外,还要检测他们的二次倍频的幅度大小。这样频谱分析的频率范围是 697-3266Hz。按照采样定理,则有最小采样频率为Fs min   = 6.35kHz ,系统规定 Fs  = 8kHz ,这样可算出对信号的最少采样点数为Nmin   = Tp min Fs  ≈ 110 。
        3. 检测频率的准确性  这是一个用 DFT 检测正弦波频率是否准确的问题。序列的 DFT 是序列频域函数在0 − 2π  区间的等间隔采样,如果是周期序列,截取周期序列的整个周期进行 DFT,其采样点刚好在周期信号的频率上,DFT 的幅度最大处准确的是信号频率。分析 DTMF 信号不可能经过采样得到周期序列,因此存在一个检测频率的准确性问题。

        DFT 的频率采样点频率为wk  = 2πk / N (k = 0,1,2,..., N − 1) ,相应的在模拟域的采样点频率为 fk   = Fsk / N (k = 0,1,2,..., N − 1) ,要选择一个合适的 N 值使得用该公式计算出的 fk  能接近要检测的实际频率。或者将实际的频率值带入能得到的 k值接近整数值。经过分析研究,发现 N=205 是最好的。随意将实际频率带入上面的公式可得到最接近整数的 K 值。例如:

 通过一系列的分析,可确定: Fs  = 8kHz, N = 205,Tp  ≥ 40ms
        工具箱函数 Goerztel 的调用格式为:Xgk=goertzel(xn,K+1)
其中 xn 是被变换的时域序列,用于 DTMF 信号检测时就是 DTMF 信号的 205 个采样值。K 是要求计算的 DFT 频点的序号向量。用 N 表示 xn 的长度,则要求 0 ≤ K ≤ N − 1。由以上的分析可知只计算 DTMF 信号 8 个基频时K=[18,20,22,24,31,34,38,42]
        Xgk 是变换结果向量,存放的是由 K 指定的频率点的 DFT[x(n)]的值[10]。
三、 实验内容
        要求输入 6 位或 8 位电话号码,利用戈泽尔算法求出各数字信号的频谱并绘出频谱图形,再检测输出电话号码。
参考流程图:

 四、实验报告要求
1.简述实验目的及原理。明白具体的问题解决的思路是什么。
2.整理好经过运行并证明是正确的实验程序并加上注释,绘出相应的图形。

f1=697;
f2=770;
f3=852;
f4=941;
F1=1209;
F2=1336;
F3=1477;
F4=1633;
N=205;
tmin=40/1000;
fs=8000;
dt=1/fs;
N1=floor(tmin/dt);
if N<=N1
t=[0:N-1]*dt;
else
error('The time is not enough!');
end
k1=sin(2*pi*f1*t)+sin(2*pi*F1*t);
k2=sin(2*pi*f1*t)+sin(2*pi*F2*t);
k3=sin(2*pi*f1*t)+sin(2*pi*F3*t);
ka=sin(2*pi*f1*t)+sin(2*pi*F4*t);
k4=sin(2*pi*f2*t)+sin(2*pi*F1*t);
k5=sin(2*pi*f2*t)+sin(2*pi*F2*t);
k6=sin(2*pi*f2*t)+sin(2*pi*F3*t);
kb=sin(2*pi*f2*t)+sin(2*pi*F4*t);
k7=sin(2*pi*f3*t)+sin(2*pi*F1*t);
k8=sin(2*pi*f3*t)+sin(2*pi*F2*t);
k9=sin(2*pi*f3*t)+sin(2*pi*F3*t);
kc=sin(2*pi*f3*t)+sin(2*pi*F4*t);
km=sin(2*pi*f4*t)+sin(2*pi*F1*t);
k0=sin(2*pi*f4*t)+sin(2*pi*F2*t);
kj=sin(2*pi*f4*t)+sin(2*pi*F3*t);
kd=sin(2*pi*f4*t)+sin(2*pi*F4*t);
key=['1','2','3','a';'4','5','6','b';'7','8','9','c';'*','0','#','d'];
k=[18,20,22,24,31,34,38,42];
num=input('please enter the key:','s');
num=num-48;
nn=length(num);
disp('The number of the key is: ');
disp(nn);
number=zeros(nn,length(t));
for i=1:nn
switch num(i)
case 1
number(i,1:N)=k1;
case 2
number(i,1:N)=k2;
case 3
number(i,1:N)=k3;
case 4
number(i,1:N)=k4;
case 5
number(i,1:N)=k5;
case 6
number(i,1:N)=k6;
case 7
number(i,1:N)=k7;
case 8
number(i,1:N)=k8;
case 9
number(i,1:N)=k9;
case 0
number(i,1:N)=k0;
case 49
number(i,1:N)=ka;
case 50
number(i,1:N)=kb;
case 51
number(i,1:N)=kc;
case 52
number(i,1:N)=kd;
case -6
number(i,1:N)=km;
case -13
number(i,1:N)=kj;
otherwise
error('The key is not right!');
end
end
disp('The key is: ');
for i=1:nn
xgk=goertzel(number(i,1:N),k+1);
figure;
x=[697,770,852,941,1209,1336,1477,1633];
stem(x,abs(xgk),'.');
xlabel('Hz');
title('频谱分析');
zb=find(abs(xgk)>50);
disp(key(zb(1),zb(2)-4));
end

结果: 随机输入数字:12378

 

function varargout = key1(varargin) % KEY1 M-file for key1.fig % KEY1, by itself, creates a new KEY1 or raises the existing % singleton*. % % H = KEY1 returns the handle to a new KEY1 or the handle to % the existing singleton*. % % KEY1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in KEY1.M with the given input arguments. % % KEY1('Property','Value',...) creates a new KEY1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before key1_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to key1_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Copyright 2002-2003 The MathWorks, Inc. % Edit the above text to modify the response to help key1 % Last Modified by GUIDE v2.5 13-Dec-2009 23:16:54 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @key1_OpeningFcn, ... 'gui_OutputFcn', @key1_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before key1 is made visible. function key1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to key1 (see VARARGIN) % Choose default command line output for key1 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes key1 wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = key1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) d='1'; val=telephone(d); ppu(val) str = get(handles.pushbutton1,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) d='2'; val=telephone(d); ppu(val) str = get(handles.pushbutton2,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) d='3'; val=telephone(d); ppu(val) str = get(handles.pushbutton3,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton4. function pushbutton4_Callback(hObject, eventdata, handles) d='A'; val=telephone(d); ppu(val) str = get(handles.pushbutton4,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton5. function pushbutton5_Callback(hObject, eventdata, handles) d='4'; val=telephone(d); ppu(val) str = get(handles.pushbutton5,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles) d='5'; val=telephone(d); ppu(val) str = get(handles.pushbutton6,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton7. function pushbutton7_Callback(hObject, eventdata, handles) d='6'; val=telephone(d); ppu(val) str = get(handles.pushbutton7,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton8. function pushbutton8_Callback(hObject, eventdata, handles) d='B'; val=telephone(d); ppu(val) str = get(handles.pushbutton8,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton9. function pushbutton9_Callback(hObject, eventdata, handles) d='7'; val=telephone(d); ppu(val) str = get(handles.pushbutton9,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton9 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton11. function pushbutton11_Callback(hObject, eventdata, handles) d='9'; val=telephone(d); ppu(val) str = get(handles.pushbutton11,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton11 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton12. function pushbutton12_Callback(hObject, eventdata, handles) d='C'; val=telephone(d); ppu(val) str = get(handles.pushbutton12,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton12 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton13. function pushbutton13_Callback(hObject, eventdata, handles) d='*'; val=telephone(d); ppu(val) str = get(handles.pushbutton13,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton14. function pushbutton14_Callback(hObject, eventdata, handles) d='0'; val=telephone(d); ppu(val) str = get(handles.pushbutton14,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton15. function pushbutton15_Callback(hObject, eventdata, handles) d='#'; val=telephone(d); ppu(val) str = get(handles.pushbutton15,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton16. function pushbutton16_Callback(hObject, eventdata, handles) d='D'; val=telephone(d); ppu(val) str = get(handles.pushbutton16,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton16 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on button press in pushbutton10. function pushbutton10_Callback(hObject, eventdata, handles) d='8'; val=telephone(d); ppu(val) str = get(handles.pushbutton10,'string'); set(handles.edit1,'string',str) % hObject handle to pushbutton10 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timerring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值