使用局部加权和的快速频谱图相位重建
项目描述
LWS
使用局部加权和的快速频谱图相位恢复
作者:乔纳森·勒鲁——2008-2019
LWS 是一个 C/C++ 库,这个包是一个 Python 包装器。
Matlab/Mex 包装器也可用。
执照
版权所有 (C) 2008-2019 Jonathan Le Roux
Apache 2.0 ( http://www.apache.org/licenses/LICENSE-2.0 )
引用这段代码
如果您使用此代码,请引用以下论文:
批量 LWS
Jonathan Le Roux、Hirokazu Kameoka、Nobutaka Ono、Shigeki Sagayama,
“基于频谱图一致性的幅度 STFT 频谱图的快速信号重建”
,在 Proc。国际数字音频效果会议 (DAFx),第 397--403 页,2010 年 9 月。
@InProceedings{LeRoux2010DAFx09,
author = {Jonathan {Le Roux} and Hirokazu Kameoka and Nobutaka Ono and Shigeki Sagayama},
title = {Fast Signal Reconstruction from Magnitude {STFT} Spectrogram Based on Spectrogram Consistency},
booktitle = {Proc. International Conference on Digital Audio Effects (DAFx)},
year = 2010,
pages = {397--403},
month = sep
}
在线 LWS,“没有未来”LWS
Jonathan Le Roux、Hirokazu Kameoka、Nobutaka Ono、Shigeki Sagayama,
“用于更快基于频谱图一致性的信号重建的相位初始化方案”
,在 Proc。ASJ 秋季会议,3-10-3,2010 年 9 月。
@InProceedings{LeRoux2010ASJ09,
author = {Jonathan {Le Roux} and Hirokazu Kameoka and Nobutaka Ono and Shigeki Sagayama},
title = {Phase Initialization Schemes for Faster Spectrogram-Consistency-Based Signal Reconstruction},
year = 2010,
booktitle = {Proc. Acoustical Society of Japan Autumn Meeting (ASJ)},
number = {3-10-3},
month = mar
}
安装:
- 最简单的安装方法
lws
是通过pip
:
pip install lws
- 使用 cython 从源代码编译(修改代码时需要):
cd python
LWS_USE_CYTHON=1 make
- 要使用预生成的 c 源文件(使用 cython 获得)从源代码编译:
cd python
make
- 或者,可以先使用 cython 创建一个 tarball,然后可以使用 pip 安装它:
cd python
make sdist
pip install dist/lws-1.2.6.tar.gz
注意:在 Windows 上,需要安装适用于您的 Python 版本的 Microsoft Visual C++ 编译器。有关详细信息,请参阅此页面。
用法
import lws
import numpy as np
lws_processor=lws.lws(512,128, mode="speech") # 512: window length; 128: window shift
X = lws_processor.stft(x) # where x is a single-channel waveform
X0 = np.abs(X) # Magnitude spectrogram
print('{:6}: {:5.2f} dB'.format('Abs(X)', lws_processor.get_consistency(X0)))
X1 = lws_processor.run_lws(X0) # reconstruction from magnitude (in general, one can reconstruct from an initial complex spectrogram)
print('{:6}: {:5.2f} dB'.format('LWS', lws_processor.get_consistency(X1)))
选项
lws_processor=lws.lws(awin_or_fsize, fshift, L = 5, swin = None, look_ahead = 3,
nofuture_iterations = 0, nofuture_alpha = 1, nofuture_beta = 0.1, nofuture_gamma = 1,
online_iterations = 0, online_alpha = 1, online_beta = 0.1, online_gamma = 1,
batch_iterations = 100, batch_alpha = 100, batch_beta = 0.1, batch_gamma = 1,
symmetric_win = True, mode= None, fftsize=None, perfectrec=True)
awin_or_fsize
: 分析窗口或窗口长度(在这种情况下使用 sqrt(hann) 窗口);分析窗口应该是对称的,以便计算正确。fshift
: 窗口移位L
:相位重建算法中的近似阶数,5 应该是好的。swin
: 合成窗口(如果没有,它是从分析窗口中计算出来的,以进行完美的重建)look_ahead
:类RTISI-LA算法中的前瞻帧数,3应该是好的。xxx_iterations
,xxx_alpha
,xxx_beta
,xxx_gamma
: 算法 xxx 的迭代次数(其中 xxx 是 、 或 之一nofuture
)online
,batch
以及用于确定在每次迭代中更新哪些 bin 的递减稀疏曲线的参数 alpha/beta/gamma。任何幅度大于给定阈值的 bin 都会被更新,其他 bin 会被忽略 (thresholds = alpha * np.exp(- beta * np.arange(iterations)**gamma)
)symmetric_win
:确定是否使用对称汉恩窗mode
:None
,'speech'
或'music'
. 这设置了似乎对语音和音乐信号有益的每个算法的默认迭代次数。免责声明:您的里程可能会有所不同。fftsize
:可以设置长于帧大小以在 FFT 中进行 0 填充。请注意,0-padding 将在窗口的左侧和右侧对称地完成,以在分析窗口中强制对称。perfectrec
:是否在每一边都用零填充以确保边界处的完美重建。
实现了三个步骤,可以通过适当设置相应的迭代次数来独立开启/关闭它们:
- “没有未来” LWS:使用仅涉及过去帧的 LWS 更新进行阶段初始化
- online LWS:使用在线 LWS 更新的相位估计,对应于 RTISI-LA 的快速时频域版本
- LWS:在整个频谱图上使用批量 LWS 更新进行相位估计
评论
-
.cpp 文件实际上是带有一些 C99 样式注释的 C 代码,但是在 Windows 上需要 .cpp 扩展名才能让 mex 确认 c99 标志(使用 .c,它被丢弃,而使用 -ansi,导致编译错误)
-
由于该模块是 C 扩展,因此无法重新加载(参见http://bugs.python.org/issue1144263)。特别是在 Jupyter Notebooks 中,自动重新加载将不起作用,并且必须重新启动内核。
致谢
将 LWS C 代码包装为 python 模块的方法很大程度上受到 Martin Sosic 帖子的启发:http ://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python-module.html