matlabpsychtoolbox

Generate sawtooth tone in Matlab Psychtoolbox


Below you can see a function which generates pure sinusoidal waveform. I need to modify it to generate sawtooth waveform. Help please! (I'm on Matlab 2014b with 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

Solution

  • The simple way to go would be to replace

    sound = sin(2*pi*frq*time);
    

    with something like

    sound = mod(frq*time,1);
    

    This will create a sawtooth at frequency frq and of amplitude 1 (i.e. between 0 and 1). You can change the amplitude of the waveform (by multiplying it with a scalar) or shift it (by adding a scalar), depending on your needs.

    But this modification won't take into account the rising and falling ramps. The way it is handled in the code you show seems rather strange to me, especially I don't get why one needs to use the cos function, so I don't touch that part of the code.

    Best,