ディジタル信号処理による信号発生とエイリアス(10)

Python で書いた「gen_saw2.py」と同等のプログラムを Scilab を使って書いてみました。
当初の記事では Scilab 専用でしたが、GNU Octave 3.0.0 でも実行できるように、一部修正しました。

// gen_saw2.sce - Saw wave gen by Scilab
// 
// globals
//
global nperi harm maxlevel;
pi = 4.0 * atan(1.0); // constant pi
nharm = 5;   // number of harmonics
ncyc = 1024; // cycles per block
nrep = 48;   // block repeat count
fs = 48000;  // sampling frequency
fre = 1023.0 / ncyc; // normalized freq
nperi = 11;  // waveform period 
harm = (1 : nharm); // harmonics vector
maxlevel = (6.0 / 8.0); // = 0x6000/0x8000
rep = ones(1, nrep); // repeat vector
x = (0 : ncyc-1); // sampling point vector
x = fre * x; // multiply by nomalized freq
// sampled ideal saw wave
function r=saw2(x)
  global nperi maxlevel;
  y = ((x) ./ nperi);
  y = y - floor(y);
  r = 2.0 * maxlevel * (y - 0.5);
endfunction
//
// Band limited saw by Fourier series
function r=saw3(x)
  global nperi harm maxlevel;
  y = ((x) ./ nperi);
  y = y - floor(y);
  y = ((harm.') * y);
  s = ((1.0) ./ harm) * sin(2.0 * pi * y);
  r = (-2.0 * maxlevel / pi) * s;
endfunction
//
// main
// Lch = sampled ideal sawtooth wave
// Rch = band limited saw wave by Fourier series
lr = [saw2(x); saw3(x)];
wavwrite(kron(rep, lr), fs, "saw2s.wav");

行列の転置の「.'」 (ピリオド、シングルクオート)、要素ごとの除算の「./」 (ピリオド、スラッシュ) などの演算子に注意してください。
処理系は Windows 版の Scilab 4.1.1 を使いました。
コメントの「//」 (スラッシュ、スラッシュ) を「#」 (ポンド記号) に置換し、最後の行の wavwrite() 関数を

wavwrite((kron(rep, lr).'), fs, "saw2s.wav");

と変更すれば、 GNU Octave 3.0.0 でも実行できます。
GNU Octave 2.x では、最後の行の wavwrite() 関数の引数の順番を次のように変更する必要があります。

wavwrite("saw2s.wav", (kron(rep, lr).'), fs);