前提・実現したいこと
jupyter notebookでwavファイルの離散フーリエ変換を行っています。
第一工程からチャンネル1ですので、モノラルであることはわかりますが、
下記の第二工程は必要でしょうか。
補足情報に記載した参照ページでは、ステレオ前提と書かれておりましたが、実行すると値が出力されました。
また、なぜ『left』と『right』は2番目おきに要素を得なければならないのでしょうか。
ご教授願います。
該当のソースコード
**第一工程** import wave import struct from scipy import fromstring, int32 import numpy as np from pylab import * %matplotlib inline wavfile = '440Hz.wav' #サンプルwavファイル wr = wave.open(wavfile, "rb") ch = wr.getnchannels() # モノラルなら1,ステレオなら2 width = wr.getsampwidth() # バイト数 (1byte=8bit) fr = wr.getframerate() #サンプリンググレート(サンプリング周波数) fn = wr.getnframes() # 総フレーム数(データ分割数)⇒サンプリング周波数で割れば時間 #wavfileから(N*span)のデータを先頭から切り出す #連続的なデータを離散的に表すためには、データの成分は"fr"の1/2未満(ナイキスト周波数)でなければならない。 N = 22050 #サンプリングレート"fr"の半分の値 span = 4 #4で固定 #周波数分解能:分解できる周波数の細かさ print('チャンネル', ch) print('バイト数', width) print('サンプリンググレート', fr) print('総フレーム数', fn) print('サンプル時間', 1.0 * N * span / fr, '秒') origin = wr.readframes(wr.getnframes()) #メソッドreadframes(n)でnフレーム分のデータを読み込む、ここでは総フレーム数分の読み込み data = origin[:N * span * ch * width] #"origin"から要素の範囲[ ]を指定 wr.close() print('現配列長', len(origin)) #"origin"の要素数 print('サンプル配列長: ', len(data)) #"data"の要素数
**第二工程** # ステレオ前提 X = np.frombuffer(data, dtype="int16") #"data"をバイナリ表記から16bitsの整数数列に変換 left = X[::2] #"0から2番目おき"に要素を得る right = X[1::2] #"1から2番目おき"に要素を得る print(X) print(left) print(right)
試したこと
実行した結果、下記の情報を入手しました。
チャンネル 1
バイト数 2
サンプリンググレート 44100
総フレーム数 441000
サンプル時間 2.0 秒
現配列長 882000
サンプル配列長: 176400
X:[ 0 2052 4097 ... -6126 -4097 -2052]
left:[ 0 4097 8130 ... -12036 -8130 -4097]
right:[ 2052 6126 10103 ... -10103 -6126 -2052]
補足情報(FW/ツールのバージョンなど)
windows10 python3.7.4
参照ページ:https://qiita.com/niisan-tokyo/items/764acfeec77d8092eb73
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/03 05:34