# 预设环境是常规,以后不写了,第零步 import librosa import numpy as np from matplotlib import pyplot as plt # 1.加载信号 wave_path=r"C:\Users\LENOVO\PycharmProjects\pythonProject3\Audio_Data\piano_1.wav" waveform,sr=librosa.load(wave_path,sr=None) # 2.信号分帧,补零->分帧->加窗 # 补零 frame_size,hop_size=1024,512 if len(waveform) % hop_size !=0: frame_num=int((len(waveform)-frame_size)/hop_size)+1 #一个硬性要求:只要带整除符号的(/)就是float值,得转int pad_num = frame_num*hop_size+frame_size-len(waveform) waveform=np.pad(waveform,(0,pad_num),mode="wrap") # 分帧 # >>> b = np.array([[1, 2], [3, 4]]) # >>> np.tile(b, 2) # array([[1, 2, 1, 2], # [3, 4, 3, 4]]) # >>> np.tile(b, (2, 1)) # array([[1, 2], # [3, 4], # [1, 2], np(array,(x,1))x是重复几次array,后面默认写1 # [3, 4]]) # >>> c = np.array([1,2,3,4]) # >>> np.tile(c,(4,1)) # array([[1, 2, 3, 4], # [1, 2, 3, 4], # [1, 2, 3, 4], # [1, 2, 3, 4]]) row=np.tile(np.arange(0,frame_size),(frame_num+1,1)) #列0-1023,行1-438 column=np.tile(np.arange(0,hop_size*(frame_num+1),hop_size),(frame_size,1)).T index = row+column #不要一下子把一个array整出来,两步出来也可以的 waveform_frame=waveform[index] # 加窗 waveform_frame = waveform_frame * np.hanning(frame_size) # 3.信号进行傅里叶变换 n_fft = 1024 waveform_stft = np.fft.rfft(waveform_frame) # 4.功率谱函数 waveform_pow = np.abs(waveform_stft)**2/n_fft waveform_db = 20 * np.log10(waveform_pow) # 5.绘制波形 plt.figure(figsize=(10,10)) plt.imshow(waveform_db) y_ticks = np.arange(0,int(n_fft/2),100) plt.yticks(ticks=y_ticks,labels=y_ticks*sr/n_fft) plt.title("Waveform_STFT") plt.show() print("congratulation")