数字信号处理4:综合实验


一、实验目的

  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);
  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道无方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值