Создание непрерывного тона в 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);