Python を使用してオーディオの時間周波数図、スペクトログラム、MFCC 特徴マップを描画する

スペグラムを使用して時間-周波数ダイアグラムを描画する

import matplotlib.pyplot as plt
import numpy as np
import scipy.io.wavfile as wav
import matplotlib
from scipy.fft import fft
import librosa
import librosa.display

matplotlib.rc("font",family='SimHei') # 显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 显示符号
filename = 'D:\\code\\code\\audio process\\test.wav'
fs,signal = wav.read(filename)

plt.figure()
plt.subplot(2,1,1)#第一个子图
plt.specgram(signal[:,0],Fs=fs,scale_by_freq=True,sides='default')
plt.colorbar()#format='%+2.0f dB'

plt.subplot(2,1,2)#第二个子图
plt.specgram(signal[:,1],Fs=fs,scale_by_freq=True,sides='default')#绘制语谱图
plt.colorbar(format='%+2.0f dB')

plt.savefig('D:\\code\\code\\audio process\\test2.jpg')

#绘制频谱图
plt.figure()
ft=fft(signal[:,0])#需要注意 只能对一个通道的数据进行操作
magnitude=np.absolute(ft)#取相似度
magnitude=magnitude[0:int(len(magnitude)/2)+1]
f=np.linspace(0,fs,len(magnitude))
plt.plot(f,magnitude)

plt.figure()
#绘制MFCC scipy与librosa的读取数据机制不一样
signal,fs=librosa.load(filename,sr=44100)#sr为采样率,mono
print(signal.shape,type(signal),len(signal))
#(2, 10411757) <class 'numpy.ndarray'> 2
mfccs=librosa.feature.mfcc(y=signal,n_mfcc=13,sr=fs)
print(type(mfccs))
librosa.display.specshow(mfccs,sr=fs)
#绘制一阶mfcc
plt.figure()
delta_mfccs=librosa.feature.delta(mfccs)
print(type(delta_mfccs))
librosa.display.specshow(delta_mfccs,sr=fs)
#绘制二阶mfcc
plt.figure()
delta2_mfccs=librosa.feature.delta(mfccs,order=2)
librosa.display.specshow(delta2_mfccs,sr=fs)
print(type(delta2_mfccs))
#绘制39个维度的mfcc
plt.figure()
mfcc=np.concatenate((mfccs,delta_mfccs,delta2_mfccs))#里面有括号
librosa.display.specshow(mfcc,sr=fs)
plt.show() 作者:躺躺更健康耶 https://www.bilibili.com/read/cv17517045 出处:bilibili

時間-周波数ダイアグラム
時間周波数図は上記のとおりです

ここに画像の説明を挿入
頻度チャート

ここに画像の説明を挿入
完全なMFCC

時間-周波数グラフを保存せずに直接取得します


fig = plt.figure()                                                  # 创建所需对象fig
plt.specgram(rri,Fs=fs,scale_by_freq=True,sides='default')          # 直接绘制时频图,无需傅里叶变化
plt.colorbar()
canvas = FigureCanvasAgg(fig)                                       # 将图像从内存中提取出来。
canvas.draw()
buf = canvas.buffer_rgba()
X = np.array(buf)
X = X[:, :, :3]                                                      # 提取前三通道的图片, 第四个通道是全白的,所以不需要进行提取了
print(X.shape)

おすすめ

転載: blog.csdn.net/fuzekun/article/details/129112730