题目: 基于matlab机场驱鸟装置**: **学院: 工学院专业: 自动化班级: 自动化111学号: ************: ***2014年6月18日基于MATLAB 的机场驱鸟装置指导老师刘璎瑛【摘要】以往在电气自动化专业学生进行毕业设计过程中,常常需要进行大量的数学运算。
在当今计算机时代,通常的做法是借助高级语言Basic、Fortran或C语言等编制计算程序,输入计算机做近似计算。
但是这需要熟练的掌握所运用的语法规则与编制程序的相关规定,而且编制程序不容易,费时费力。
目前,比较流行的控制系统仿真软件是MATLAB。
MATLAB的使用极其容易,不要求使用者具备高深的数学与程序语言的知识,不需要使用者深刻了解算法与编程技巧,且提供了丰富的矩阵处理功能,因此控制理论领域的研究人员很快注意到了这样的特点。
尤其MATLAB应用在电厂自动化专业的毕业设计的计算机仿真上,更体现出它巨大的优越性和简易性。
本设计用电脑录音机采集了一段语音,对其进行了时域分析,频谱分析,分析语音信号的特性。
然后进行相应处理,对比之后判断是否有鸟声。
【关键词】频域; 时域; 滤波器;识别一.Matlab工具的介绍MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。
是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
二.课题的研究意义我们知道小鸟对飞机的影响很大,对飞机造成的损失和危害不可小视。
本次项目内容就是基于matlab设计一个机场驱鸟系统,对机场的声音环境进行实时监测,一旦发现有鸟的叫声则启动报警器,以驱除鸟和提醒工作人员做好相关安全保障工作,确保航班的安全。
三.课题的实现方法通过应用matlab,布局GUI界面,关联对应的m文件。
首先我们要选取一个典型的鸟叫声音,通过画出它的时域图和频谱图,由相关的m文件提取它的一些参数特性作为模板。
然后我们设置一个带通滤波器,将采集到的声音通过滤波器,与模板进行比较,如果与模板的误差在一定范围之内,则表示有鸟叫的声音,此时进行报警。
四.相关GUI界面图览1.有鸟声时识别:图①采集声音滤波前与模板比较图②采集声音滤波后与模板比较1.无鸟声时识别:图③采集声音滤波前与模板比较图④采集声音滤波前与模板比较通过这四张图比较知道,只有周围有鸟声,并且把采集到的鸟声滤波之后,与模板比较才能识别出来。
五.本人负责相关部分任务:语音识别(注:鉴于语音识别这块较为繁杂,故与喻金标同学一起完成)附加程序:1.识别主函数Shibiezhu.mfunction finalmsg = test()k=128;fs=50000;[m1, fs] = wavread('E:\e1.wav');[m2, fs] = wavread('E:\e2.wav');[m3, fs] = wavread('E:\e3.wav');[ce, fs] = wavread('D:\ssssss\bbb\bin\xm2\AA.wav');mm1 = mfcc(m1, fs); % 计算 MFCC's 提取特征特征,返回值是Mel倒谱系数,是一个log的dct得到的code1= Vqlbg(mm1, k);mm2 = mfcc(m2, fs); % 计算 MFCC's 提取特征特征,返回值是Mel倒谱系数,是一个log的dct得到的code2= Vqlbg(mm2, k);mm3 = mfcc(m3, fs); % 计算 MFCC's 提取特征特征,返回值是Mel倒谱系数,是一个log的dct得到的code3= Vqlbg(mm3, k);cce = mfcc(ce, fs); % 得到测试人语音的mel倒谱系数d1 = Disteu(cce, code1); %计算得到模板和要判断的声音之间的“距离”dist1 = sum(min(d1,[],2)) / size(d1,1); %变换得到一个距离的量 d2 = Disteu(cce, code2); %计算得到模板和要判断的声音之间的“距离”dist2 = sum(min(d2,[],2)) / size(d2,1); %变换得到一个距离的量 d3 = Disteu(cce, code3); %计算得到模板和要判断的声音之间的“距离”dist3 = sum(min(d3,[],2)) / size(d3,1); %变换得到一个距离的量 %测试阈值数量msgc1 = sprintf('与模板语音信号的差值为:%10f', dist1);msgc2 = sprintf('与模板语音信号的差值为:%10f', dist2);msgc3 = sprintf('与模板语音信号的差值为:%10f', dist3);disp(msgc1);disp(msgc2);disp(msgc3);distmin=0;distmax=5;ifdist1>distmin&dist1<distmax|dist2>distmin&dist2<distmax|dist3>dis tmin&dist3<distmaxmsgc1 = sprintf('有鸟叫');msgbox(msgc1);[bj, fs] = wavread('E:\baojing.wav');sound(bj,fs);elsemsgc2 = sprintf('没有鸟叫');msgbox(msgc2);end2.特征提取函数mfcc.mfunction r = mfcc(s, fs)m = 100;n = 256;l = length(s);nbFrame = floor((l - n) / m) + 1; %沿-∞方向取整for i = 1:nfor j = 1:nbFrameM(i, j) = s(((j - 1) * m) + i); %对矩阵M赋值endendh = hamming(n); %加 hamming 窗,以增加音框左端和右端的连续性M2 = diag(h) * M;for i = 1:nbFrameframe(:,i) = fft(M2(:, i)); %对信号进行快速傅里叶变换FFTendt = n / 2;tmax = l / fs;m = Melfb(20, n, fs); %将上述线性频谱通过Mel 频率滤波器组得到Mel 频谱,下面在将其转化成对数频谱n2 = 1 + floor(n / 2);z = m * abs(frame(1:n2, :)).^2;r = dct(log(z));3.计算距离函数Disteu.mfunction d = disteu(x, y)[M, N] = size(x); %音频x赋值给【M,N】[M2, P] = size(y); %音频y赋值给【M2,P】if (M ~= M2)error('不匹配!') %两个音频时间长度不相等endd = zeros(N, P);if (N < P)%在两个音频时间长度相等的前提下copies = zeros(1,P);for n = 1:Nd(n,:) = sum((x(:, n+copies) - y) .^2, 1);endelsecopies = zeros(1,N);for p = 1:Pd(:,p) = sum((x - y(:, p+copies)) .^2, 1)';end%%成对欧氏距离的两个矩阵的列之间的距离endd = d.^0.5;4.特征提取辅助函数vqlbg.mfunction r = vqlbg(d,k)e = .01;r = mean(d, 2);dpr = 10000;for i = 1:log2(k)r = [r*(1+e), r*(1-e)];while (1== 1)z = Disteu(d, r);[m,ind] = min(z, [], 2);t = 0;for j = 1:2^ir(:, j) = mean(d(:, find(ind == j)), 2);x = Disteu(d(:, find(ind == j)), r(:, j));for q = 1:length(x)t = t + x(q);endendif (((dpr - t)/t) < e)break;elsedpr = t;endendend6.Mel滤波器组函数melfb.mfunction m = melfb(p, n, fs)f0 = 700 / fs;fn2 = floor(n/2);lr = log(1 + 0.5/f0) / (p+1);% convert to fft bin numbers with 0 for DC termbl = n * (f0 * (exp([0 1 p p+1] * lr) - 1));b1 = floor(bl(1)) + 1;b2 = ceil(bl(2));b3 = floor(bl(3));b4 = min(fn2, ceil(bl(4))) - 1;pf = log(1 + (b1:b4)/n/f0) / lr;fp = floor(pf);pm = pf - fp;r = [fp(b2:b4) 1+fp(1:b3)];c = [b2:b4 1:b3] + 1;v = 2 * [1-pm(b2:b4) pm(1:b3)];m = sparse(r, c, v, p, 1+fn2);主函数:function varargout = xm2(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @xm2_OpeningFcn, ...'gui_OutputFcn', @xm2_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before xm2 is made visible.function xm2_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 xm2 (see VARARGIN)% Choose default command line output for xm2handles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes xm2 wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line. function varargout = xm2_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 structurevarargout{1} = handles.output;% --- Executes on button press in yuansheng.function yuansheng_Callback(hObject, eventdata, handles)% hObject handle to yuansheng (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)fs=50000;%x1=wavread('E:\b.wav');[k1, fs] = wavread('E:\moban.wav');% [k2, fs] = wavread('E:\e2.wav');% [k3, fs] = wavread('E:\e3.wav');% [k4, fs] = wavread('E:\e4.wav');% [k5, fs] = wavread('E:\e5.wav');sound(k1,fs);%t=(0:length(x)-1)/fs;%计算样本时刻y1=fft(k1,50000);%X=fft(x.*hamming (length (x)));%fm=5000*length(X)/fs; %限定频率范围%f=(0:fm)*fs/length (x); %确定频率刻度axes(handles.zuobiaoa);plot(k1);axes(handles.zuobiaob);pinpu=plot(abs(y1));function tuichu_Callback(hObject, eventdata, handles)close(gcf);function caijibofang_Callback(hObject, eventdata, handles)fs=50000;[x,fs,bits]=wavread('D:\ssssss\bbb\bin\xm2\AA.wav'); %读取语音信号的数据,赋给变量xsound(x,fs);y1=fft(x,50000);axes(handles.zuobiaoc);plot(x);axes(handles.zuobiaod);pinpu=plot(abs(y1));function lvbo_Callback(hObject, eventdata, handles)lvbo;function luyin_Callback(hObject, eventdata, handles)Fs=50000;y=wavrecord(5*Fs,Fs,'int16');wavwrite(y,Fs,'AA');function shibie_Callback(hObject, eventdata, handles) shibiezhu;滤波函数lvbo.mfp=[2800 3800];fs=[20 20000];%2500 3000fsa=50000;ap=60;as=250; %50 270wp=fp/fsa*2;ws=fs/fsa*2;[n,wn]=buttord(wp,ws,ap,as);[B,A]=butter(n,wn);% [H,w]=freqz(B,A,512);% plot(w*50000/(2*pi),abs(H)); %[y,fsa,bits]=wavread('D:\ssssss\bbb\bin\xm2\AA.wav');G=filter(B,A,y);Y=fft(G,50000);wavwrite(Y,fsa,'AA');axes(handles.zuobiaoc);plot(G);axes(handles.zuobiaod);plot(abs(Y));function [db,mag,pha,grd,w] = freqz_m(b,a);% Modified version of freqz subroutine% ------------------------------------% [db,mag,pha,grd,w] = freqz_m(b,a);% db = Relative magnitude in dB computed over 0 to pi radians % mag = absolute magnitude computed over 0 to pi radians% pha = Phase response in radians over 0 to pi radians% grd = Group delay over 0 to pi radians% w = 501 frequency samples between 0 to pi radians% b = numerator polynomial of H(z) (for FIR: b=h)% a = denominator polynomial of H(z) (for FIR: a=[1])%[H,w] = freqz(b,a,1000,'whole');H = (H(1:1:501))'; w = (w(1:1:501))';mag = abs(H);db = 20*log10((mag+eps)/max(mag));pha = angle(H);% pha = unwrap(angle(H));grd = grpdelay(b,a,w);% grd = diff(pha);% grd = [grd(1) grd];% grd = [0 grd(1:1:500); grd; grd(2:1:501) 0];% grd = median(grd)*500/pi;GUI界面布局:六.感受1.通过实验,是我对MATLAB有了一个基础的了解,在学习MATLAB编程中需要很多的参考书,要尽量多的熟悉matlab自带的函数及其作用,因为matlab 的自带函数特别多,基本上能够满足一般的数据和矩阵的计算,所以基本上不用你自己编函数。