我目前正在研究MATLAB中的绘图程序,它接受输入并使用此输入将点映射到x-y空间。但是,程序还应输出连续音,其频率根据点的位置而变化。
我能够完成音调生成,但由于程序的性质,无法让语音连续工作。 (代码介于音色生成之间)我想我可以使用parfor循环来解决这个问题,代码可以在循环的一次迭代中改变频率,而代码在另一个循环中生成音调,但由于以下内容似乎无法得到它错误:
警告:临时变量频率将被清除 parfor循环的每次迭代的开始。分配给的任何值 它在循环之前就会丢失。如果频率在使用之前 在parfor循环中分配,将发生运行时错误。见并行 对于MATLAB中的循环,“临时变量”。
在multiThreadingtest at 5 Error使用multiThreadingtest(第5行)引用已清除的可变频率。
引起: 引用已清除的变量 频率。
我的代码:
global frequency
frequency = 100;
parfor ii=1:2
if ii==1
Fs = 1000;
nSeconds = 5;
y = 100*sin(linspace(0, nSeconds*frequency*2*pi, round(nSeconds*Fs)));
sound(y, Fs);
elseif ii==2
frequency = 100
pause(2);
frequency = 200
pause(2);
frequency = 300
pause(2);
end
end
答案 0 :(得分:2)
解决方案可能不是来自多线程,而是来自使用另一个函数来输出音调(音频播放器,播放,停止)。 'audioplayer / play'能够输出在时间上重叠的声音。所以基本上,伪代码将是:
get the value of the input
generate/play a corresponding 5 second tone
detect if any change in the input
if no change & elapsed time close to 5 seconds
generate/play an identical 5 second tone
if change
generate a new 5 second tone
%no overlapping
stop old
play new
%overlapping (few milliseconds)
play new
stop old
显示“声音”/“播放”差异的matlab代码。
Fs = 1000;
nSeconds = 5;
frequency = 100;
y1 = 100*sin(linspace(0, nSeconds*frequency*2*pi, round(nSeconds*Fs)));
aud1 = audioplayer(y1, Fs);
frequency = 200;
y2 = 100*sin(linspace(0, nSeconds*frequency*2*pi, round(nSeconds*Fs)));
aud2 = audioplayer(y2, Fs);
% overlapping sound impossible
sound(y1, Fs);
pause(1)
sound(y2, Fs);
% overlapping sound possible
play(aud1);
pause(1);
disp('can compute here');
play(aud2);
pause(1);
stop(aud1);
pause(1);
stop(aud2);