1

可能重复:
如何在 MATLAB 中对录音机对象使用函数回调('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      

我想在通过录音机对象录制期间执行函数'get_pitch(samples,fs,winsize,winshift)'。

但是在执行过程中会发生以下异常。

1) 在record(r,T) 执行之后。(现在称为 StopFcn)???使用 ==> eval 未定义函数或变量 'r' 时出错。

2) StopFcn 调用后(现在调用TimerFcn) 在这个阶段,get_pitch 函数的参数完全错误。例如,位置 samples{k} 中的参数更改为“audiorecorder object”。

看来我不知道“StopFcn”和“TimerFcn”的确切用法。

有没有人可以给我一些建议?我非常感谢您的所有评论。

4

1 回答 1

1

查看文档中的示例,我建议您尝试在循环中调用 getaudiodata(r) 而不是使用 CallBack。所以是这样的:

% 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使用samples{k - 1}而不是k因为 k 将在 timerfcn 被调用之前增加。所以这可能会给你的第一个样本带来问题,你必须稍微调整一下。这也是一个无限循环,我相信你会想要解决这个问题。

于 2012-05-10T10:52:01.657 回答