FFT
WAVEデータをFFTする方法(テスト中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#coding:utf-8 import wave import numpy as np import matplotlib.pyplot as plt import pandas as pd def wave_plot(filename): # open wave file wf = wave.open(filename,'r') channels = wf.getnchannels() # print(wf.getparams()) # load wave data params = wf.getparams() chunk_size =params.nframes # サンプル数 x 秒数 amp = (2**8) ** wf.getsampwidth() / 2 data = wf.readframes(chunk_size) # バイナリ読み込み data = np.frombuffer(data,'int16') # intに変換 data = data / amp # 振幅正規化(-1~1) # make time axis rate = wf.getframerate() size = float(chunk_size) x = np.arange(0, size/rate, 1.0/rate) # plot マルチチャンネルに対応 for i in range(channels): plt.plot(x,data[i::channels]) plt.title(filename) plt.xlabel("time[s]") plt.ylabel("standerdized amplitude") plt.ylim([-1,1]) #y軸を-1~1で固定 plt.show() def wave_load(filename): # open wave file wf = wave.open(filename,'r') channels = wf.getnchannels() # load wave data chunk_size = wf.getnframes() amp = (2**8) ** wf.getsampwidth() / 2 data = wf.readframes(chunk_size) # バイナリ読み込み data = np.frombuffer(data,'int16') # intに変換 data = data / amp # 振幅正規化 data = data[::channels] return data def fft_load(count,filename,size): ''' count = グラフに入れたいデータ数 filename = waveファイルの名称 size = FFTのサンプル数(2**n) start =乱数の開始位置 end = 乱数の終点位置 ''' # load wave data wf = wave.open(filename,'r') params = wf.getparams() fs = params.framerate # 1secのサンプリング数 st = 0 # サンプリングする開始位置 hammingWindow = np.hamming(size) # ハミング窓 d = 1.0 / fs #サンプリングレートの逆数 freqList = np.fft.fftfreq(size, d) for i in range(count): # n = random.randint(start,end) wave_data = wave_load(filename) wave_data = hammingWindow * wave_data[st:st+size] # 切り出した波形データ(窓関数あり) #wave_data = wave_data[st:st+size] # 切り出した波形データ(窓関数なし) data = np.fft.fft(wave_data) data = data / max(abs(data)) # 0~1正規化 plt.plot(freqList,abs(data)) outdata = [freqList,abs(data)] plt.axis([0,20000,0,1]) #第二引数でグラフのy軸方向の範囲指定 plt.title(filename) plt.xlabel("Frequency[Hz]") plt.ylabel("amplitude spectrum") plt.show() return outdata filename = "Song.wav" # WAVデータの読み込み wave_plot(filename) outdata = fft_load(1,filename,1024) # データフレームの作成 df = pd.DataFrame(data = outdata).T #print(df) # シート別にデータフレームを書込み df.to_excel('sample_fft.xlsx', sheet_name='sheet1') |
コメント