数字信号处理实验报告电话拨号音合成与识别精品资料.docx
《数字信号处理实验报告电话拨号音合成与识别精品资料.docx》由会员分享,可在线阅读,更多相关《数字信号处理实验报告电话拨号音合成与识别精品资料.docx(16页珍藏版)》请在冰豆网上搜索。
数字信号处理实验报告电话拨号音合成与识别精品资料
大连理工大学实验报告
学院(系):
专业:
班级:
姓名:
学号:
组:
___
实验时间:
实验室:
实验台:
指导教师签字:
成绩:
实验二电话拨号音合成与识别
一、实验结果与分析
数字拨号音频谱分析(代码与频谱):
n=[1:
410];
fs=8192;
d1=sin(2*pi*697/fs*n)+sin(2*pi*1209/fs*n);
D1=fft(d1);
t1=(0:
length(d1)-1)*fs/length(d1)-fs/2;
figure
(1);
plot(t1,fftshift(abs(D1)));title('按键‘1’的频谱');
d1=sin(2*pi*697/fs*n)+sin(2*pi*1336/fs*n);
D1=fft(d1);
figure
(2);
plot(t1,fftshift(abs(D1)));title('按键‘2’的频谱');
d1=sin(2*pi*697/fs*n)+sin(2*pi*1477/fs*n);
D1=fft(d1);
figure(3);
plot(t1,fftshift(abs(D1)));title('按键‘3’的频谱');
d1=sin(2*pi*770/fs*n)+sin(2*pi*1209/fs*n);
D1=fft(d1);
figure(4);
plot(t1,fftshift(abs(D1)));title('按键‘4’的频谱');
d1=sin(2*pi*770/fs*n)+sin(2*pi*1336/fs*n);
D1=fft(d1);
figure(5);
plot(t1,fftshift(abs(D1)));title('按键‘5’的频谱');
d1=sin(2*pi*770/fs*n)+sin(2*pi*1477/fs*n);
D1=fft(d1);
figure(6);
plot(t1,fftshift(abs(D1)));title('按键‘6’的频谱');
d1=sin(2*pi*852/fs*n)+sin(2*pi*1209/fs*n);
D1=fft(d1);
figure(7);
plot(t1,fftshift(abs(D1)));title('按键‘7’的频谱');
d1=sin(2*pi*852/fs*n)+sin(2*pi*1336/fs*n);
D1=fft(d1);
figure(8);
plot(t1,fftshift(abs(D1)));title('按键‘8’的频谱');
d1=sin(2*pi*852/fs*n)+sin(2*pi*1477/fs*n);
D1=fft(d1);
figure(9);
plot(t1,fftshift(abs(D1)));title('按键‘9’的频谱');
d1=sin(2*pi*941/fs*n)+sin(2*pi*1209/fs*n);
D1=fft(d1);
figure(10);
plot(t1,fftshift(abs(D1)));title('按键‘*’的频谱');
d1=sin(2*pi*941/fs*n)+sin(2*pi*1336/fs*n);
D1=fft(d1);
figure(11);
plot(t1,fftshift(abs(D1)));title('按键‘0’的频谱');
d1=sin(2*pi*941/fs*n)+sin(2*pi*1477/fs*n);
D1=fft(d1);
figure(12);
plot(t1,fftshift(abs(D1)));title('按键‘#’的频谱');
频谱图如下:
图形电话拨号面板的制作:
首先是框架的搭建:
利用callback在.m文件中对各个模块进行代码的编辑(下面列出主要部分):
1、数字0~9的显示与发声(以数字‘7’为例):
%---Executesonbuttonpressinpushbutton7.
functionpushbutton7_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton7(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
n0=strcat(get(handles.numshow,'string'),'7');%获取数字号码
set(handles.numshow,'string',n0);%显示号码
n=[1:
handles.DTMFnum];%每个数字410个采样点表示
d0=sin(2*pi*852/handles.fs*n)+sin(2*pi*1209/handles.fs*n);%对应行频列频叠加
space=zeros(1,handles.DTMFnum);%400个0模拟静音信号
phone=[handles.NUM,d0];
handles.NUM=[phone,space];%存储连续的拨号音信号
guidata(hObject,handles);
wavplay(d0,8192);
2、删除键‘*’的代码:
%---Executesonbuttonpressinpushbutton11.
functionpushbutton11_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton11(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
n=[1:
1000];
num=get(handles.numshow,'string');
l=length(num);
n11=strrep(num,num,num(1:
l-1));
d11=sin(0.7217*n)+sin(0.9273*n);
set(handles.numshow,'string',n11);
L=length(handles.NUM);
handles.NUM=handles.NUM(1:
L-820);
guidata(hObject,handles);
wavplay(d11,8192);
3、确认键‘#’的代码:
%---Executesonbuttonpressinpushbutton12.
functionpushbutton12_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton12(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
n0=strcat(get(handles.numshow,'string'),'#');%获取数字号码
set(handles.numshow,'string',n0);%显示号码
n=[1:
handles.DTMFnum];%每个数字410个采样点表示
d0=sin(2*pi*941/handles.fs*n)+sin(2*pi*1477/handles.fs*n);%对应行频列频叠加
guidata(hObject,handles);
wavplay(d0,8192);
4、清空键‘Reset’的代码:
%---ExecutesonbuttonpressinbtFW.
functionbtFW_Callback(hObject,eventdata,handles)
%hObjecthandletobtFW(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
handles.NUM=[];
set(handles.numshow,'string',[]);%显示号码
set(handles.numRec,'string',[]);%显示号码
guidata(hObject,handles);
5、显示键的代码:
%---ExecutesonbuttonpressinbtRec.
functionbtRec_Callback(hObject,eventdata,handles)
%hObjecthandletobtRec(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
L=length(handles.NUM);
n=L/handles.DTMFsum;
number='';
fori=1:
n
j=(i-1)*handles.DTMFsum+1;
d=handles.NUM(j:
j+(handles.DTMFnum-1));%截取出每个数字
f=fft(d,8192);%以N=2048作FFT变换
a=abs(f);
p=a.*a/handles.fs;%计算功率谱
%p=a.*a/10000;%计算功率谱
num
(1)=find(p(1:
1000)==max(p(1:
1000)));%找行频
num
(2)=1000+find(p(1000:
1700)==max(p(1000:
1700)));%找列频
if(num
(1)<730)
row=1;%确定行数
elseif(num
(1)<810)
row=2;
elseif(num
(1)<900)
row=3;
else
row=4;
end
if(num
(2)<1260)
column=1;%确定列数
elseif(num
(2)<1400)
column=2;
else
column=3;
end
z=[row,column];%确定数字
ifz==[4,2]
tel=0;
elseifz==[1,1]
tel=1;
elseifz==[1,2]
tel=2;
elseifz==[1,3]
tel=3;
elseifz==[2,1]
tel=4;
elseifz==[2,2]
tel=5;
elseifz==[2,3]
tel=6;
elseifz==[3,1]
tel=7;
elseifz==[3,2]
tel=8;
elseifz==[3,3]
tel=9;
end
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
end
set(handles.numRec,'string',number);%显示号码
GUI界面的操作:
(1)初始化界面
(2)输入数字后的界面
(3)按‘*’后删除一位(4)按‘#’后确认键
(5)按下显示键显示出来(6)按下Reset键清空
二、讨论、建议、质疑
做本实验分两部分,第一部分是做图形化(GUI)界面的设计,第二部分是做电话信号的频谱分析。
做GUI设计中的问题:
删除键部分‘*’在ppt模板的基础上,将全局变量globalNUM删掉了,而改为用句柄handles.NUM.还有就是用guidata(hObject,handles);进行实时更新从而确保删除后能在内存中也删除。
同时注意删除是820个点,不是1100个点。
确认键’#’只需要发声和显示即可,不用放在内存中,显示键用的是ppt上的模板,其他部分都顺利完成。
第二部分频谱分析是利用FFT变换实现的,由于抽样过程会出现频谱搬移的现象,为了看到原有信号的频谱,采用:
t1=(0:
length(d1)-1)*fs/length(d1)-fs/2;从而保证抽样频率不会在频谱中体现出来,一共做出了12个拨音信号的频谱。
本实验作为综合性的实验,既让我熟悉了GUI的设计,又强化了信号频谱分析的知识,这是本次实验的体会。