GUI编程之拨号盘按键音识别的学习与实现

工具软件:matlab7.1
主要内容:模拟拨号盘按键音并识别
步骤:拨号盘按键音合成(1-9,*、#)音频信号--根据音频信号得出对应表--通过对应表得出之后输入的号码

主要思想:统计所有特征,与新的数据对比即可得出结果
ps:个人觉得识别的本质是特征对比,主要方法为提取特征然后对比。

过程难点:
1.对于单独输入号码的拼接--strcat
对应每一个按键的响应/回调函数内添加如下示例
global NUM;
NUM = strcat(NUM,'1');%按键1内

2.指定axes绘制频谱图
在axes内绘制频谱图还是显示图片
通过ploth绘制时,注意与subplot的区别,plot允许指定axes,而subplot只能允许自动多图绘制,不接受指定。

3.文件的读取与删除
程序中合成的信号都保存为wav格式的音频文件,需要用到保存、读取和删除操作
matlab的函数功能非常强大,常用操作可以通过一行代码实现
保存
for i=1:1:size(phonenumber,2)
global i;
wavwrite(zsignal,fs,32,[num2str(i) '.wav']);
for循环可以实现对多个信号文件在保存时自动编号,编号一般由0开始
读取
[y,Fs,bits]=wavread([num2str(i) '.wav']);
访问当前路径下全部wav格式文件
dirs=dir('.wav');
删除
delete('
.wav');

实现过程

1.拨号盘按键音合成(1-9,、#)音频信号并绘制频谱图
%产生声音信号的函数
function [num10signal]=call10number(phonenumber,handles)
warning('off');
global signal;
N=204;
n=0:N-1;
fs=8192;
F_c=[697;770;852;941]
ones(1,3);
F_c=F_c';F_c=F_c(😃';
F_r=[1209;1336;1477]ones(1,4);
F_r=F_r(😃';
F=2
pi/fs[F_c;F_r];
num10signal=[];
for i=1:1:size(phonenumber,2),
signal=[];
switch phonenumber(1,i),
case {'1','2','3','4','5','6','7','8','9'}
signal=cos(F(:,str2num(phonenumber(1,i)))
n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case ''
signal=cos(F(:,10)
n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case '#'
signal=cos(F(:,12)n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case '0'
signal=cos(F(:,11)
n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
otherwise disp('Unknown digit')
end
signal=signal';
num10signal=[num10signal' signal']';
sound(signal,fs);
zsignal = real(signal);
zsignal=zsignal/max(abs(zsignal));
global i;
wavwrite(zsignal,fs,32,[num2str(i) '.wav']);
[y,Fs,bits]=wavread([num2str(i) '.wav']);
i=i+1;
y=mean(y,2);
y=detrend(y);
axes(handles.axes2);
plot(y)
title('原波形');
xlabel('t')
ylabel('A')
axes(handles.axes3);
fs=Fs;N=length(y);
n=0:N-1;t=n/fs;
x=y;
y1=fft(x,N);
mag=abs(y1);
f=n*fs/N;
plot(f,mag);
xlim([650,1500])
title('傅里叶变换后的波形');
xlabel('Frenquency/Hz');
ylabel('Amp');grid on;

end

2.根据每个信号得到全部按键模拟信号的特征对应表

3.测试,模拟按键信号识别



全部代码
窗口1代码如下:
function varargout = phone(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @phone_OpeningFcn, ...
'gui_OutputFcn', @phone_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 phone_OpeningFcn(hObject, eventdata, handles, varargin)
global NUM;
NUM = '';
global i;
i=0;
handles.output = hObject;
guidata(hObject, handles);
function varargout = phone_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%产生声音信号的函数
function [num10signal]=call10number(phonenumber,handles)
warning('off');
global signal;
N=204;
n=0:N-1;
fs=8192;
F_c=[697;770;852;941]ones(1,3);
F_c=F_c';F_c=F_c(😃';
F_r=[1209;1336;1477]
ones(1,4);
F_r=F_r(😃';
F=2pi/fs[F_c;F_r];
num10signal=[];
for i=1:1:size(phonenumber,2),
signal=[];
switch phonenumber(1,i),
case {'1','2','3','4','5','6','7','8','9'}
signal=cos(F(:,str2num(phonenumber(1,i)))n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case '
'
signal=cos(F(:,10)n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case '#'
signal=cos(F(:,12)
n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
case '0'
signal=cos(F(:,11)n);
signal=sum(signal);
signal=[signal zeros(size(signal))];
otherwise disp('Unknown digit')
end
signal=signal';
num10signal=[num10signal' signal']';
sound(signal,fs);
zsignal = real(signal);
zsignal=zsignal/max(abs(zsignal));
global i;
wavwrite(zsignal,fs,32,[num2str(i) '.wav']);
[y,Fs,bits]=wavread([num2str(i) '.wav']);
i=i+1;
y=mean(y,2);
y=detrend(y);
axes(handles.axes2);
plot(y)
title('原波形');
xlabel('t')
ylabel('A')
axes(handles.axes3);
fs=Fs;N=length(y);
n=0:N-1;t=n/fs;
x=y;
y1=fft(x,N);
mag=abs(y1);
f=n
fs/N;
plot(f,mag);
xlim([650,1500])
title('傅里叶变换后的波形');
xlabel('Frenquency/Hz');
ylabel('Amp');grid on;
end
function pushbutton1_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'1');
set(handles.edit1,'string',NUM);
call10number('1',handles);
function pushbutton2_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'2');
set(handles.edit1,'string',NUM);
call10number('2',handles);
function pushbutton3_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'3');
set(handles.edit1,'string',NUM);
call10number('3',handles);
function pushbutton4_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'4');
set(handles.edit1,'string',NUM);
call10number('4',handles);
function pushbutton5_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'5');
set(handles.edit1,'string',NUM);
call10number('5',handles);
function pushbutton6_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'6');
set(handles.edit1,'string',NUM);
call10number('6',handles);
function pushbutton7_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'7');
set(handles.edit1,'string',NUM);
call10number('7',handles);
function pushbutton8_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'8');
set(handles.edit1,'string',NUM);
call10number('8',handles);
function pushbutton9_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'9');
set(handles.edit1,'string',NUM);
call10number('9',handles);
function pushbutton10_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'');
set(handles.edit1,'string',NUM);
call10number('
',handles);
function pushbutton0_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'0');
set(handles.edit1,'string',NUM);
call10number('0',handles);
function pushbutton12_Callback(hObject, eventdata, handles)
global NUM;
NUM = strcat(NUM,'#');
set(handles.edit1,'string',NUM);
call10number('#',handles);
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
function checkbox1_Callback(hObject, eventdata, handles)
isChecked = get(hObject,'Value');
if isChecked
set(handles.text1, 'string', '2015117326');
set(handles.text2, 'string', '2015117324');
else
set(handles.text1, 'string', '');
set(handles.text2, 'string', '');

end
function pushbutton13_Callback(hObject, eventdata, handles)
phone2;
close(phone);
function pushbutton14_Callback(hObject, eventdata, handles)
button=questdlg('要退出吗?','提醒','是的','不了','不了');
if button=='是的'
clc,clear,close all;
end

窗口2代码如下:
function varargout = phone2(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @phone2_OpeningFcn, ...
'gui_OutputFcn', @phone2_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 phone2_OpeningFcn(hObject, eventdata, handles, varargin)
global NUM;
set(handles.num,'Visible','off');
set(handles.num, 'string', NUM);
handles.output = hObject;
guidata(hObject, handles);
function varargout = phone2_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
xecutes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function axes12_CreateFcn(hObject, eventdata, handles)
imshow(imread('对应表.png'));
function pushbutton1_Callback(hObject, eventdata, handles)
figure(2)
dirs=dir('.wav');%读取当前目录下所有的wav格式文件
dircell=struct2cell(dirs)';%结构体转换成元胞类型,让该文件按列排列
fname=dircell(:,1);%第一列是文件名
fnumber=length(fname);%求取表格行数,即文件个数
cs=1;
for N=1:1:fnumber
filename=char(fname(N,1))%将cell转换成string
[Y,Fs,bits]=wavread(filename);
sound(Y)
y=mean(Y,2);
y=detrend(Y);
fs=Fs;N=length(Y);
n=0:N-1;t=n/fs;
x=Y;
y1=fft(x,N);
mag=abs(y1);
f=n
fs/N;
subplot(6,2,cs),plot(f,mag);
xlim([650,1500])
%title('傅里叶变换后的波形');
xlabel('频率/Hz');
ylabel('幅值');grid on;
cs=cs+1;
pause(0.2)
end
pause(1);
set(handles.num,'Visible','on');
function pushbutton2_Callback(hObject, eventdata, handles)
delete('*.wav');
close all;
clc;
phone;
function checkbox1_Callback(hObject, eventdata, handles)
isChecked = get(hObject,'Value');
if isChecked
set(handles.text2, 'string', '2015117326');
set(handles.text3, 'string', '2015117324');
else
set(handles.text2, 'string', '');
set(handles.text3, 'string', '');
end

posted @ 2017-05-28 19:30  客罒  阅读(891)  评论(1编辑  收藏  举报