ディジタル信号処理による信号発生とエイリアス(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);