1

重複の可能性:
MATLAB で audiorecorder オブジェクトに関数コールバック ('StopFcn' 、 'TimerFcn' ) を使用するにはどうすればよいですか?

だから私はこのコードを試します。

% assume fs,winsize,winshift is given.

T = 0.1; % in seconds
samples = cell{100,1};
r = audiorecorder(fs,16,1);
k=1;
r.TimerPeriod = 0.1;
r.StopFcn = 'samples{k} = getaudiodata(r);';
r.TimerFcn = {@get_pitch,samples{k},winsize,winshift};

while 1
     record(r,T);
     k=k+1;
end      

audiorecorder オブジェクトを介して録音中に関数 'get_pitch(samples,fs,winsize,winshift)' を実行したいと考えています。

ただし、実行中に次の例外が発生します。

1) record(r,T) が実行された後。(StopFcn が呼び出されるようになりました) ??? ==> eval の使用エラー 未定義の関数または変数 'r'。

2) StopFcn が呼び出された後 (TimerFcn が呼び出されるようになりました) このフェーズでは、get_pitch 関数のパラメーターが完全に間違っています。たとえば、位置 samples{k} のパラメーターは「audiorecorder オブジェクト」に変更されます。

「StopFcn」と「TimerFcn」の正確な使い方がわからないようです。

アドバイスをくれる人はいますか?皆さんのコメントに本当に感謝しています。

4

1 に答える 1

1

ドキュメントの例を見ると、CallBackではなくループでgetaudiodata(r)を呼び出すことをお勧めします。だからこのようなもの:

% assume fs,winsize,winshift is given.

T = 0.1; % in seconds
samples = cell{100,1};
r = audiorecorder(fs,16,1);
k=1;
r.TimerPeriod = 0.1;
r.StopFcn = 'disp(''Completed sample '', k)';
r.TimerFcn = {@get_pitch,samples{k - 1},winsize,winshift};

while 1
     record(r,T);
     samples{k} =  getaudiodata(r);
     k=k+1;
end   

の代わりにr.TimerFcnを使用するように変更したことに注意してください。これは、timerfcnが呼び出される前にkがインクリメントするためです。したがって、これにより最初のサンプルで問題が発生する可能性があります。少し調整する必要があります。また、これは無限ループであり、対処する必要があると確信しています。samples{k - 1}k

于 2012-05-10T10:52:01.657 に答える