音声ファイルの短時間フーリエ変換stftを行いたいです。
結果をスペクトログラムに表示する際にplt.pcolormesh(データ)を使うと以下のスペクトログラムが得られます。対称性が見られます。
一方、時間軸・周波数軸を規定するためにplt.pcolormesh(時間軸,周波数軸,データ)とした途端、それまで見えていた周波数の正負での対称性が消えてしまいます。]
この際、周波数軸とデータの対応は以下の図の通りになっております。
軸を指定した際も対称性を保ったまま描画したいのですが、どうすれば良いでしょうか?
以下にstftおよびグラフ描画に使用したコードを張っております。宜しくお願い致します。
from scipy.io.wavfile import read import numpy as np import csv import matplotlib.pyplot as plt #SFTF関数 def SFFT(s, Lf, step=None):# STFT(s:signal(1D-array), Lf:length of frame(window), noverlap:number of overlap) if step==None: step = Lf//2#'//'切り捨て徐算 l = s.shape[0] win = np.hanning(Lf)#ハニング窓 Nf = int(np.floor(float(l - Lf + step) / step)) # スペクトログラムの時間フレーム数 S = np.empty([Lf, Nf], dtype=np.complex128) for n in range(Nf):#フレーム数0~Nf-1まで S[:,n] = np.fft.fft(s[step*n:step*n+Lf]*win) return S #スペクトログラム関数 def plot_spectrogram(fs, s, Lf, step=None):# plot spectrogram (fs: sampling frequency, s: signal(1D-array), Lf: length of frame(window), noverlap: number of overlap) S = SFFT(s, Lf, step) S = np.abs(S) m = np.linspace(0, (s.shape[0]-Lf)/fs, num=S.shape[1] k = np.fft.fftfreq(Lf,1/24000) plt.figure() plt.pcolormesh(m,k,S, cmap = 'jet') plt.title("Spectrogram") plt.xlabel("time[s]") plt.ylabel("frequency[Hz]") plt.colorbar() plt.tight_layout() plt.show() data = read("test.wav") data = data[1]/65536#normalize Lf = 1024 # length of frame(window) plot_spectrogram(24000,data,Lf,step=None)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。