#初めに
現在フーリエ変換をするソフトを作ろうとしています。
きちんとフーリエ変換ができているか確認するために、今回は基本となる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をインポートしました。
これを使って出力する際にバイナリーに変換する必要があるみたいです。
参考サイトをもとにバイナリ化することで無事出力することができました。
#参考サイト