前提・実現したいこと
wavファイルをウェーブレット変換したいと考えています。
発生している問題・エラーメッセージ
byte型ではなく、str型を使うようにエラーが出るのですが、どのように対処していいかわかりません。
TypeError Traceback (most recent call last) <ipython-input-6-dc8dddf3b7ab> in <module> 33 # (1) Freqを指定してcwt 34 freqs=np.arange(0.1,20,0.025) ---> 35 r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 36 rr=np.abs(r) 37 ~/venv/lib/python3.7/site-packages/swan/pycwt.py in cwt_f(signal, freqs, Fs, wavelet, ppd, verbose) 230 scales = wavelet.f0/freqs 231 dt = 1./Fs --> 232 return cwt_a(signal, scales, dt, wavelet, ppd, verbose=verbose) 233 234 write() argument must be str, not bytes
該当のソースコード
python3
1from swan import pycwt 2import numpy as np 3import matplotlib.pyplot as plt 4import wave 5from scipy import fromstring, int16 6from struct import unpack 7import binascii 8 9wavfile = '/Users/yuuki/pianola16bit.wav' 10 11wr = wave.open(wavfile, "rb") 12fr = wr.getframerate() 13fn = wr.getnframes()#オーディオフレーム数(サンプリング数*時間) 14fs = fn / fr 15origin = wr.readframes(fn) #bytesオブジェクトに変換 16data = origin[:fn]#最初からfnまで取得 17wr.close() 18 19y = np.frombuffer(data, dtype="int16") /32768.0 #バイナリをintに変換、正規化 20x = np.arange(y.shape[0]) / fr*2 21 22plt.plot(x, y) 23plt.show() 24 25y = str(binascii.hexlify(y), 'utf-8') 26Fs = 1/0.01 27omega0 = 2 #0.2 #1 #2 #8 28 29# (1) Freqを指定してcwt 30freqs=np.arange(0.1,20,0.025) 31r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 32rr=np.abs(r) 33 34plt.rcParams['figure.figsize'] = (10, 6) 35fig = plt.figure() 36ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) 37ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1) 38ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6]) 39 40ax1.plot(x, y, 'k') 41 42img = ax2.imshow(np.flipud(rr), extent=[0, 3,0.1, 20], aspect='auto') 43twin_ax = ax2 44twin_ax.set_yscale('log') 45twin_ax.set_xlim(0, 3) 46twin_ax.set_ylim(0.1, 20) 47ax2.tick_params(which='both', labelleft=False, left=False) 48twin_ax.tick_params(which='both', labelleft=True, left=True, labelright=False) 49fig.colorbar(img, cax=ax3) 50plt.show()
yがbytes型なので
y = str(binascii.hexlify(y), 'utf-8')
とstr型に変換したところ、新たにエラーが出ます。
ValueError Traceback (most recent call last) <ipython-input-23-ddd435324d4b> in <module> 29 # (1) Freqを指定してcwt 30 freqs=np.arange(0.1,20,0.025) ---> 31 r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 32 rr=np.abs(r) 33 ~/venv/lib/python3.7/site-packages/swan/pycwt.py in cwt_f(signal, freqs, Fs, wavelet, ppd, verbose) 230 scales = wavelet.f0/freqs 231 dt = 1./Fs --> 232 return cwt_a(signal, scales, dt, wavelet, ppd, verbose=verbose) 233 234 ~/venv/lib/python3.7/site-packages/swan/pycwt.py in cwt_a(signal, scales, sampling_scale, wavelet, ppd, verbose) 188 padded_signal[-padlen2:] = padfunc(padded_signal[-padlen2:],signal[-1]) 189 --> 190 padded_signal[padlen1:-padlen2] = signal 191 192 ValueError: could not convert string to float:
ご教授お願いいたします