Создание непрерывного тона в MATLAB, частота которого изменяется в режиме реального времени в зависимости от ввода пользователя

В настоящее время я работаю над графической программой в MATLAB, которая принимает входные данные и отображает точку в xy-пространстве, используя этот вход. Однако программа также должна выводить непрерывный тон, частота которого изменяется в зависимости от местоположения точки.

Я смог выполнить генерацию тона, но не смог заставить работать тональный сигнал непрерывно из-за характера программы. (Код между поколениями тонов) Я думал, что смогу решить эту проблему с помощью цикла parfor с кодом, который изменяет частоту в одной итерации цикла, и кодом, который генерирует тон в другой, но не может получить его из-за следующего ошибка:

Предупреждение: временная переменная частота будет очищаться в начале каждой итерации цикла parfor. Любое значение, присвоенное ему до цикла, будет потеряно. Если частота используется до того, как она будет назначена в цикле parfor, произойдет ошибка времени выполнения. Смотрите параллельные циклы в MATLAB, "Временные переменные".

В multiThreadingtest при 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

1 ответ

Решение может быть не в многопоточности, а в использовании другой функции для вывода тонального сигнала (аудиоплеер, воспроизведение, остановка). "Аудиоплеер / игра" имеет возможность выводить звуки, которые перекрываются во времени. В общем, псевдокод будет:

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);  
Другие вопросы по тегам