文章目录
一、实验目的
1.进一步熟悉数字滤波器设计方法。
2.掌握利用数字滤波器实现DTMF信号提取方法。
3.了解基于Simulink的信号处理基本方法。
4.了解基于Labview的信号处理基本方法。
5.使用Matlab(Simulink)或Labview等软件平台,利用所学知识对数字系统进行设计及模拟仿真,对软件仿真实验结果进行合理分析,并得到有效的结论。
6.培养学生综合利用所学知识解决问题的能力。
二、实验设备
1.计算机
2.Matlab 2019
三、实验内容及要求
1. 实验内容:
综合运用课程所学相关知识,根据实际信号的频谱特性,确定数字滤波器设计技术指标,设计相应的数字滤波器,实现DTMF信号的提取。
2. 设计要求:
(1)通过查阅资料,自学电话中DTMF信号的产生与检测方法。
(2)利用Matlab实现DTMF信号的产生与提取。
自行选择数字(0-9),通过数字方法产生该数字的双频信号;拟定采样频率为8000Hz。根据该信号的频率特性,确定滤波器类型及技术指标,将两个单音分别提取出来。画出数字滤波器输入、输出信号的波形及频谱。
(3)利用Matlab GUI设计用户界面,实现拨号界面,包括10个数字键、显示框(显示按下的数字),画出相应的波形。
(4)自拟实验方案及具体实验步骤(要求写出设计方案)。
3. 创新训练拓展内容:
(1)在GUI用户界面中,除设计要求(3)中的内容外,可增加滤波器部分,即实现设计要求(2)中的内容。
(2)利用Labview软件进行DTMF信号的产生与提取。要求给出系统前面板结构、 程序框图等,记录仿真结果。
(3)利用Simulink进行DTMF信号的产生与提取。要求给出系统仿真图,记录系统的各个输出点的波形。
四、实验步骤及其结果分析
1. 利用Matlab实现DTMF信号的产生与提取。
设定:选取数字6,对应的频率分量为770hz,1477hz,采样频率为8000Hz,分别提取出来两个单音,数字滤波器输入、输出信号的波形及频谱如下:
程序:
n=0:1023;
x=sin(2*pi*n*770/8000)+sin(2*pi*n*1477/8000);
subplot(3,2,1)
plot(x(200:400))
grid on
title('双音多频信号');
axis([0,200,-2,2]);
X=fft(x);
subplot(3,2,2)
plot((0:511)/1024*8000,abs(X(1:512)))
xlabel('频率(hz)');
grid on
title('双音多频信号频谱');
fpl1=800;
fpu1=1000;
fsl1=600;
fsu1=1200;
Fs=8000;
wp1=[2*fpl1/Fs,2*fpu1/Fs];
ws1=[2*fsl1/Fs,2*fsu1/Fs];
rp=1;
rs=40;
[N1,wc1]=buttord(wp1,ws1,rp,rs);
[B1,A1]=butter(N1,wc1);
y1=filter(B1,A1,x);
subplot(3,2,3)
plot(y1(200:400))
axis([0,200,-0.5,0.5]);
grid on
title('双音多频信号低频分量');
Y1=fft(y1);
subplot(3,2,4);
plot((0:511)/1024*8000,abs(Y1(1:512)))
xlabel('频率(hz)');
grid on
title('双音多频信号低频分量频谱');
fpl2=1200;
fpu2=1400;
fsl2=1000;
fsu2=1600;
Fs=8000;
wp2=[2*fpl2/Fs,2*fpu2/Fs];
ws2=[2*fsl2/Fs,2*fsu2/Fs];
rp=1;
rs=40;
[N2,wc2]=buttord(wp2,ws2,rp,rs);
[B2,A2]=butter(N2,wc2);
y2=filter(B2,A2,x);
subplot(3,2,5);
plot(y2(200:400))
axis([0,200,-0.2,0.2]);
grid on
title('双音多频信号高频分量');
Y2=fft(y2);
subplot(3,2,6);
plot((0:511)/1024*8000,abs(Y2(1:512)))
xlabel('频率(hz)');
grid on
title('双音多频信号高频分量频谱');
结果:
分析:
2. 利用Matlab GUI设计用户界面,实现拨号功能。
程序:
function varargout = xindeshiyan(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @xindeshiyan_OpeningFcn, ...
'gui_OutputFcn', @xindeshiyan_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
function xindeshiyan_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = xindeshiyan_OutputFcn(hObject, eventdata, handles)
varargout{
1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
n=0:1023;
x=sin(2*pi*n*697/8000)+sin(2*pi*n*1209/8000);
sound(x,8000);
str = get(handles.edit1,'String');
display = strcat(str,'1');
set(handles.edit1,'String',display);
plot(handles.axes1,n,x);
X=fft(x,512);
plot(handles.axes2,abs(X));
sound(x,8000);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
n=0:1023;
x=sin(2*pi*n*697/8000)+sin(2*pi*n*1336/8000);
sound(x,8000);
str = get(handles.edit1,'String');
display = strcat(str,'2');
set(handles.edit1,'String',display);
plot(handles.axes1,n,x);
X=fft(x,512);
plot(handles.axes2,abs(X));
sound(x,8000);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
n=0:1023;
x=sin(2*pi*n*697/8000)+sin(2*pi*n*1477/8000);
sound(x,8000);
str = get(handles.edit1,'String');
display = strcat(str,'3');
set(handles.edit1,'String',display);
plot(handles.axes1,n,x);
X=fft(x,512);
plot(handles.axes2,abs(X));
sound(x,8000);
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
n=0:1023;
x=sin(2*pi*n*770/8000)+sin(2*pi*n*1209/8000);
sound(x,8000);
str = get(handles.edit1,'String');
display = strcat(str,'4');
set(handles.edit1,'String',display);
plot(handles.axes1,n,x);
X=fft(x,512);
plot(handles.axes2,abs(X));
sound(x,8000);
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
n=0:1023;
x=sin(2*pi*n*770/8000)+sin(2*pi*n*1336/8000);
sound(x,8000);
str = get(handles.edit1,'String');
display = strcat(str,'7');
set(handles.edit1,'String',display);
plot(handles.axes1,n,x);
X=fft(x,512);
plot(handles.axes2,abs(X));
sound(x,8000);