基于python的fft谱图

2024-04-16 10:49:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解一段代码,在我看来,这段代码试图首先应用滤波器,然后计算FFT。 我不明白它是怎么做到的。谁能给我解释一下吗。 代码如下:

# 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))

Tags: ofto代码inindexstepnprange
1条回答
网友
1楼 · 发布于 2024-04-16 10:49:54

首先,它将文件从wav转换为float(s = wav_to_floats(essential_folder+'src_wavs/'+fname+'.wav')` ,因为要计算fft,需要一个浮点数。之后,它在信号和窗口之间进行卷积(可能是一个加窗滤波器)

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

取fft的模(因为fft给了你一个复数,它携带了关于模和相位的信息),然后把这个向量加到fft上

相关问题 更多 >