タイマーコールバック内でプロット先指定をするためにはどうすればよいですか?
显示 更早的评论
マイクから取得した音源を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 个评论
Aoi Midori
2018-11-21
编辑:mizuki
2018-11-25
こんにちは。自分のPCでも上記試してみましたが、うまく再現してくれませんでした。。とはいえ、上記のコピーだけでは動いてくれなかったので、y_tmp = ...の前に下記の3行を追加して、最後のendを消しています。
handles.fs = 8000; % 暫定的に設定
handles.recObj = audiorecorder(handles.fs, 24, 1); % オーディオ録音用オブジェクトの作成
recordblocking(handles.recObj, 1); % オーディオを録音
ベースのソースコードは「GUIDEアプリでのプロットの自動更新」にある例ex_guide_timergui.m(下記からも開けます)で、ex_guide_timergui_OpeningFcn()とupdate_display()のみを変更しました。
setupExample('matlab/GuideAutoRefreshPlotExample');
addpath(fullfile(exampleUtils.getExamplesDir(),getfield(findExample('matlab/GuideAutoRefreshPlotExample'),'component'),getfield(findExample('matlab/GuideAutoRefreshPlotExample'),'main')));
guide('ex_guide_timergui.fig');
※Time Periodは初期値を1のまま動かさず、上のソースの通り、録音も1秒にしています。
Yoshiharu Soetaさんは、マイクからの音源取得はどこで行っていらっしゃるでしょうか?guidata()内でfigureを作成しているようなので、handlesで受け渡しなどされているなら、その辺りでひっかかってしまっているのかな~と。。問題の起こる.mファイル、添付頂くこと可能でしょうか?
Yoshiharu Soeta
2018-11-22
Aoi Midori
2018-11-26
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
Yoshiharu Soeta
2018-12-4
采纳的回答
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 アプリの作成 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!