2017-11-22 7 views
-1

私は、最初にフィルタを適用してFFTを計算しようとしているコードを理解しようとしています。 どうしているのか分かりません。誰も私にそれを説明できますか?すべてのfftのpythonによるスペクトログラム

# Parameters to create the spectrogram 
N = 160000 # No. of frames in .wav file 
K = 512 
step = 4 
wind = 0.5 * (1 - np.cos(np.array(range(K)) * 2 * np.pi/(K - 1))) # 0.5*2*sin(o/2), creation of filter window 
ffts = [] 
def wav_to_floats(file): 
    s = wave.open(file, 'r') 
    str_sig = s.readframes(s.getnframes()) 
    y = np.fromstring(str_sig, np.short) 
    s.close()  
    return y 

for file_index in range(len(label)): 
    test_flag = label.iloc[file_index]['fold'] # 0 - training data, 1 - test data 
    fname = label.iloc[file_index]['filename'] 

    #-------------from here i dont understand mainly------------ 
    spectogram = [] 
    s = wav_to_floats(essential_folder+'src_wavs/'+fname+'.wav') 
    for j in range(int((step*N/K) - step)): 
     vec = s[j * K/step : (j+step) * K/step] * wind 
     spectogram.append(abs(fft(vec, K)[:K/2])) 

    ffts.append(np.array(spectogram)) 

答えて

0

まず、それはあなたが浮動小数点数を必要とするFFTを計算するので、(s = wav_to_floats(essential_folder+'src_wavs/'+fname+'.wav') ` をfloatにwavファイルからファイルを変換します。ここで コードです。 (FFTはあなたにモジュラスと位相の情報を運ぶ複素数を与えるので)その後、それが信号と窓(おそらくウィンドウフィルタ)

for j in range(int((step*N/K) - step)): 
     vec = s[j * K/step : (j+step) * K/step] * wind 

間の畳み込みは、FFTのモジュラスをとりず、このベクトルをfftsに追加します

+0

ありがとうございました。なぜrange(int((step * N/K) - step)) – srk