📄 daqwaterfall.m
字号:
function varargout = daqwaterfall(varargin)
% daqwaterfall
%
% Displays a waterfall plot with data streamed in from the Data
% Acquisition Toolbox. This demo was created using Guide in MATLAB 6.5.
% This demo uses a lot of the code from demoai_fft.
%
% The input source is hardcoded to channel one of the system soundcard.
% You should be able to change this if necessary by modifying the
% parameter in the I N P U T S section of the file daqwaterfall.m
%
% Last Modified by GUIDE v2.5 06-Jan-2003 23:34:34% Author: Daniel Lee (dlee@mathworks.com)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @daqwaterfall_OpeningFcn, ...
'gui_OutputFcn', @daqwaterfall_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin & isstr(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
% End initialization code - DO NOT EDIT
% --- Executes just before daqwaterfall is made visible.
function daqwaterfall_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 daqwaterfall (see VARARGIN)
% Choose default command line output for daqwaterfall
handles.output = hObject;
%%%%%%%%%%%%%%%%%%%%%%%
% ++++ I N P U T S ++++
%%%%%%%%%%%%%%%%%%%%%%%
% Change these settings to select a different source.
handles.adaptor = 'winsound';
handles.id = 0;
handles.chan = 1;
handles.samplesPerTrigger = 1024;
handles.sampleRate = 44100;
handles.numTraces = 10; % number of traces to show in the waterfall.
handles.cycleTime = .9; % Proportional to the amount of time spent per
% visualization on CycleAll setting.
%%%%%%%%%%%%%%%%%%%%%%%
% ---- I N P U T S ----
%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ++++ S E T U P T H E F I G U R E ++++
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*%%%%%%
set(handles.figure1,'Color',get(handles.tTitle,'BackgroundColor'));
axes(handles.axes1);
handles.hLine1 = plot(zeros(1,handles.samplesPerTrigger)');
set(handles.hLine1,'Color', [.1 .1 0.5]);
set(handles.axes1,'Color',[235/255 255/255 235/255])
set(handles.axes1,'XGrid','on','YGrid','on')
t=title('Time Domain Signal','Color',[.05 .05 .25],'FontWeight','Bold','FontSize',9);
xlabel('Time (s)','FontSize',8);
ylabel('Voltage (V)','FontSize',8);
axes(handles.axes2);
handles.hLine2 = plot(zeros(1,handles.samplesPerTrigger/2)');
set(handles.hLine2,'Color', [.1 0.5 .1]);
set(handles.axes2,'Color',[235/255 255/255 235/255])
set(handles.axes2,'XGrid','on','YGrid','on')
t=title('Frequency Domain Signal','Color',[.05 0.25 .05],'FontWeight','Bold','FontSize',9);
xlabel('Frequency (Hz)','FontSize',8);
ylabel('Magnitude (dB)','FontSize',8);
axes(handles.axes3);
set(handles.axes3,'View',[103 10]);
set(handles.axes3,'Color',[234/255 234/255 255/255]);
grid(handles.axes3,'on');
h = get(handles.axes3,'title');
set(h,'string','Waterfall Plot','FontWeight','Bold','Color',[.25 .05 .05],'FontSize',9);
h = get(handles.axes3,'ylabel');
set(h,'string','Frequency (Hz)','FontSize',8);
h = get(handles.axes3,'zlabel');
set(h,'string','Magnitude (dB)','FontSize',8);
set(hObject,'RendererMode','Manual') % If you don't do this, the surface plot
set(hObject,'Renderer','OpenGL') % will draw VERY slowly.
set(handles.tSource,'String',sprintf('%s:%d',handles.adaptor,handles.id));
set(handles.tChannel,'String',num2str(handles.chan));
set(handles.poSampleRate,'String',[{'44100'},{'22000'},{'8000'}]);
set(handles.poPlotType,'String',[{'CycleAll'},{'Classic'},{'Classic(Top)'},{'Mosaic'},{'Waterfall'},{'Rotate'}]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ---- S E T U P T H E F I G U R E ----
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ++++ D R A W T H E L O G O ++++
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
L = 40*membrane(1,25);
axes(handles.axes4);
set(handles.axes4,...
'CameraPosition', [-193.4013 -265.1546 220.4819],...
'XLim',[1 51], ...
'YLim',[1 51], ...
'Visible','off', ...
'ZLim',[-13 40]);
s = surface(L, ...
'EdgeColor','none', ...
'FaceColor',[0.9 0.2 0.2], ...
'FaceLighting','phong', ...
'AmbientStrength',0.3, ...
'DiffuseStrength',0.6, ...
'Clipping','off',...
'BackFaceLighting','lit', ...
'SpecularStrength',1.1, ...
'SpecularColorReflectance',1, ...
'SpecularExponent',7);
l1 = light('Position',[40 100 20], ...
'Style','local', ...
'Color',[0 0.8 0.8]);
l2 = light('Position',[.5 -1 .4], ...
'Color',[0.8 0.8 0]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ---- D R A W T H E L O G O ----
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ai=localSetupAI(handles);
handles.ai = ai;
% Update handles structure
guidata(hObject, handles);
localStartAI(ai);
% UIWAIT makes daqwaterfall wait for user response (see UIRESUME)
% uiwait(handles.figure1);
function localStartAI(ai)
%%%%%%%%%%%%%%%%%%%%%%%%%%
% ++++ S T A R T A I ++++
%%%%%%%%%%%%%%%%%%%%%%%%%%
start(ai);
trigger(ai);
%%%%%%%%%%%%%%%%%%%%%%%%%%
% ---- S T A R T A I ----
%%%%%%%%%%%%%%%%%%%%%%%%%%
function localStopAI(ai)
%%%%%%%%%%%%%%%%%%%%%%%%
% ++++ S T O P A I ++++
%%%%%%%%%%%%%%%%%%%%%%%%
stop(ai);
delete(ai);
%%%%%%%%%%%%%%%%%%%%%%%%
% ---- S T O P A I ----
%%%%%%%%%%%%%%%%%%%%%%%%
function ai=localSetupAI(handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ++++ S E T U P T H E A N A L O G I N P U T ++++
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Object Configuration.
% Create an analog input object with one channel.
ai = analoginput(handles.adaptor, handles.id);
addchannel(ai, handles.chan);
% Configure the callback to update the display.
set(ai, 'TimerFcn', @localfftShowData);
% Configure the analog input object.
set(ai, 'SampleRate', handles.sampleRate);
% Configure the analog input object to trigger manually twice.
% We do this because we are using peekdata to acquire the data in
% a timer callback function.
% The first trigger will fill the buffer with handles.samplesPerTrigger
% number of samples. We'll know we have enough samples to start
% processing data when the analog input object's SamplesAvailable property
% is equal to handles.samplesPerTrigger.
% The analog input object will then wait for
% another manual trigger, and while it is waiting the object will still be
% in its running state, which means the timer event will run. To keep the
% object in the running state, we need only never manually trigger this
% second trigger.
% Had we set the TriggerRepeat to 0, the analog input object would stop
% after the first trigger and the timer functions would stop running.
%
set(ai, 'SamplesPerTrigger', handles.samplesPerTrigger);
set(ai, 'TriggerRepeat', 1);
set(ai, 'TriggerType', 'manual');
% Initialize callback parameters. The TimerAction is initialized
% after figure has been created.
set(ai, 'TimerPeriod', 0.01);
set(ai, 'BufferingConfig',[handles.samplesPerTrigger*2,20]);
% Initialize time and frequency plots with lines of y=0
d=zeros(1,handles.samplesPerTrigger);
time = 1:handles.samplesPerTrigger;
f=1:handles.samplesPerTrigger/2;
mag=zeros(1,handles.samplesPerTrigger/2);
% Store state information in the analog input objects UserData area.
data.storedFFTsIndex = 1;
data.plotSurf = 0;
data.ai = ai;
data.getdata = [d time];
data.daqfft = [f mag];
data.handle = [];
data.figureHandles = handles;
data.view = [103 10];
data.rotateStep = 4;
data.counter = 0;
% Set the object's UserData to data.
set(data.ai, 'UserData', data);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ---- S E T U P T H E A N A L O G I N P U T ----
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --- Outputs from this function are returned to the command line.
function varargout = daqwaterfall_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 structure
varargout{1} = handles.output;
% --- Executes on button press in pbExit or when you press
% the figure close 'X' button (I set this function to
% the figures CloseRequestFcn in GUIDE).function pbExit_Callback(hObject, eventdata, handles)% hObject handle to pbExit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)
localStopAI(handles.ai);
closereq;
% --- Executes during object creation, after setting all properties.function poSampleRate_CreateFcn(hObject, eventdata, handles)% hObject handle to poSampleRate (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -