基于Matlab编写的语音端点检测_第1页
基于Matlab编写的语音端点检测_第2页
基于Matlab编写的语音端点检测_第3页
基于Matlab编写的语音端点检测_第4页
基于Matlab编写的语音端点检测_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./基于Matlab编写的语音端点检测专业:班级:姓名:指导教师:2011年6月18日一、实验目的1.学会MATLAB的使用,掌握MATLAB的程序设计方法;3.掌握语音处理的基本概念、基本理论和基本方法;4.掌握基于MATLAB编程实现带噪语音信号端点检测;5.学会用MATLAB对信号进行分析和处理。二、实验容简介:可利用时域分析〔短时能量、短时过零率、短时自相关方法的某一个特征或某几个特征的结合,判定某一语音信号的端点,尤其在有噪声干扰时,如何准确检测语音信号的端点,这在语音处理中是富有挑战性的一个课题。要求:〔1录制语音,读入文件,绘制波形〔2分帧,绘制能量曲线和短时过零率曲线〔3根据上述端点检测原理,实现端点检测〔4界面三.课程设计原理端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果,因此端点检测方法的研究一直是语音信号处理中的热点。本设计使用传统的短时能量和过零率相结合的语音端点检测算法利用短时过零率来检测清音.用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。算法以短时能量检测为主,短时过零率检测为辅。根据语音的统计特性,可以把语音段分为清音、浊音以及静音〔包括背景噪声三种。在本算法中,短时能量检测可以较好地区分出浊音和静音。对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。将两种检测结合起来,就可以检测出语音段〔清音和浊音及静音段1、短时能量计算定义n时刻某语音信号的短时平均能量为:式中N为窗长,可见短时平均能量为为一帧样点值的甲醛平方和。特殊地,当窗函数为矩形窗时,有2、短时过零率过零就是指信号通过零值。过零率就是每秒信号值通过零值的次数。对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。对于语音信号,则是指在一帧语音中语音信号波形穿过横轴〔零电平的次数。可以用相邻两个取样改变符号的次数来计算。如果窗的起点是n=0,短时过零率Z为波形穿过横轴〔零电平的次数短时过零可以看作信号频率的简单度量浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。短时自相关函数1、是偶函数;2、s<n>是周期的,那么R<k>也是周期的;3、可用于基音周期估计和线性预测分析4、判断语音信号的起点和终点利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者配合。首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。低门限被超过未必是语音的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段的语音超首先,可根据浊语音情况下短时平均幅度M的概率密度函数P<M/V>确定一个阈值参数MH,MH的值定得比较高。当一帧输入信号的M值超过MH时,就可以十分肯定该帧语音信号不是无声,而有相当大的可能性是浊音由N1’向前和N2’向后继续用短时过零率Z进行搜索。根据无声情况下短时过零率Z的均值,设置一个参数Z0,如果由N1’向前搜索时Z始终大于Z0的3倍,则认为这些信号仍属于语音段,直至Z突然下降到低于3Z0值时,这时可以确定语音的精确起点〔为了保证可靠,由N1’向前搜索时间不超过25ms。对终点做同样的处理。采取这一算法的原因在于,N1’以前可能是一段清辅音段〔如f,s,它的能量相当弱,依靠能量不可能把他们与无声段区别开,而他们的过零率明显高于无声,因而能用这个参数来精确的判断二者的分割点,也就是语音真正的起点。四、实验步骤及分步结果1.界面设计2.程序设计〔1.①打开语音文件functionopenbutton_Callback<hObject,eventdata,handles>clc;axes<handles.wavaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;axes<handles.Energeaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;axes<handles.Zerorateaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;set<handles.T1edit,'string',0>;set<handles.T2edit,'string',0>;set<handles.T3edit,'string',0>;%´ò¿ª´ý´¦ÀíµÄÓïÒôÎļþ[filename,pathname]=uigetfile<{'*.wav','AllWavFiles'},'Ñ¡ÔñÓïÒôÎļþ'>;iffilename==0return;%Èç¹ûûÓÐÑ¡ÔñеÄÎļþ£¬Ôò·µ»Øendfile=fullfile<pathname,filename>;%ÎļþÃû[signal,fs,bit]=wavread<file>;%¶ÁȡѡÔñµÄÓïÒôÊý¾Ýaxes<handles.wavaxes>plot<signal>%ÏÔʾ²¨ÐÎhandles.wavsignal=signal;%updatehandlesstructureguidata<hObject,handles>;②预处理预处理程序functionprebutton_Callback<hObject,eventdata,handles>%hObjecthandletoprebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>signal=handles.wavsignal;signal=filter<[1,-0.9375],1,signal>;%Ô¤¼ÓÖØÂ˲¨axes<handles.wavaxes>plot<signal>%ÏÔʾԤ¼ÓÖØºó²¨ÐÎtitle<'Ô¤¼ÓÖØÂ˲¨ºóÓïÒô²¨ÐÎ'>;handles.wavsignal=signal;framelength=256;%´°³¤£»framenumber=fix<length<signal>/framelength>;%×ÜÖ¡Êýfori=1:framenumber;framesignal<i,1:framelength>=signal<<i-1>*framelength+1:i*framelength>;%·ÖÖ¡´¦Àíendhandles.framesignal=framesignal;%Updatehandlesstructureguidata<hObject,handles>;③短时能量短时能量functionEnergebutton_Callback<hObject,eventdata,handles>%hObjecthandletoEnergebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>framesignal=handles.framesignal;framenumber=size<framesignal,1>;%»ñµÃÊý¾ÝèåÊýfori=1:framenumber;E<i>=0;E<i>=sum<framesignal<i,:>.^2>;%¼ÆËã¶ÌʱÄÜÁ¿endaxes<handles.Energeaxes>%c=[12345643333];plot<E>;%½«ÄÜÁ¿Ö»ÏÔʾÔÚÄÜÁ¿´°¿Úhandles.E=E;%Updatehandlesstructureguidata<hObject,handles>;%ExecutesonbuttonpressinZeroratebutton.functionZeroratebutton_Callback<hObject,eventdata,handles>%hObjecthandletoZeroratebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>framesignal=handles.framesignal;framenumber=size<framesignal,1>;%ÓïÒôÊý¾ÝÖ¡Êýframelength=size<framesignal,2>;%»ñÈ¡ÓïÒôÖ¡³¤fori=1:framenumber;Z<i>=0;forj=2:framelength-1;Z<i>=Z<i>+abs<sign<framesignal<i,j>>-sign<framesignal<i,j-1>>>;%¼ÆËã¶Ìʱ¹ýÁãÂÊendendaxes<handles.Zerorateaxes>%ÏÔʾ֡¹ýÁãÂÊÇúÏßplot<Z>handles.Z=Z;handles.framelength=framelength;%Updatehandlesstructureguidata<hObject,handles>;④短时过零率短时过零率functionZeroratebutton_Callback<hObject,eventdata,handles>%hObjecthandletoZeroratebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>framesignal=handles.framesignal;framenumber=size<framesignal,1>;%ÓïÒôÊý¾ÝÖ¡Êýframelength=size<framesignal,2>;%»ñÈ¡ÓïÒôÖ¡³¤fori=1:framenumber;Z<i>=0;forj=2:framelength-1;Z<i>=Z<i>+abs<sign<framesignal<i,j>>-sign<framesignal<i,j-1>>>;%¼ÆËã¶Ìʱ¹ýÁãÂÊendendaxes<handles.Zerorateaxes>%ÏÔʾ֡¹ýÁãÂÊÇúÏßplot<Z>handles.Z=Z;handles.framelength=framelength;%Updatehandlesstructureguidata<hObject,handles>;⑤设定门限1.2阈值设置门限1.2〔编辑框2functionT2edit_Callback<hObject,eventdata,handles>%hObjecthandletoT2edit<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>clcaxes<handles.Energeaxes>;clareset;boxon;set<gca,'XTicklabel',[],'YTicklabel',[]>;%ÔÚÊäÈëеÄa,bֵʱ£¬ÒªÇå¿ÕEnergeaxesÀïµÄͼÏñTL=get<handles.T1edit,'string'>;%»ñµÃTLÖµTH=get<handles.T2edit,'string'>;%»ñµÃTHÖµTL=str2num<TL>;%½«×Ö·ûÀàÐÍת»¯³ÉÊýÖµÀàÐÍTH=str2num<TH>;E=handles.E;MeanE=mean<E<1:10>>;%Çóǰ10Ö¡µÄÄÜÁ¿¾ùÖµaxes<handles.Energeaxes>plot<E>holdonline<[1length<E>],[TLTL],'Color','r'>;%ÓúìÏß»­³öTLÖµholdonline<[1length<E>],[TH,TH],'Color','b'>;%ÓÃÀ¶Ïß»­³öTHÖµhandles.TL=TL;handles.TH=TH;%Updatehandlesstructureguidata<hObject,handles>;⑥编辑框3门限3functionT3edit_Callback<hObject,eventdata,handles>%hObjecthandletoT3edit<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>clcaxes<handles.Zerorateaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YtickLabel',[]>;v=get<handles.T3edit,'string'>;v=1*str2num<v>;Z=handles.Z;MeanZ=mean<Z<1:10>>;VarZ=std<Z<1:10>>;ZT=min<v,MeanZ+VarZ>;axes<handles.Zerorateaxes>plot<Z>holdonline<[1,length<Z>],[ZT,ZT],'Color','b'>;handles.ZT=ZT;guidata<hObject,handles>;⑦端点检测端点检测functionDetectpointbutton_Callback<hObject,eventdata,handles>TL=handles.TL;%¼ÓÔØÊý¾ÝTH=handles.TH;ZT=handles.ZT;Z=handles.Z;E=handles.E;startflag=1;startframe=11;mins=min<handles.wavsignal>;maxs=max<handles.wavsignal>;axes<handles.wavaxes>;plot<handles.wavsignal>;accustartflag=1;accustartframe=startframe-15;i=accustartframe;k=0;i=11;while<startflag>%ÓöÌʱÄÜÁ¿³õ²½¼ÆËãÆðʼµãif<<E<i>>TL>&<E<i+1>>TH>>startframe=i;startflag=0;%±ê־λÇåÁãÍ˳öÑ­»·while<accustartflag>%ÓöÌʱ¹ýÁãÂʽøÒ»²½¼ÆËãÆðʼµãif<Z<i>>ZT>;k=k+1;if<k==3>accustartflag=0;accustartframe=i-3startframe=accustartframe;endelsek=0;endi=i+1;endelsei=i+1;endendendflag=1;endframe=length<E>;i=endframe;accuendflag=1;accuendframe=endframe+15;i=accuendframe;k=0;j=size<E>;fori=11:j-1;%ÓɶÌʱÄÜÁ¿´ÖÅÐÖÕÖ¹µãif<i==1>break;endif<<E<i>>TL>&<E<i-1>>TH>>endframe=i;while<accuendflag>%ÓɶÌʱ¹ýÁãÂʽøÒ»²½¼ÆËãÖÕÖ¹µãif<i>length<Z>>break;endif<Z<i>>ZT>k=k+1;if<k==3>accuendflag=0;accuendframe=i;endframe=accuendframe;endflag=0;endelsek=0;endi=i+1;endelsei=i-1;endendholdonline<[startframe*256startframe*256],[-0.50.5],'Color','b'>;%»­³öÆðʼµãholdonline<[endframe*256endframe*256],[-0.50.5],'Color','r'>;%»­³öÖÕÖ¹µã五、实验结论分析:从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。清音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。门限值的选取对语音检测结果有很大影响。仅仅根据能量判断是比较粗糙的,还需根据过零率进行判断。因为清音和噪声的短时平均过零率比背景噪声的平均过零率要高出好几倍。六,实验心得这次的实验,,给我最大的收获就是培养了独立思考和动手的能力,还有就是实验的灵活性,总得来说就是在独立与创新这二个环节,我更加掌握MATLAB的程序设计方法,进一步的了解了掌握基于MATLAB编程实现带噪语音信号端点检测的原理,这充分锻炼了我们独立的动手能力和独立的解决所遇到的问题,让我对这门课程又有了新的理解。七.参考资料1.王永琦《MATLAB与音视频技术》清华大学20XX11月第一版:91-103.2..纪庆磊铁然《语音信号处理》清华大学20XX9月第一版附源代码:functionvarargout=duandianjiance<varargin>%DUANDIANJIANCEMATLABcodeforduandianjiance.fig%DUANDIANJIANCE,byitself,createsanewDUANDIANJIANCEorraisestheexisting%singleton*.%%H=DUANDIANJIANCEreturnsthehandletoanewDUANDIANJIANCEorthehandleto%theexistingsingleton*.%%DUANDIANJIANCE<'CALLBACK',hObject,eventData,handles,...>callsthelocal%functionnamedCALLBACKinDUANDIANJIANCE.Mwiththegiveninputarguments.%%DUANDIANJIANCE<'Property','Value',...>createsanewDUANDIANJIANCEorraisesthe%existingsingleton*.Startingfromtheleft,propertyvaluepairsare%appliedtotheGUIbeforeduandianjiance_OpeningFcngetscalled.An%unrecognizedpropertynameorinvalidvaluemakespropertyapplication%stop.Allinputsarepassedtoduandianjiance_OpeningFcnviavarargin.%%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone%instancetorun<singleton>".%%Seealso:GUIDE,GUIDATA,GUIHANDLES%Edittheabovetexttomodifytheresponsetohelpduandianjiance%LastModifiedbyGUIDEv2.529-Dec-201414:40:22%Begininitializationcode-DONOTEDITgui_Singleton=1;gui_State=struct<'gui_Name',mfilename,...'gui_Singleton',gui_Singleton,...'gui_OpeningFcn',duandianjiance_OpeningFcn,...'gui_OutputFcn',duandianjiance_OutputFcn,...'gui_LayoutFcn',[],...'gui_Callback',[]>;ifnargin&&ischar<varargin{1}>gui_State.gui_Callback=str2func<varargin{1}>;endifnargout[varargout{1:nargout}]=gui_mainfcn<gui_State,varargin{:}>;elsegui_mainfcn<gui_State,varargin{:}>;end%Endinitializationcode-DONOTEDIT%Executesjustbeforeduandianjianceismadevisible.functionduandianjiance_OpeningFcn<hObject,eventdata,handles,varargin>%Thisfunctionhasnooutputargs,seeOutputFcn.%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>%varargincommandlineargumentstoduandianjiance<seeVARARGIN>%Choosedefaultcommandlineoutputforduandianjiancehandles.output=hObject;%Updatehandlesstructureguidata<hObject,handles>;%UIWAITmakesduandianjiancewaitforuserresponse<seeUIRESUME>%uiwait<handles.figure1>;%Outputsfromthisfunctionarereturnedtothecommandline.functionvarargout=duandianjiance_OutputFcn<hObject,eventdata,handles>%varargoutcellarrayforreturningoutputargs<seeVARARGOUT>;%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>%Getdefaultcommandlineoutputfromhandlesstructurevarargout{1}=handles.output;%Executesonbuttonpressinprebutton.functionprebutton_Callback<hObject,eventdata,handles>%hObjecthandletoprebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>signal=handles.wavsignal;signal=filter<[1,-0.9375],1,signal>;%预加重滤波axes<handles.wavaxes>plot<signal>%显示预加重后波形title<'预加重滤波后语音波形'>;handles.wavsignal=signal;framelength=256;%窗长;framenumber=fix<length<signal>/framelength>;fori=1:framenumber;framesignal<i,1:framelength>=signal<<i-1>*framelength+1:i*framelength>;endhandles.framesignal=framesignal;%Updatehandlesstructureguidata<hObject,handles>;%Executesonbuttonpressinopenbutton.functionopenbutton_Callback<hObject,eventdata,handles>%hObjecthandletoopenbutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>%当打开新的语音文件后,将3个轴对象清空,将各个门限值设置为零clc;axes<handles.wavaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;axes<handles.Energeaxe>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;axes<handles.Zerorateaxes>;clareset;boxon;set<gca,'XTickLabel',[],'YTickLabel',[]>;set<handles.T1edit,'string',0>;set<handles.T2edit,'string',0>;set<handles.T3edit,'string',0>;%打开待处理的语音文件[filename,pathname]=uigetfile<{'*.wav','AllWavFiles'},'选择语音文件'>;iffilename==0return;%如果没有选择新的文件,则返回endfile=fullfile<pathname,filename>;%文件名[signal,fs,bit]=wavread<file>;%读取选择的语音数据axes<handles.wavaxes>plot<signal>%显示波形handles.wavsignal=signal;%updatehandlesstructureguidata<hObject,handles>;%ExecutesonbuttonpressinEnergebutton.functionEnergebutton_Callback<hObject,eventdata,handles>%hObjecthandletoEnergebutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>framesignal=handles.framesignal;framenumber=size<framesignal,1>;%获得数据桢数fori=1:framenumber;E<i>=0;E<i>=sum<framesignal<i,:>.^2>;%计算短时能量endaxes<handles.Energeaxes>%c=[12345643333];plot<E>;%将能量只显示在能量窗口handles.E=E;%Updatehandlesstructureguidata<hObject,handles>;%ExecutesonbuttonpressinZeroratebotton.functionZeroratebotton_Callback<hObject,eventdata,handles>%hObjecthandletoZeroratebotton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>framesignal=handles.framesignal;framenumber=size<framesignal,1>;%语音数据帧数framelength=size<framesignal,2>;%获取语音帧长fori=1:framenumber;Z<i>=0;forj=2:framelength-1;Z<i>=Z<i>+abs<sign<framesignal<i,j>>-sign<framesignal<i,j-1>>>;endendaxes<handles.Zerorateaxes>plot<Z>handles.Z=Z;%Updatehandlesstructureguidata<hObject,handles>;%ExecutesonbuttonpressinDetectpointbutton.functionDetectpointbutton_Callback<hObject,eventdata,handles>%hObjecthandletoDetectpointbutton<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>functionT1edit_Callback<hObject,eventdata,handles>%hObjecthandletoT1edit<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>%Hints:get<hObject,'String'>returnscontentsofT1editastext%str2double<get<hObject,'String'>>returnscontentsofT1editasadouble%Executesduringobjectcreation,aftersettingallproperties.functionT1edit_CreateFcn<hObject,eventdata,handles>%hObjecthandletoT1edit<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled%Hint:editcontrolsusuallyhaveawhitebackgroundonWindows.%SeeISPCandCOMPUTER.ifispc&&isequal<get<hObject,'BackgroundColor'>,get<0,'defaultUicontrolBackgroundColor'>>set<hObject,'BackgroundColor','white'>;endfunctionT2edit_Callback<hObject,eventdata,handles>%hObjecthandletoT2edit<seeGCBO>%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata<seeGUIDATA>clcaxes<handles.Energeaxes>;clareset;boxon;set<gca,'XTicklabel',[],'YTicklabel',[]>;%在输入新的a,b值时,要清空Energeaxes里的图像a=get<handles.T1edit,'string'>;%获得α值b=get<handles.T2edit,'string'>;%获得β值a=str2num<a>;b=str2num<b>;E=handles.E;MeanE=mean<E<1:10>>;%求前10帧的能量均值MINE=min<E>;%计算能量最小值MAXE=max<E>;%计算能量的最大值%计算TL<低能量阈值>和TH〔高能量阈值I1=a*<MAXE-MINE>+MINE;%I1=α×〔MAXE-MINE+MINE;I2=b*MINE;%I2=β×MINE;TL=min<I1,I2>;TH=5*TL;axes<handles.Energeaxes>plot<E>holdonLine<[1length<E>],[TLTL]','Color','b'>;%用红线画出TL值holdonline<[1length<E>],[TH,TH]','Color','g'>;%用蓝线画出TH值handles.TL=TL;handles.TH=TH;%Updatehandlesstructureguidata<hObject,handles>;%Hints:get<hObject,'String'>returnscontentsofT2editastext%str2double<get<hObject,'String'>>returnscontentsofT2editasa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论