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

ランプ波形のサンプリングによる方法の wave ファイルを作成する Python プログラム (gen_saw3.py) を下に示します。

# gen_saw3.py - Sawtooth wave generation
import wave, struct, math;
from math import *;
nperi = 11
nperi_1 = (nperi - 1)
fs = 48000 # sampling rate = 48 kHz
maxlevel = 0x6000
nrep = 48
ncyc = 1024 
freq = 1023.0 / ncyc
nharm = (nperi-1) / 2
#
def waveinit():
    """Initialize wave header."""
    ww.setnchannels(2) # stereo
    ww.setsampwidth(2) # 16 bit
    ww.setframerate(fs) 
#
def saw3(x):
    """Band limited saw by Fourier series."""
    s = 0.0
    for i in range(1, nharm+1):
        s = s + sin(i * 2.0 * pi * x)/i
    return -maxlevel * 2.0 * s / pi
#
def saw6(x):
    """Sampled ramp wave."""
    s = 0.0
    if (nperi_1 > abs(nperi * x)) :
        s = (2.0*nperi/nperi_1)*(x-nperi_1/(2.0*nperi)) 
    else :
        s = -2.0*nperi*(x-(2.0*nperi-1)/(2.0*nperi))
    return maxlevel * s
#
def waveout(func1, func2):
    """Wave data output."""
    waveinit()
    for i in range(nrep): 
        x = 0.5
        for j in range(ncyc):
            l = func1(x/nperi)
            r = func2(x/nperi)
            lr = struct.pack("hh", l, r)
            ww.writeframesraw(lr)
            x = x + freq
            if (x > nperi) : x = x - nperi;
    ww.close()
# Lch = sampled ramp wave
# Rch = band limited saw wave by Fourier series
ww = wave.open("saw6.wav", "wb")
waveout(saw6, saw3)

このプログラムを実行すると、左チャンネルに、ランプ波形のサンプリングによる波形、右チャンネルに、いつものフーリエ級数による波形をおさめた「saw6.wav」ファイルが作成されます。
波形編集ソフトの FFT 機能による表示を下に示します。

理想インパルスのサンプリングによる方法と違って、エイリアスによる低周波成分は存在していませんし、本来の周波数成分の周辺のスプリアス成分も小さくなっています。
オシロスコープで観測した波形や、FFT 結果の数値については、次回以降に示します。