我正在使用指南在matlab中进行简单的GUI,其中我有一些滑块来选择频率或许多然后通过扬声器绘制和播放的频率。我现在正在学习实时声音,所以我认为把它整合到应用程序中是很好的。我现在有一个按钮,当我按下它时会播放正弦波10秒,但我想要一个复选框,在选中时禁用按钮并立即开始连续播放声音,直到再次取消选中复选键。
我无法真正了解如何在Matlab中实现这一点,因为我听说Matlab本质上是单线程的。如何使用GUI和所有内容做到这一点,因为我怀疑GUI创建是你认为你做得对的东西,但你错过了某种细节,它只适用于某些情况。
我认为简单的方法是选中复选框,将Play按钮的“Enable”属性设置为false,然后启动一个无限循环,从我创建的实时系统对象中播放它。但是,当我取消选中该复选框时,它应该将标志或某些内容设置为false并再次启用“播放”按钮。如果这是正确的方法,有人能指出我吗?如何使应用程序在同时处于无限循环中处理和播放声音的同时收听复选框上的单击?同时循环应该对确定频率的滑块的变化敏感,并且这些频率也存储在handle变量中。
样机代码:
function playbutton_Callback(hObject, eventdata, handles)
freqs = [handles.freq1, handles.freq2, handles.freq3]
hightensecy = sinewave(handles.hightensecx, freqs); %creates a sinewave consisting of the three frequencies. hightensecx is a time vector of ten seconds with a high sample rate.
sound(hightensecy, handles.highsr);
figure;
plot(handles.hightensecx,hightensecy);
function y = sinewave(x, freqs)
% x in sec
y(:,1:size(freqs,2)) = sin(2*pi*x*freqs);
y=sum(y,2)/size(freqs,2);
end
% --- Other code to make the sliders store their values in handles.freq1, handles.freq2... ---
function continuousbox_Callback(hObject, eventdata, handles)
selected = get(hObject,'Value');
if(selected)
set(handles.playbutton, 'Enable', 'off');
startsound(handles);
else
set(handles.playbutton, 'Enable', 'on');
stopsound();
end
% Plays sound continuously
function startsound(handles)
%%Initialization
SamplesPerFrame = 1024;
Fs = handles.highsr;
Player = dsp.AudioPlayer('SampleRate', Fs);
%%Stream
tic
while(1)
%TODO Read in a new 1024 bytes chunk and make sure it has the same
%characteristics as sinewave(x, freqs)
step(Player, outsound)
end
%Stops the continuously played sound
function stopsound()
%TODO Somehow stop the loop inside startsound(handles)
如果可能的话,如果产生的startound函数播放的声音听起来与playbutton回调完全一样,那将是无限的。我也不确定如何处理实时循环中可能出现的阶段问题。我应该使用时间计数器来计算并计算当前1024块的y值,在这种情况下,我应该使用距离tic的时间距离,还是每次增加1024 /采样率秒?提前谢谢。