0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

wavファイルの作成

Last updated at Posted at 2022-10-10

何故か急にwavファイルを作りたくなったので作成してみましたので、その際に覚えた知識をメモとして残します。

ライブラリ

本投稿では下のライブラリを使います。

  • math(正弦波を作成するため)
  • numpy(1次元配列を扱うため)
  • scipy(wavファイルの作成のため)
  • playsound(wavファイルの再生のため)

波形を作る

サンプルとして100Hzの正弦波を作成します。なお、サンプリングレートを44100Hzとするため、441個で1周期となる正弦波を100個(つまり1秒分)作成しています。

import math
data = [ math.sin(2 * math.pi * i / 441) for i in range(44100) ]

データを整数化する

wavファイルにするにはint16にしないといけないので、波形の最大値で割り、int16の正の最大値である32767を掛けてから、int16にしています。

import numpy as np
data2 = np.int16(data / np.abs(data).max() * 32767)

wavファイルとして保存

ファイル名をtest.wav、サンプリングレートを44100として保存します。

from scipy.io.wavfile import write
write('test.wav', 44100, data2)

wavファイルの再生

保存したwavファイルを再生します。

from playsound import playsound
playsound('test.wav')

おまけ

逆に保存したファイルを高速フーリエ変換(FFT)してみました。ファイルの読み込みにはwaveライブラリを使います。上記で作成したwavファイルであれば、下のようなプログラムになります。(モノラル16bitの場合だけです。bit数が違っていたりステレオ等だと、データフォーマットが違うので使えません)

import wave
import numpy as np
f = wave.open('test.wav', 'rb')
data = f.readframes(f.getnframes())
f.close()
data2 = np.frombuffer(data, dtype = 'int16')
data3 = np.fft.fft(data2 / np.abs(data2).max())
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?