在MATLAB中创建连续音调,其频率根据用户输入实时变化



我目前正在MATLAB中开发一个图形程序,该程序接受输入并使用该输入将点映射到x-y空间。然而,程序也应该输出连续的音调,其频率根据点的位置而变化。

我能够完成音调生成,但由于程序的性质,无法使音调持续工作。(音调生成之间的代码)我想我可以使用parfor循环来解决这个问题,该循环的代码在循环的一次迭代中改变频率,而在另一次循环中生成音调的代码似乎由于以下错误而无法获得:

警告:临时可变频率将在parfor循环每次迭代的开始。分配给的任何值它之前的循环将丢失。如果频率在如果在parfor循环中指定,则将发生运行时错误。请参见平行对于MATLAB中的循环,"临时变量"。

在5处的multiThreadingtest中使用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

解决方案可能不是来自多线程,而是来自使用另一个函数来输出音调(音频播放器、播放、停止)。'"音频播放器/播放"具有输出在时间上重叠的声音的能力。所以基本上,伪代码是:

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);  

相关内容

最新更新