下面可以看到一个生成纯正弦波形的函数。我需要修改它来产生锯齿形波形。请帮助!(我在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
简单的方法是替换
sound = sin(2*pi*frq*time);
和
sound = mod(frq*time,1);
这将产生频率为frq
,振幅为1 ()的锯齿波。介于0和1之间)。您可以根据需要改变波形的幅度(通过将其与标量相乘)或移动它(通过添加标量)。
但是这种修改不会考虑上升和下降的坡道。在你展示的代码中处理它的方式对我来说似乎相当奇怪,特别是我不明白为什么需要使用cos
函数,所以我不碰那部分代码。
,
谢谢。我的一个同事也研究了一下,他的想法是:
sound = time*frq - floor(time*frq)
这和你的版本听起来难以区分,但是当我将它与在线生成的锯齿波进行比较时,这个Matlab声音听起来不太清楚,它以小但可听到的点击开始和结束。不确定这是驱动程序的问题还是生成的声音本身的问题。