⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tof.m

📁 声纳系统的
💻 M
字号:
function varargout = tof(varargin)% TOF demonstrates sound ranging (sonar) between PC%   speaker and microphone (up to 6m away).%% This demo requires:%   - Data Acquisition Toolbox,%   - Signal Processing Toolbox%   - Windows sound card%   - files: sonar_anal.m tof.fig tof.m (this file)%% How does it work?%   A pulse wave (chirp) is generated from the speaker,%   which travels through air at the speed of sound.  %   At the same time the microphone records the received%   wave (plus possible reflections depending on room%   acoustics).  The propagation time delay (sec) is %   measured and converted to distance (m).% (c) 2001 R.Bemis, The MathWorks, Inc.% TOF Application M-file for tof.fig%    FIG = TOF launch tof GUI.%    TOF('callback_name', ...) invoke the named callback.% Last Modified by GUIDE v2.0 18-Oct-2001 17:27:18% Updated by R.Bemis July 5, 2007%   * Removed hard coded calibrations - less accurate, more robustif nargin == 0  % LAUNCH GUI	fig = openfig(mfilename,'reuse');	% Use system color scheme for figure:	set(fig,'Color',get(0,'defaultUicontrolBackgroundColor'));	% Generate a structure of handles to pass to callbacks, and store it. 	handles = guihandles(fig);	guidata(fig, handles);    %sonar_setup(handles,0.0087)  % set up audio I/O    sonar_setup(handles,0)      % set up audio I/O    	if nargout > 0		varargout{1} = fig;	endelseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK	try		if (nargout)			[varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard		else			feval(varargin{:}); % FEVAL switchyard		end	catch		disp(lasterr);	endend%| ABOUT CALLBACKS:%| GUIDE automatically appends subfunction prototypes to this file, and %| sets objects' callback properties to call them through the FEVAL %| switchyard above. This comment describes that mechanism.%|%| Each callback subfunction declaration has the following form:%| <SUBFUNCTION_NAME>(H, EVENTDATA, HANDLES, VARARGIN)%|%| The subfunction name is composed using the object's Tag and the %| callback type separated by '_', e.g. 'slider2_Callback',%| 'figure1_CloseRequestFcn', 'axis1_ButtondownFcn'.%|%| H is the callback object's handle (obtained using GCBO).%|%| EVENTDATA is empty, but reserved for future use.%|%| HANDLES is a structure containing handles of components in GUI using%| tags as fieldnames, e.g. handles.figure1, handles.slider2. This%| structure is created at GUI startup using GUIHANDLES and stored in%| the figure's application data using GUIDATA. A copy of the structure%| is passed to each callback.  You can store additional information in%| this structure at GUI startup, and you can change the structure%| during callbacks.  Call guidata(h, handles) after changing your%| copy to replace the stored original so that subsequent callbacks see%| the updates. Type "help guihandles" and "help guidata" for more%| information.%|%| VARARGIN contains any extra arguments you have passed to the%| callback. Specify the extra arguments by editing the callback%| property in the inspector. By default, GUIDE sets the property to:%| <MFILENAME>('<SUBFUNCTION_NAME>', gcbo, [], guidata(gcbo))%| Add any extra arguments after the last argument, before the final%| closing parenthesis.% --------------------------------------------------------------------function varargout = Single_Callback(h, eventdata, handles, varargin)set(handles.Repeat,'enable','off')      % disable Repeat buttonsonar_once(handles.figure1)             % take one measurement% --------------------------------------------------------------------function varargout = Repeat_Callback(h, eventdata, handles, varargin)set(h,'enable','off')                   % disable Repeat buttonset(handles.Single,'enable','off')      % disbale Single buttonset(handles.Stop,'enable','on')         % enable Stop buttonsonar_run(handles.figure1)              % measure repeatedly% --------------------------------------------------------------------function varargout = Stop_Callback(h, eventdata, handles, varargin)set(h,'enable','off')                   % disable Stop buttonset(handles.Repeat,'enable','on')       % enable Repeat buttonset(handles.Single,'enable','on')       % enable Single buttonsonar_stop(handles.figure1)             % stop repeats% --------------------------------------------------------------------function sonar_setup(handles,cal_dist)fig = handles.figure1;  % figure handleif nargin<2  cal_dist = 0; end% physicsc = 330;            % speed of sound (m/sec)d = 50;             % max distance (m)Td = d/c;           % max return time (sec)pw = 0.01;          % pulse width (sec)Tmax = Td+pw;       % total response time (sec)% DAQ parametersai = analoginput('winsound');               % create AI objectaddchannel(ai,1);                           % single channel (mono)Fs = setverify(ai,'samplerate',44100);      % sample rate (Hz)N = 2^ceil(log2(Tmax*Fs));                  % buffer size (samples)ao = analogoutput('winsound');              % create AO objectaddchannel(ao,1);                           % single channel (mono)ao.SampleRate=Fs;                           % output Fs same as input% excitation chirpf0 = 4e3;                       % low freq (Hz)f1 = 8e3;                       % high freq (Hz) t = (0:(1/Fs):pw)';             % time index (sec)n = length(t);                  % pulse length (samples)pulse = chirp(t,f0,pw,f1);      % chrip waveform (short)pulse = pulse.*hanning(n);      % pulse envelopepad = zeros(N-n,1);             % silence trailing chirpx = [pulse; pad];               % excitation (zero padded)% response waveformai.SamplesPerTrigger = N;           % total samples to acquireai.TriggerDelayUnits = 'sec';ai.TriggerDelay = cal_dist/c;       % calibration lag (sec)ai.SamplesAcquiredFcnCount = N;ai.SamplesAcquiredFcn = ['sonar_anal(' num2str(fig) ')'];% user dataud.ai = ai;                 % audio inputud.ao = ao;                 % audio outputud.c = c;                   % wave speed in airud.x = x;                   % excitation waveformud.h = handles;             % guide figure handlesset(fig,'userdata',ud)      % store bundle with figure% --------------------------------------------------------------------function sonar_once(fig)% user dataud = get(fig,'userdata');       % user data fieldsai = ud.ai;                     % audio inputao = ud.ao;                     % audio outputx = ud.x;                       % excitation chirp pulseai.samplesacquiredfcn = '';     % don't repeat measurementputdata(ao,x)                   % arm audio outputstart([ai ao])                  % start measurementsonar_anal(fig)                 % manually analyze data% --------------------------------------------------------------------function sonar_run(fig)% user dataud = get(fig,'userdata');   % user data fieldsai = ud.ai;                 % audio inputao = ud.ao;                 % audio outputx = ud.x;                   % excitation chirp pulse% callback function to analyze when done acquiring dataai.samplesacquiredfcn = ['sonar_anal(' num2str(fig) ')'];% NOTE: sonar_anal will rearm output and repeat measurementputdata(ao,x)       % arm audio outputstart([ai ao])      % start measuring (will repeat)% --------------------------------------------------------------------function sonar_stop(fig)% user dataud = get(fig,'userdata');       % user data fieldsai = ud.ai;                     % audio inputai.samplesacquiredfcn = '';     % stop repeating% --------------------------------------------------------------------function sonar_cleanup(fig)% user dataud = get(fig,'userdata');     % user data fieldsai = ud.ai; delete(ai)        % remove audio inputao = ud.ao; delete(ao)        % remove audio output% --------------------------------------------------------------------function varargout = figure1_CloseRequestFcn(h, eventdata, handles, varargin)sonar_stop(handles.figure1)         % stops if still repeatingsonar_cleanup(handles.figure1)      % remove audio objectsdelete(handles.figure1)             % remove figure window

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -