1

私は現在、入力を受け取り、この入力を使用してポイントを xy 空間にマップする MATLAB のグラフ作成プログラムに取り組んでいます。ただし、プログラムは、ポイントの位置に応じて周波数が変化する連続音も出力する必要があります。

楽音生成はできましたが、プログラムの性質上連続して音を鳴らすことができませんでした。(トーン生成間のコード) ループの 1 回の繰り返しで周波数を変更するコードと、別のループでトーンを生成するコードを含む parfor ループを使用して、これを解決できると考えましたが、次の理由でそれを取得できないようです。エラー:

警告: 一時変数周波数は、parfor ループの各反復の開始時にクリアされます。ループの前に割り当てられた値はすべて失われます。parfor ループで割り当てられる前に周波数が使用されると、実行時エラーが発生します。MATLAB の Parallel for ループ、「一時変数」を参照してください。

in multiThreadingtest at 5 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
4

1 に答える 1

2

解決策は、マルチスレッドではなく、トーンを出力する別の関数 (audioplayer、play、stop) を使用することです。「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  

'sound'/'play' の違いを示す 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);  
于 2013-06-28T10:54:08.807 に答える