Генерация пилообразного тона в Matlab Psychtoolbox
Ниже вы можете увидеть функцию, которая генерирует чистый синусоидальный сигнал. Мне нужно изменить его для генерации пилообразного сигнала. Помогите, пожалуйста! (Я на Matlab 2014b с Psychtoolbox 3.0.12, Win 8.1 x64)
function [tSnd] = mkPureTone(fs, frq, dur)
if nargin < 1; fs = 44100; end
if nargin < 2; frq = 1000; end
if nargin < 3; dur = 0.1; end
rtimeup = 0.006; % duration of the ramp up in seconds
rtimedown = 0.006; % duration of the ramp down in seconds
trup = 0:1/fs:rtimeup-1/fs;
lrup = length(trup);
rampup = (cos(2*pi*trup/rtimeup/2+pi)+1)/2;
trdown = 0:1/fs:rtimedown-1/fs;
lrdown = length(trdown);
rampdown = (cos(2*pi*trdown/rtimedown/2)+1)/2;
% compute target sound
time = 0:1/44100:dur;
sound = sin(2*pi*frq*time);
lt = length(sound);
sound(1:lrup) = sound(1:lrup).*rampup;
sound(lt-lrdown+1:end) = sound(lt-lrdown+1:end).*rampdown;
tSnd = sound;
% wavplay(tSnd, fs);
end
2 ответа
Самый простой способ - заменить
sound = sin(2*pi*frq*time);
с чем-то вроде
sound = mod(frq*time,1);
Это создаст пилообразную частоту на частоте frq
и амплитуды 1 (то есть между 0 и 1). Вы можете изменить амплитуду формы волны (умножив ее на скаляр) или сдвинув ее (добавив скаляр), в зависимости от ваших потребностей.
Но эта модификация не будет учитывать растущие и падающие пандусы. То, как он обрабатывается в показанном вами коде, кажется мне довольно странным, особенно я не понимаю, почему нужно использовать cos
функция, поэтому я не касаюсь этой части кода.
Лучший,
Благодарю. Мой коллега также изучил это, и его идея была:
sound = time*frq - floor(time*frq)
И эта, и ваша версия звучат неразличимо, но когда я сравниваю их с пилообразным wav, сгенерированным онлайн, этот звук Matlab звучит менее четко и начинается и заканчивается небольшим, но слышимым щелчком. Не уверен, что это вопрос драйвера или самого сгенерированного звука.