参考:
1. librosa官网
2. librosa语音信号处理
3. 语音信号处理库 ——Librosa
4. librosa音频处理教程
5. Python音频信号处理库函数librosa介绍
0 谱分析函数
1. librosa 读取信号
librosa.load(path, sr=22050, mono=True, offset=0.0, duration=None)
读取音频文件。默认采样率是22050,如果要保留音频的原始采样率,使用sr = None。
参数:
-
path :音频文件的路径。
-
sr :采样率,如果为“None”使用音频自身的采样率
-
mono :bool,是否将信号转换为单声道
-
offset :float,在此时间之后开始阅读(以秒为单位)
-
duration:float,仅加载这么多的音频(以秒为单位)
返回: -
y :音频时间序列
-
sr :音频的采样率
1. 加载数据
librosa.load(path, *, sr=22050, mono=True, offset=0.0, duration=None, dtype=<class 'numpy.float32'>, res_type='soxr_hq')
** 读取音频文件。默认采样率是22050,如果要保留音频的原始采样率,使用sr = None。默认单通道,如果要保留原始通道数,使用mono=False**
参数:
- path :音频文件的路径。
- sr :采样率,如果为“None”使用音频自身的采样率
- mono :bool,是否将信号转换为单声道
- offset :float,在此时间之后开始阅读(以秒为单位)
- duration:float,仅加载这么多的音频(以秒为单位)
返回:
- y :音频时间序列
- sr :音频的采样率
2. STFT 短时傅里叶变换
librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')
短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t)
- 复数的实部:np.abs(D(f,t))频率的振幅
- 复数的虚部:np.angle(D(f,t))频率的相位
参数:
-
y:音频时间序列
-
n_fft:FFT窗口大小,n_fft=hop_length+overlapping
-
hop_length:帧移,如果未指定,则默认win_length / 4。
-
win_length:每一帧音频都由window()加窗。窗长win_length,然后用零填充以匹配N_FFT。默认win_length=n_fft。
-
window
:字符串,元组,数字,函数 shape =(n_fft, )
- 窗口(字符串,元组或数字);
- 窗函数,例如scipy.signal.hanning
- 长度为n_fft的向量或数组
-
center
:bool
- 如果为True,则填充信号y,以使帧 D [:, t]以y [t * hop_length]为中心。
- 如果为False,则D [:, t]从y [t * hop_length]开始
-
dtype:D的复数值类型。默认值为64-bit complex复数
-
pad_mode:如果center = True,则在信号的边缘使用填充模式。默认情况下,STFT使用reflection padding。
返回:
- STFT矩阵,shape =
import librosa
import numpy as np
import matplotlib.pyplot as plt
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
SSTFT = librosa.stft(signal, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')
S = np.abs(SSTFT)
fig,ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(S,ref=np.max),y_axis='log', x_axis='time',ax=ax)
ax.set_title('Power spectrogram')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
fs: 48000
signal:(583680)
3.istft 短时傅里叶逆变换
librosa.istft(stft_matrix, hop_length=None, win_length=None, window='hann', center=True, length=None)
短时傅立叶逆变换(ISTFT),将复数值D(f,t)频谱矩阵转换为时间序列y,窗函数、帧移等参数应与stft相同
参数:
-
stft_matrix :经过STFT之后的矩阵
-
hop_length :帧移,默认为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRHd0a0d-1683873363702)(https://math.jianshu.com/math?formula=%5Cfrac%7B%F0%9D%91%A4%F0%9D%91%96%F0%9D%91%9B%F0%9D%91%99%F0%9D%91%92%F0%9D%91%9B%F0%9D%91%94%F0%9D%91%A1%E2%84%8E%7D%7B4%7D)]
-
win_length :窗长,默认为n_fft
-
window
:字符串,元组,数字,函数或shape = (n_fft, )
- 窗口(字符串,元组或数字)
- 窗函数,例如scipy.signal.hanning
- 长度为n_fft的向量或数组
-
center
:bool
- 如果为True,则假定D具有居中的帧
- 如果False,则假定D具有左对齐的帧
-
length:如果提供,则输出y为零填充或剪裁为精确长度音频
返回:
- y :时域信号
import librosa
import numpy as np
import matplotlib.pyplot as plt
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
SSTFT = librosa.stft(signal, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')
Y = librosa.istft(SSTFT)
print(np.max(np.abs(Y-signal)))
plt.plot(Y)
out: 1.1920929e-07
4. ifgram(已取消)
librosa.core.ifgram(y, sr=22050, n_fft=2048, hop_length=None, win_length=None, window=’hann’, norm=False, center=True, ref_power=1e-06, clip=True, dtype=<class ‘numpy.complex64’>, pad_mode=’reflect’)
计算瞬时功率,
librosa 0.8 版本之后,该函数取消了
5. cqt-常数Q变换
librosa.cqt(y, *, sr=22050, hop_length=512, fmin=None, n_bins=84, bins_per_octave=12, tuning=0.0, filter_scale=1, norm=1, sparsity=0.01, window='hann', scale=True, pad_mode='constant', res_type='soxr_hq', dtype=None)
恒Q变换,指中心频率按指数规律分布,滤波带宽不同、但中心频率与带宽比为常量Q的滤波器组。它与傅立叶变换不同的是,它频谱的横轴频率不是线性的,而是基于log2为底的,并且可以根据谱线频率的不同该改变滤波窗长度,以获得更好的性能。
参数:
- y:音频时间序列
- sr:采样率,如果为“None”使用音频自身的采样率
- hop_length :帧移,默认为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来
- fmin: 最小频率,默认C1=32.7Hz
- n_bins:频率箱数
- bins_per_octave:每个八度的箱数
- tuning:以箱的分数单位调整偏移量,
- None:调谐将从信号中自动估计;生成的 CQT 的最小频率将修改为 。
fmin * 2**(tuning / bins_per_octave)
- None:调谐将从信号中自动估计;生成的 CQT 的最小频率将修改为 。
返回:
- 每个频率在每个时刻的恒常Q值
import matplotlib.pyplot as plt
import librosa
import numpy as np
# 1. Generate and plot a constant-Q power spectrum
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
C1 = np.abs(librosa.cqt(signal, sr=fs))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(C1, ref=np.max),
sr=fs, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('Constant-Q power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
#plt.show()
# 2. Limit the frequency range
C2 = np.abs(librosa.cqt(signal, sr=fs, fmin=librosa.note_to_hz('C2'),
n_bins=60))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(C2, ref=np.max),
sr=fs, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('Constant-Q Limit the frequency range power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
#plt.show()
# 3. Using a higher frequency resolution
C3 = np.abs(librosa.cqt(signal, sr=fs, fmin=librosa.note_to_hz('C2'),
n_bins=80, bins_per_octave=12 * 2))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(C3, ref=np.max),
sr=fs, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('Constant-Q higher frequency resolution power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
6. ICQT-常数Q逆变换
librosa.icqt(C, *, sr=22050, hop_length=512, fmin=None, bins_per_octave=12, tuning=0.0, filter_scale=1, norm=1, sparsity=0.01, window='hann', scale=True, length=None, res_type='soxr_hq', dtype=None)
import librosa
import numpy as np
import matplotlib.pyplot as plt
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
C = np.abs(librosa.cqt(signal, sr=fs))
Y= librosa.icqt(C=C, sr=fs)
print(np.max(np.abs(Y-signal)))
plt.plot(Y)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uDqh0ccT-1683873363704)(librosa 使用初探.assets/image-20230512105734836.png)]
7. hybrid_cqt
混合CQT变换
librosa.hybrid_cqt(y, *, sr=22050, hop_length=512, fmin=None, n_bins=84, bins_per_octave=12, tuning=0.0, filter_scale=1, norm=1, sparsity=0.01, window='hann', scale=True, pad_mode='constant', res_type='soxr_hq', dtype=None)
import matplotlib.pyplot as plt
import librosa
import numpy as np
# 1. Generate and plot a constant-Q power spectrum
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
C1 = np.abs(librosa.hybrid_cqt(signal, sr=fs))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(C1, ref=np.max),
sr=fs, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('hybrid_cqt power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH7buvY7-1683873363704)(librosa 使用初探.assets/image-20230512113619081.png)]
8. pseudo_cqt
librosa.pseudo_cqt(y, *, sr=22050, hop_length=512, fmin=None, n_bins=84, bins_per_octave=12, tuning=0.0, filter_scale=1, norm=1, sparsity=0.01, window='hann', scale=True, pad_mode='constant', dtype=None)
import matplotlib.pyplot as plt
import librosa
import numpy as np
# 1. Generate and plot a constant-Q power spectrum
signal, fs = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True) # sr=none 获取信号的采样频率 否则默认为22050; mono 默认为True,获取单通道信息,若要获取所有通道信息,mono= False
C1 = np.abs(librosa.pseudo_cqt(signal, sr=fs))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(C1, ref=np.max),
sr=fs, x_axis='time', y_axis='cqt_note', ax=ax)
ax.set_title('pseudo_cqt power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JymJvce-1683873363704)(librosa 使用初探.assets/image-20230512133843022.png)]
9. vqt
librosa.vqt(y, *, sr=22050, hop_length=512, fmin=None, n_bins=84, intervals='equal', gamma=None, bins_per_octave=12, tuning=0.0, filter_scale=1, norm=1, sparsity=0.01, window='hann', scale=True, pad_mode='constant', res_type='soxr_hq', dtype=None)
import librosa
import numpy as np
import matplotlib.pyplot as plt
y, sr = librosa.load('audio_Data/哈密实地振动.wav',sr=None,mono=True)
C = np.abs(librosa.cqt(y, sr=sr))
V = np.abs(librosa.vqt(y, sr=sr))
fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True)
librosa.display.specshow(librosa.amplitude_to_db(C, ref=np.max),
sr=sr, x_axis='time', y_axis='cqt_note', ax=ax[0])
ax[0].set(title='Constant-Q power spectrum', xlabel=None)
ax[0].label_outer()
img = librosa.display.specshow(librosa.amplitude_to_db(V, ref=np.max),
sr=sr, x_axis='time', y_axis='cqt_note', ax=ax[1])
ax[1].set_title('Variable-Q power spectrum')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VjDgfG4-1683873363705)(librosa 使用初探.assets/image-20230512135056199.png)]