24
21

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 5 years have passed since last update.

[python] sin波の音をWAV形式で出力する

Last updated at Posted at 2017-10-19

#初めに
現在フーリエ変換をするソフトを作ろうとしています。
きちんとフーリエ変換ができているか確認するために、今回は基本となるsin波の音を作成しました。
python、音響の知識はあまりないので、いろいろアドバイスをいただけると幸いです。

#コード

test.py
import numpy as np
from matplotlib import pyplot as plt
import librosa
import wave
import struct

#パラメータ
#--------------------------------------------------------------------------------------------------------------------
A=1#振幅
fs = 44100#サンプリング周波数
f0 = 440#基本周波数(今回はラ)
sec = 10 #秒

#sin波
#--------------------------------------------------------------------------------------------------------------------
def create_wave(A,f0,fs,t):#A:振幅,f0:基本周波数,fs:サンプリング周波数,再生時間[s]
    #nポイント
    #--------------------------------------------------------------------------------------------------------------------
    point = np.arange(0,fs*t)
    sin_wave =A* np.sin(2*np.pi*f0*point/fs)

    sin_wave = [int(x * 32767.0) for x in sin_wave]#16bit符号付き整数に変換
    
    #バイナリ化
    binwave = struct.pack("h" * len(sin_wave), *sin_wave)

    #サイン波をwavファイルとして書き出し
    w = wave.Wave_write("440Hz.wav")
    p = (1, 2, fs, len(binwave), 'NONE', 'not compressed')#(チャンネル数(1:モノラル,2:ステレオ)、サンプルサイズ(バイト)、サンプリング周波数、フレーム数、圧縮形式(今のところNONEのみ)、圧縮形式を人に判読可能な形にしたもの?通常、 'NONE' に対して 'not compressed' が返されます。)
    w.setparams(p)
    w.writeframes(binwave)
    w.close()
create_wave(A, f0, fs, sec) 

色々試行錯誤していたため、関係のないものもインポートされています。

また、サンプリング周波数は一般的なCDで用いられている44.1 kHz,基本周波数は440 Hz(ラ)となるようにパラメータを設定しました。

#つまづいたところ
##sin波の作成
最初は横軸が時間のsin波(下記の式参照)を作っていたのですが、これがうまくいきませんでした。

\begin{equation}
sin(t)=A sin(2 \pi f_0 t)
\end{equation}

調べたら
横軸はサンプリング周波数と音の再生時間で表されるn(ポイント数?)にしなければいけなかったみたいでした。(下記の式を参照)

\begin{equation}
n=t \times f_s (t:再生時間、f_s:サンプリング周波数)
\end{equation}

上記に示したnを用いてsinの式を書き換えると次のようになります。

\begin{equation}
sin(n)=A sin( \frac{2 \pi f_0 n}{f_s})
\end{equation}

##waveの使い方。
wavファイルとして出力するために今回はwaveをインポートしました。
これを使って出力する際にバイナリーに変換する必要があるみたいです。
参考サイトをもとにバイナリ化することで無事出力することができました。
#参考サイト

Pythonでサイン波(正弦波)をつくる

python公式ドキュメント(WAVファイルの読み書き)

24
21
1

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
24
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?