信號處理實驗音頻頻譜分析儀設(shè)計_第1頁
信號處理實驗音頻頻譜分析儀設(shè)計_第2頁
信號處理實驗音頻頻譜分析儀設(shè)計_第3頁
信號處理實驗音頻頻譜分析儀設(shè)計_第4頁
信號處理實驗音頻頻譜分析儀設(shè)計_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、信號處理實驗實驗八:音頻頻譜分析儀設(shè)計與實現(xiàn)實驗名稱:音頻頻譜分析儀設(shè)計與實現(xiàn)實驗原理:MATLAB是一個數(shù)據(jù)信息和處理功能十分強大的工程實用軟件,其數(shù)據(jù)采集工具箱為實現(xiàn)數(shù)據(jù)的輸入和輸出提供了十分方便的函數(shù)和命令。本實驗可以用MATLAB進行音頻信號頻譜分析儀的設(shè)計與實現(xiàn)。1、信號頻率、幅值和相位估計(1)頻率(周期)檢測對周期信號來說,可以用時域波形分析來確定信號的周期,也就是計算相鄰的兩個信號波峰的時間差、或過零點的時間差。這里采用過零點(ti)的時間差T(周期)。頻率即為f = 1/T,由于能夠求得多個T值(ti有多個),故采用它們的平均值作為周期的估計值。(2)幅值檢測在一個周期內(nèi),求

2、出信號最大值ymax與最小值ymin的差的一半,即A = (ymax - ymin)/2,同樣,也會求出多個A值,但第1個A值對應(yīng)的ymax和ymin不是在一個周期內(nèi)搜索得到的,故以除第1個以外的A值的平均作為幅值的估計值。(3)相位檢測采用過零法,即通過判斷與同頻零相位信號過零點時刻,計算其時間差,然后換成相應(yīng)的相位差。=2(1-ti/T),x表示x的小數(shù)部分,同樣,以的平均值作為相位的估計值。頻率、幅值和相位估計的流程如圖所示。其中tin表示第n個過零點,yi為第i個采樣點的值,F(xiàn)s為采樣頻率。2、數(shù)字信號統(tǒng)計量估計(1) 峰值P的估計在樣本數(shù)據(jù)x中找出最大值與最小值,其差值為雙峰值,雙峰

3、值的一半即為峰值。P=0.5max(yi)-min(yi)(2)均值估計式中,N為樣本容量,下同。(3) 均方值估計方差估計頻譜分析原理時域分析只能反映信號的幅值隨時間的變化情況,除單頻率分量的簡單波形外,很難明確提示信號的頻率組成和各頻率分量大小,而頻譜分析能很好的解決此問題。(1)DFT與FFT對于給定的時域信號y,可以通過Fourier變換得到頻域信息Y。Y可按下式計算式中,N為樣本容量,t = 1/Fs為采樣間隔。采樣信號的頻譜是一個連續(xù)的頻譜,不可能計算出所有的點的值,故采用離散Fourier變換(DFT),即式中,f = Fs/N。但上式的計算效率很低,因為有大量的指數(shù)(等價于三角

4、函數(shù))運算,故實際中多采用快速Fourier變換(FFT)。其原理即是將重復(fù)的三角函數(shù)算計的中間結(jié)果保存起來,以減少重復(fù)三角函數(shù)計算帶來的時間浪費。由于三角函數(shù)計算的重復(fù)量相當大,故FFT能極大地提高運算效率。(2)頻率、周期的估計對于Y(kf),如果當kf = 時,Y(kf)取最大值,則為頻率的估計值,由于采樣間隔的誤差,也存在誤差,其誤差最大為f / 2。周期T=1/f。從原理上可以看出,如果在標準信號中混有噪聲,用上述方法仍能夠精確地估計出原標準信號的頻率和周期,這個將在下一章做出驗證3、頻譜圖為了直觀地表示信號的頻率特性,工程上常常將Fourier變換的結(jié)果用圖形的方式表示,即頻譜圖。

