質問: np.fft.fftfreq(N, d=1.0/fs) # 周波数軸の値を計算 plt.title("FFT-wheeze") plt.plot(freqList,abs(X)) plt.axis([0,600,0,max(abs(X))+500]) plt.show() ``` ``` install.packages("tuneR") library(tuneR) # ファイルの読み込み wavobj <- readWave("~~~.wav") x <- wavobj@left # 左チャンネルだけを使う(wavobj@.Dataを使う場合も) fs <- wavobj@samp.rate # 標本化周波数 nbits <- wavobj@bit # 量子化ビット数 x <- x[1:(fs*5)] # 先頭の5秒間だけを分析対象として抜き出す y <- fft(x) y.tmp <- Mod(y) # 複素数の絶対値を計算 # 振幅スペクトル(amplitude spectrum)の計算 y.tmp <- Mod(y) # 複素数の絶対値を計算 y.ampspec <- y.tmp[1:(length(y)/2+1)] # DC〜ナイキストの範囲 y.ampspec[2:(length(y)/2)] <- y.ampspec[2:(length(y)/2)] * 2 # 対応する周波数の計算(DC〜ナイキストの範囲をビン数で均等割) f <- seq(from=0, to=fs/2, length=length(y)/2+1) # グラフ作成 plot(f, y.ampspec, type="h", xlab="Frequency (Hz)", ylab="Amplitude Spectrum", xlim=c(0, 600)) grid() ```
回答: Pythonのwavモジュールをそのまま使うなら、LRの分割を自分でやる必要があります。おそらく左右にほとんど同じ信号が入っているため、分割前だと周波数が半分になったんだと思います。 ``` wf = wave.open("~~~.wav" , "r" ) fs = wf.getframerate() # サンプリング周波数 nchannels = wf.getnchannels() x = wf.readframes(wf.getnframes()*nchannels) wf.close() # bytes arrayからnumpy.arrayに変換 x = np.frombuffer(x, dtype= "int16") / 32768.0 # stereo音源の場合、左右に分割 if nchannles == 2: Lchannle = x[::2] Rchannle = x[1::2] ```