Генерация пилообразного тона в 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 звучит менее четко и начинается и заканчивается небольшим, но слышимым щелчком. Не уверен, что это вопрос драйвера или самого сгенерированного звука.

Другие вопросы по тегам