現在wavファイルを読み込みスペクトログラムに変換するプログラムを書いています。
scipyでプログラムがあるのですが、機械学習を行うためtorchaudioでの実装を試しています。nfftやwindowsizeなど可能な限りパラメータをそろえたのですがスペクトログラムが同じようになりません。返される値のサイズが違うのではと思いD=D/1000を入れてみたところスペクトログラムは同じようにすることができたのですが、なぜ1/1000で同じようになったのかという理屈が分かりません。また、表示の部分でscipyだとstftのときにDの他にもt,fが返されますが、torchaudioだとDのみが返されるため縦軸、横軸の表示がうまくいきません。
tに関してはDの時間軸の配列に1/Fsをかければいいというのは分かるのですが、縦軸の周波数成分の配列を用意する方法が分かりません。
わかりにくくなってしまったのですが、
・なぜD/1000にするとうまくいくのか
・scipyでのfという周波数の配列をtorchaudioもしくはpytorchで作れるのか
以上の2点について教えていただきたいです。
よろしくお願いします。
Python3
1##use scipy.signal 2# read the wav file 3ls_org, Fs = sf.read(infilename) 4amp = 0.003 5nt = min(2**17, 2**(nextpow2(ls_org.size)-1)) 6 7ls_org = ls_org[:nt] 8ls_org = ls_org / max(ls_org) *0.4 9t = np.arange(len(ls_org.T))/Fs 10print("Shape of waveform: {}".format(ls_org.shape)) 11print("Sample rate of waveform: {}".format(Fs)) 12 13#compute spectrogram 14windowsize = 2048 15offset = np.floor(windowsize / 4) 16 17#compute complex spectrogram 18f, t, D = signal.stft(ls_org, fs = Fs, nperseg = windowsize , noverlap = windowsize - offset) 19(m, n) = D.shape 20 21#Plot signal and spectrogram 22fig = pl.figure(1) 23pl.plot(ls_org) 24pl.xlim([0, len(ls_org)]) 25pl.title("Input signal", fontsize = 20) 26fig = pl.figure(2) 27pl.pcolormesh(t, f, np.abs(D), cmap='jet', vmin=0, vmax=0.001) 28pl.title('STFT Magnitude') 29pl.ylabel('Frequency [Hz]') 30pl.xlabel('Time [sec]') 31 32##use torchaudio 33#waveread 34waveform, Fs = torchaudio.load(infilename) 35 36nt = min(2**17, 2**(nextpow2(len(waveform.T))-1)) 37waveform = waveform[:, :nt] 38waveform = waveform / max(waveform.T) * 0.4 39print("Shape of waveform: {}".format(waveform.size())) 40print("Sample rate of waveform: {}".format(Fs)) 41t = np.arange(len(waveform.T))/Fs 42#transform spectrogram 43nfft = 2048 44windowsize = nfft 45offset = windowsize // 4 46print(offset) 47D = torchaudio.transforms.Spectrogram(nfft, windowsize, offset, power=None)(waveform) 48D = D / 1000 49print("Shape of spectrogram: {}".format(D.size())) 50X = torch.view_as_complex(D).clone().detach() #コピー 51X = X[0,:,:].numpy() 52time = np.arange(257) 53 54#plot 55fig = plt.figure(1) 56plt.xlabel("time [s]") 57plt.ylabel("amplitude") 58plt.xlim(0,len(waveform.T)/Fs) 59plt.plot(t, waveform.t().numpy()) 60plt.show() 61fig = plt.figure(2) 62plt.pcolormesh(time, f, np.abs(X), cmap='jet', vmin=0, vmax=0.001) 63plt.xlabel("time [s]") 64plt.ylabel("frequency [Hz]")
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/05 05:47