Python | sin波のwavファイル作成方法

Python

Pythonでsin波のwavファイルを作成する方法を説明する。

具体例

サンプリング周波数44.1kHzで440Hzのサイン波のwavファイルを生成するコードを示す。

  1. サイン波のデータを生成する。
  2. 符号無し16bitに変換する。
  3. バイナリに変換する。「*」はiterateの意味。
  4. Wave_writeクラスのインスタンスを生成。
  5. パラメータを設定。引数は(nchannels : チャンネル数(モノラルなら 1 、ステレオなら 2 ), sampwidth : Byte数(2Byteなら2), framerate : サンプリングレート, nframes : オーディオフレーム数, comptype : 圧縮形式( ‘NONE’ だけがサポートされている), compname : 通常 ‘NONE’ に対して ‘not compressed’ が返される)
  6. バイナリデータからwavファイルを生成する。
#!/usr/bin/env python3

import numpy as np
import struct
import wave


freq = 440  # Hz

output_directory     = "/Users/Yoshihiko/Desktop/"
output_file_name     = str(freq)
output_file_path_wav = output_directory + output_file_name + ".wav"

number_of_waves   = int(freq)                 # 周波数によらず約1秒分の波数
period_of_waves   = 1/freq * number_of_waves  # 音の長さ [s]
fs                = 44100                     # サンプリング周波数 [Hz]
Ts                = 1/fs                      # サンプリング周期 [s]
number_of_samples = fs * period_of_waves      # サンプル点数

sin_x = np.arange(0, number_of_samples)
sin_y = np.sin(2 * np.pi * freq * (sin_x * Ts))                          # ? 1
sin_y_INT16 = [int(i * pow(2, 16)/2) for i in sin_y]                     # ? 2
binary = struct.pack("h" * len(sin_y_INT16), * sin_y_INT16)              # ? 3

w = wave.Wave_write(output_file_path_wav)                                # ? 4
w.setparams((1, 2, fs, len(binary), 'NONE', 'not compressed'))           # ? 5
w.writeframes(binary)                                                    # ? 6
w.close()

まとめ

Pythonでsin波のwavファイルを作成する方法を説明

コメント