ディジタル信号処理による信号発生とエイリアス(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 結果の数値については、次回以降に示します。