2020-01-18 python实现stft并绘制时频谱

Python019

2020-01-18 python实现stft并绘制时频谱,第1张

官方文档中给出了非常详细的安装方法

http://librosa.github.io/librosa/install.html

函数声明:

librosa.core.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, dtype=<class 'numpy.complex64'>, pad_mode='reflect')

常用参数说明:

y:输入的numpy数组,要求都是实数

n_fft:fft的长度,默认2048

hop_length:stft中窗函数每次步进的单位

win_length:窗函数的长度

window:窗函数的类型

return:一个1+n_fft/2*1+len(y)/hop_length的二维复数矩阵,其实就是时频谱

参考:

http://librosa.github.io/librosa/generated/librosa.core.stft.html#librosa.core.stft

主要用这两个

matplotlib.pyplot.pcolormesh()

matplotlib.pyplot.colorbar()

比如采样率为22050,音频文件有36s,那么x为长度为22050*36=793800的float。

用到了python库 Spleeter

抽象地了解下原理吧

参考文章是这篇:Spleeter: a fast and efficient music source separation tool with pre-trained models

原理文章是这篇 SINGING VOICE SEPARATION: A STUDY ON TRAINING DATA

粗略扫了一眼,原理主要是用U-Net进行分割,然后这个Python工具主要是利用了一个pre-trained的model。

参考链接:机器之心的一篇文章

纵轴表示频率(从0到10kHz),横轴表示剪辑的时间。由于我们看到所有动作都发生在频谱的底部,我们可以将频率轴转换为对数轴。

可以对频率取对数。

感觉这个参数蛮有意思的

整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度), librosa.feature.chroma_stft 用于计算。

先对音频进行短时傅里叶变换

其中每行存储一个窗口的STFT,大小为1025*1551

这里要注意理解怎么基于stft的结果来画频谱图

没太了解,感觉就大概知道有这么个量可以用到就行。

librosa.feature.spectral_centroid 计算信号中每帧的光谱质心:

1. 先理解连续傅里叶变换

2. 再理解离散傅里叶变换

对连续函数进行离散采样

3. 最后进入短时傅里叶变换

是先把一个函数和窗函数进行相乘,然后再进行一维的傅里叶变换。并通过窗函数的滑动得到一系列的傅里叶变换结果,将这些结果竖着排开得到一个二维的表象。

原文:

Python version

ttslearn のインストール

ttslearn の动作确认

パッケージのインポート

描画周りの设定

NumPy と Torch を用いた配列の作成

numpy.ndarray と torch.Tensor のインタフェースの违い

numpy.ndarray と torch.Tensor の相互変换

numpy.ndarray と torch.Tensor のメモリ共有

scipy.io.wavfile を利用した音声ファイルの読み込み

音声の可视化

窓関数

短时间フーリエ変换の実装

短时间フーリエ変换の结果の可视化

librosa.stft を用いた短时间フーリエ変换

librosa.stftは、STFTを実行する前にデフォルトで信号の冒头と末尾にパディング処理を行います。前述のSTFT実装はこの処理をサポートしていないため、同等のSTFTの结果を得るためには、center=Falseとしてパディング処理を行わないように设定します。

时间解像度と周波数解像度のトレードオフ

逆短时间フーリエ変换による音声の复元

メルフィルタバンク

メルスペクトログラムの计算

Griffin-Lim のアルゴリズムに基づく位相复元

瞬时周波数の可视化 (bonus)

Griffin-Limのアルゴリズムは、位相复元手法です。合成音声と自然音声の瞬时位相(位相の时间微分)を比较することで、位相复元が期待通り行われているかを视覚的に确认できます。

翻译:

Python 版本

ttslearn 的安装

ttslearn 的操作确认

导入程序包

设置绘图格式

使用NumPy和Torch创建数组

numpy.ndarray和torch.Tensor之间的接口差异

numpy.ndarray和torch.Tensor的相互转换

numpy.ndarray和torch.Tensor的内存共享

使用scipy.io.wavfile读取音频文件

语音可视化

窗函数

短时傅立叶变换的实现

短时傅立叶变换结果的可视化

使用librosa.stft的短时傅立叶变换

缺省情况下,librosa.stft在执行STFT(短时傅里叶变换)之前会对信号的开头和结尾进行填充。 由于上面提到的STFT实现不支持此操作,因此要获得等效的STFT结果,请将填充操作设置为center=False。

在时间分辨率和频率分辨率间权衡取舍

通过逆短时傅立叶变换进行语音的复原

邮件过滤器组

计算质谱图

基于Griffin-Lim算法的相位复原

瞬时频率可视化(bonus)

Griffin-Lim的算法是一种相位恢复方法。 通过比较合成语音和自然语音的瞬时相位(相位的时间微分),我们可以直观地看到相位恢复是否按预期进行。