タイマーコールバック内でプロット先指定をするためにはどうすればよいですか?
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Yoshiharu Soeta
il 21 Nov 2018
Risposto: Aoi Midori
il 4 Dic 2018
マイクから取得した音源をGUIDE上のAxesであるwaveformにリアルタイムにプロットしようとしています.
公式ドキュメンテーション"GUIDEアプリでのプロットの自動更新"を参考に,タイマーのコールバック関数updata_displayを追加し,
getaudiodata関数で取得した値をplot関数に入れました.
しかし,1フレームだけwaveformにプロットされてから,新しいfigureウィンドウが開きそこにリアルタイム描画されます.
全フレームをwaveformにプロットするためにはどうすればよいですか?
OpeningFcn内timerの定義部分
handles.waveform = findobj('Tag','waveform');
% Create a timer object to fire at 1/10 sec intervals
% Specify function handles for its start and run callbacks
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback function
function update_display(hObject, eventdata, handles)
% Timer timer1 callback, called each time timer iterates.
handles = guidata(handles)
y_tmp = getaudiodata(handles.recObj);
tv = (1:length(y_tmp))./handles.fs;
%プロット対象をwaveformに指定
axes(handles.waveform);
plot(tv, y_tmp./max(y_tmp), 'k');
axis([0 length(y_tmp)/handles.fs -1 1])
end
4 Commenti
Aoi Midori
il 26 Nov 2018
Yoshiharu Soetaさん、
.mファイルと.figファイルの添付ありがとうございます。頂いたファイルで確かに再現しました。ただ、RealTime_GUI.mのupdate_display()内でブレークを張って実行すると新しいウィンドウができなかったので、タイミングの問題?と思い、下記の通りpause()を加えると、カクカクながらもご所望の動きに近い形になりました。getaudiodata()に時間がかかるんですかね?対処療法的ですみませんが、一応コード載せておきますね。少しでも手掛かりになると嬉しいです。。
function update_display(hObject, eventdata, handles)
% 略
y_tmp = getaudiodata(handles.recObj);
pause(1) % 新規追加部分
tv = (1:length(y_tmp))./handles.fs;
% 略
end
Risposta accettata
Aoi Midori
il 4 Dic 2018
Yoshiharu Soetaさん、
無事に解決されたようでよかったです。では、回答としてこちらに記載しておきます。
function update_display(hObject, eventdata, handles)
% 略
y_tmp = getaudiodata(handles.recObj);
pause(1) % 新規追加
tv = (1:length(y_tmp))./handles.fs;
% 略
end
0 Commenti
Più risposte (0)
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!