5、以頻率f為橫坐標,|Y(f)|為縱坐標,可以得到幅值譜;以頻率f為橫坐標,arg Y(f)為縱坐標,可以得到相位譜;以頻率f為橫坐標,Re Y(f)為縱坐標,可以得到實頻譜;以頻率f為橫坐標,Im Y(f)為縱坐標,可以得到虛頻譜。根據(jù)采樣定理,只有頻率不超過Fs/2的信號才能被正確采集,即Fourier變換的結(jié)果中頻率大于Fs/2的部分是不正確的部分,故不在頻譜圖中顯示。即橫坐標f 0, Fs/24、模塊劃分模塊化就是把程序劃分成獨立命名且可獨立訪問的模塊,每個模塊完成一個子功能,把這些模塊集成起來構(gòu)成一個整體,可以完成指定的功能滿足用戶需求。根據(jù)人類解決一般問題的經(jīng)驗,如果一個問題由兩個問

6、題組合而成,那么它的復(fù)雜程度大于分別考慮每個問題時的復(fù)雜程度之和,也就是說把復(fù)雜的問題分解成許多容易解決的小問題,原來的問題也就容易解決了。這就是模塊化的根據(jù)。在模塊劃分時應(yīng)遵循如下規(guī)則:改進軟件結(jié)構(gòu)提高模塊獨立性;模塊規(guī)模應(yīng)該適中;深度、寬度、扇出和扇入都應(yīng)適當;模塊的作用域應(yīng)該在控制域之內(nèi);力爭降低模塊接口的復(fù)雜程度;設(shè)計單入口單出口的模塊;模塊功能應(yīng)該可以預(yù)測。實驗要求:參考以上原理,查閱相關(guān)資料,構(gòu)建交互界面,設(shè)計一個音頻頻譜分析儀,實現(xiàn)一下功能:音頻信號信號輸入,從聲卡輸入、從WAV文件輸入、從標準信號發(fā)生器輸入;信號波形分析,包括幅值、頻率、周期、相位的估計,以及統(tǒng)計量峰值、均值、

7、均方值和方差的計算;信號頻譜分析,頻率、周期的估計,圖形顯示幅值譜、相位譜、實頻譜、虛頻譜和功率譜的曲線。實驗界面及程序程序: function varargout = yinpin(varargin) % YINPIN M-file for yinpin.fig % YINPIN, by itself, creates a new YINPIN or raises the existing % singleton*. % % H = YINPIN returns the handle to a new YINPIN or the handle to % the existing single

8、ton*. % % YINPIN(CALLBACK,hObject,eventData,handles,.) calls the local % function named CALLBACK in YINPIN.M with the given input arguments. % % YINPIN(Property,Value,.) creates a new YINPIN or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI be

9、fore yinpin_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to yinpin_OpeningFcn via varargin. % % *See GUI Options on GUIDEs Tools menu. Choose GUI allows only one % instance to run (singleton). % % See also: GUI

10、DE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help yinpin % Last Modified by GUIDE v2.5 07-Nov-2012 17:08:53 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, yinpin_Opening

