音频&深度学习Lesson5_短时傅里叶变换

# 预设环境是常规,以后不写了,第零步
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")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值