波動と機械学習

人間の声を色相の変化を利用して3次元プロットした図に美しさを感じて、そのまま音声解析の道を進んでいます。自分なりに調べて実装できたものから更新していきます。アドバイス、アイデアなどあれば是非お願いします。

色々な波形を作ってみる(矩形波、三角波、鋸波)

このブログの記事は以下のサイトに移転しました。
より詳細な記事やプログラムの実装方法などは移設先のHPを参照ください。
teckonestep.com



この記事では様々な形の周期波形を作成してみます。
作成した波形はそれぞれ特徴的な音色をしており、その違いが楽しめると思います。
※音声を再生する際は音量に注意してください。

事前準備

作成した波形データを可視化、保存するためのメソッドを定義します。

基本パラメータ

#振幅
A1=1

#基本周波数
f1 =330

#サンプリング周波数
fs = 44100

#時間(秒)
sec = 5 
#サンプリングした時の時間軸
t = np.arange(0.0, sec, 1 / fs)

グラフ化

def plot_wav(wave_data,t):
    
    scale=0.01#描画範囲の設定(s)
    fs = 44100#サンプリング周波数
    
    q=int(scale*fs)
    plt.plot(t[0:q], wave_data[0:q])
    plt.show()

ファイル保存

def create_wave(file_name,wave_data,fs):
    #16bit符号付き整数に変換
    wave_data = [int(x * 32767.0) for x in wave_data]

    #バイナリ化
    binwave = struct.pack("h" * len(wave_data), *wave_data)

    #wavファイルとして書き出し
    wf = wave.Wave_write(filename)
    wf.setparams((
        1,                          # channel
        2,                          # byte width
        fs,                         # sampling rate
        len(data),                  # number of frames
        "NONE", "not compressed"    # no compression
        ))
    wf.writeframes(binwave)
    wf.close()

正弦波

波形と言えばこの形です。耳触りの良い綺麗な音色をしています。
プログラムで表現するのも容易で、Pythonではたった数行でデータ配列を生成することができます。

#正弦波
def sin_wave(A,f0,t):
    #振幅A,基本周波数f0,録音時間t
    sinwav = A * np.sin(np.pi * f0 * t)
    plot_wav(sinwav,t)
    return sinwav

#サイン波の描画 サンプル
sinwav=sin_wave(A1,f1,t)
create_wave('sinwav_test',sinwav, fs)

矩形波

矩形波は電気的に発生するのが容易であるため、ゲームの音楽でもよく使用されてきました。ファミコンのピコピコ音はこの矩形波が使われているからです。

#矩形波
def square_wave(A,f0,t):
    squarewav=np.array([0.0 for i in range(len(t))])
    for i in range(len(t)):
        if np.sin(np.pi*f0*t[i])>0:
            squarewav[i]=1*A
        elif np.sin(np.pi*f0*t[i])==0:
            squarewav[i]=0*A
        elif np.sin(np.pi*f0*t[i])<0:
            squarewav[i]=-1*A
    plot_wav(squarewav,t)
    return squarewav

#矩形波の描画 サンプル
squarewav=square_wave(A1,f1,t)
create_wave('squarewav_test',squarewav, fs)

三角波

矩形波同様、ファミコン風の音声になります。

#三角波
def triangle_wave(A,f0,t,fs):
    trianglewave = np.array([0.0 for i in range(len(t))])
    filtersize = fs//f0//2
    trianglefilter = np.arange(0,filtersize)
    trianglefilter = trianglefilter[:]/(filtersize-1)
    for i in range(len(t)//filtersize):
        for j in range(filtersize):
            index_num = i*filtersize + j
            if i%2==0:
                trianglewave[index_num] = trianglefilter[j]
            else:
                trianglewave[index_num] = trianglefilter[j*(-1)-1]
    trianglewave[:] -= 0.5
    trianglewave[:] *= 2
    plot_wav(trianglewave,t)
    return trianglewave

#三角波の描画 サンプル
trianglewave=triangle_wave(A1,f1,t,fs)
create_wave('triangle_wave',trianglewave, fs)

鋸波

パソコンのビープ音のような音色です。

#のこぎり波
def sawtooth_wave(A,f0,t,fs):
    sawtoothwave=np.arange(0,len(t))
    for i in range(len(t)):
        sawtoothwave[i]=i%((fs//f0)-1)
    sawtoothwave = sawtoothwave[:]/((fs//f0)-1)-0.5
    sawtoothwave = sawtoothwave[:]*2
    plot_wav(sawtoothwave,t)
    return sawtoothwave

#のこぎり波の描画 サンプル
sawtoothwave=sawtooth_wave(A1,f1,t,fs)
create_wave('sawtooth_wave',sawtoothwave, fs)