11、Fcn, . gui_OutputFcn, yinpin_OutputFcn, . gui_LayoutFcn, , . gui_Callback, ); if nargin & ischar(varargin1) gui_State.gui_Callback = str2func(varargin1); end if nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:); else gui_mainfcn(gui_State, varargin:); end function yinpin_OpeningFcn(hObj

12、ect, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = yinpin_OutputFcn(hObject, eventdata, handles) varargout1 = handles.output; function edit1_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultU

13、icontrolBackgroundColor) set(hObject,BackgroundColor,white); end function caiyangpinlv_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function caiyangdianshu_CreateFcn(hObject, even

14、tdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function luyin_Callback(hObject, eventdata, handles) set(handles.luyin,value,1); set(handles.wavfile,value,0); set(handles.xinhaofasheng,value,0); h=findobj(

15、Tag,recordtime); set(h,enable,on); h=findobj(Tag,kaishiluyin); set(h,enable,on); h=findobj(Tag,wavname); set(h,enable,off); h=findobj(Tag,liulan); set(h,enable,off); h=findobj(Tag,inwave); set(h,enable,off); h=findobj(Tag,infudu); set(h,enable,off); h=findobj(Tag,infre); set(h,enable,off); h=findobj

16、(Tag,inphase); set(h,enable,off); h=findobj(Tag,mix); set(h,enable,off); h=findobj(Tag,shengchengboxing); set(h,enable,off); function wavfile_Callback(hObject, eventdata, handles) set(handles.luyin,value,0); set(handles.wavfile,value,1); set(handles.xinhaofasheng,value,0); h=findobj(Tag,recordtime);

17、 set(h,enable,off); h=findobj(Tag,kaishiluyin); set(h,enable,off); h=findobj(Tag,wavname); set(h,enable,on); h=findobj(Tag,liulan); set(h,enable,on); h=findobj(Tag,inwave); set(h,enable,off); h=findobj(Tag,infudu); set(h,enable,off); h=findobj(Tag,infre); set(h,enable,off); h=findobj(Tag,inphase); s

18、et(h,enable,off); h=findobj(Tag,mix); set(h,enable,off); h=findobj(Tag,shengchengboxing); set(h,enable,off); function xinhaofasheng_Callback(hObject, eventdata, handles) set(handles.luyin,value,0); set(handles.wavfile,value,0); set(handles.xinhaofasheng,value,1); h=findobj(Tag,recordtime); set(h,ena

19、ble,off); h=findobj(Tag,kaishiluyin); set(h,enable,off); h=findobj(Tag,wavname); set(h,enable,off); h=findobj(Tag,liulan); set(h,enable,off); h=findobj(Tag,inwave); set(h,enable,on); h=findobj(Tag,infudu); set(h,enable,on); h=findobj(Tag,infre); set(h,enable,on); h=findobj(Tag,inphase); set(h,enable

20、,on); h=findobj(Tag,mix); set(h,enable,on); h=findobj(Tag,shengchengboxing); set(h,enable,on); function recordtime_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function kaishiluyi

21、n_Callback(hObject, eventdata, handles) Fs=str2double(get(handles.caiyangpinlv,String); N=str2double(get(handles.recordtime,String)*Fs; handles.y=wavrecord(N, Fs,double); handles.inputtype=1; guidata(hObject,handles); plot(handles.fenxiduixiang,handles.y); ysize=size(handles.y); set(handles.caiyangd

22、ianshu,String,num2str(ysize(1); function wavname_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function liulan_Callback(hObject, eventdata, handles) filename,filepath=uigetfile(*.w

23、av,wavfile); set(handles.wavname,string,filename); handles.y,Fs,bit=wavread(filename); handles.inputtype=2; guidata(hObject,handles); plot(handles.fenxiduixiang,(1:length(handles.y)/10)/Fs,handles.y(1:length(handles.y)/10); ysize=size(handles.y); set(handles.caiyangdianshu,String,num2str(ysize(1); s

24、et(handles.caiyangpinlv,string,Fs); function listbox2_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function inwave_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hOb

25、ject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function infudu_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function infre_C

26、reateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function inphase_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroun

27、dColor) set(hObject,BackgroundColor,white); end function shengchengboxing_Callback(hObject, eventdata, handles) Fs=str2double(get(findobj(Tag,caiyangpinlv),String); N=str2double(get(findobj(Tag,caiyangdianshu),String); x=linspace(0,N/Fs,N); soundtype=get(handles.inwave,Value); frequency=str2double(g

28、et(handles.infre,String); amp=str2double(get(handles.infudu,String); phase=str2double(get(handles.inphase,String); switch soundtype case 1 y=amp*sin(2*pi*x*frequency+phase); handles.inputtype=3; case 2 y=amp*sign(sin(2*pi*x*frequency+phase); handles.inputtype=3; case 3 y=amp*sawtooth(2*pi*x*frequenc

29、y+phase,0.5); handles.inputtype=3; case 4 y=amp*sawtooth(2*pi*x*frequency+phase); handles.inputtype=3; case 5 y=amp*(2*rand(size(x)-1); handles.inputtype=4; end if get(handles.mix,Value)=0.0 handles.y=y; else handles.y=handles.y+y; end guidata(hObject,handles); plot(handles.fenxiduixiang,handles.y);

30、 title(WAVE); axis(0 N -str2double(get(handles.infudu,String) str2double(get(handles.infudu,String); function edit11_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function edit12_C

31、reateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function popupmenu3_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgr

32、oundColor) set(hObject,BackgroundColor,white); end function edit13_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function edit14_CreateFcn(hObject, eventdata, handles) if ispc & is

33、equal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function edit15_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end fun

34、ction edit9_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function edit10_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicont

35、rolBackgroundColor) set(hObject,BackgroundColor,white); end function circle_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function outfreq_CreateFcn(hObject, eventdata, handles) if

36、 ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end function outamp_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white

37、); end function outphase_CreateFcn(hObject, eventdata, handles) if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all properties. function outpeak_CreateFcn(hObject, eventd

38、ata, handles) % hObject handle to outpeak (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal

39、(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all properties. function outmean_CreateFcn(hObject, eventdata, handles) % hObject handle to outmean (see GCBO) % eventdata reserved - to be

40、 defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject

41、,BackgroundColor,white); end % - Executes during object creation, after setting all properties. function edit24_CreateFcn(hObject, eventdata, handles) % hObject handle to edit24 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until

42、after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all

43、 properties. function outminus_CreateFcn(hObject, eventdata, handles) % hObject handle to outminus (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white backgrou

44、nd on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all properties. function foutt_CreateFcn(hObject, eventdata, handles) % hObject ha

45、ndle to foutt (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor

46、), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all properties. function foutfreq_CreateFcn(hObject, eventdata, handles) % hObject handle to foutfreq (see GCBO) % eventdata reserved - to be defined in a future versi

47、on of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); e

48、nd % - Executes during object creation, after setting all properties. function pointfrom_CreateFcn(hObject, eventdata, handles) % hObject handle to pointfrom (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns

49、 called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes during object creation, after setting all properties. functio

50、n pointto_CreateFcn(hObject, eventdata, handles) % hObject handle to pointto (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See I

51、SPC and COMPUTER. if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white); end % - Executes on button press in timeanalyse. function timeanalyse_Callback(hObject, eventdata, handles) Fs=str2double(get(findobj(Tag,caiyangpinlv),String)

52、; N=str2double(get(findobj(Tag,caiyangdianshu),String); if handles.inputtype=0 msgbox(No wave exist! Please choose a input type!); return; end %guo ling jian ce n=1; ymax=max(handles.y(1) handles.y(2); ymin=min(handles.y(1) handles.y(2); from=str2double(get(handles.pointfrom,String); to=str2double(g

53、et(handles.pointto,String); if from1 | to-from5; msgbox(Error range!); return; end for i=from+2:to-1; if handles.y(i-1)0 & handles.y(i-2)=0 & handles.y(i+1)0 if handles.y(i)=0 ti(n)=i; else ti(n)=i-handles.y(i)/(handles.y(i)-handles.y(i-1); end amp(n)=(ymax-ymin)/2; ymax=0; ymin=0; n=n+1; else if ym

54、axhandles.y(i) ymin=handles.y(i); end end end n=n-1; %freqence and periodicity for i=1:n-1 T(i)=ti(i+1)-ti(i); end freq=Fs/mean(T); if (handles.inputtype=1|handles.inputtype=2|handles.inputtype=4) set(handles.circle,String,非周期); set(handles.outfreq,String,非周期); end if(handles.inputtype=3) set(handle

55、s.circle,String,1/freq); set(handles.outfreq,String,num2str(freq); end set(handles.outamp,String,num2str(mean(amp(2:n-1); %phase phase=2*pi*(1-(ti(1:n-1)-1)./T+floor(ti(1:n-1)-1)./T); set(handles.outphase,String,num2str(mean(phase); %peak set(handles.outpeak,String,(max(handles.y(from:to)-min(handle

56、s.y(from:to)/2); %mean set(handles.outmean,String,mean(handles.y(from:to); %meansquare set(handles.outmeansquare,String,mean(handles.y(from:to).2); %s set(handles.outminus,String,std(handles.y(from:to)2); % - function uipanel18_ButtonDownFcn(hObject, eventdata, handles) % hObject handle to uipanel18

57、 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) filename,filepath=uigetfile(*.wav,wavfile); set(handles.wavname,string,filename); handles.y,Fs,bit=wavread(filename); handles.inputtype=2; guidata(hObject,handles); plot(handles.axes1,(1:length(handles.y)/Fs,handles.y); ysize=size(handles.y); set(handles.samplenum,String

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論