Phase Vocoder For Time Stretch Based On Center Frequency Estimation论文阅读

Motivation

本文提出了一种基于中心频率估计的相位声码器相位校正算法。相位声码器中用于时间扩展的移相估计是一个重要问题,目前尚无一致的解。在许多情况下,由STFT、相位校正和ISTFT组成的简单方法不能产生高质量的结果,因此提出了使用多个FFT大小和通过振荡器组进行正弦波合成等方法,但不幸的是,这些方法的计算成本很高。而本文所提出的方法采用了一种新的相位校正算法,可以产生高质量的结果,同时实现高度的并行性,从而更快地执行

Background

A  Phase vocoder

相位声码器是一种从音频信号中提取相位和幅度信息进行时间修正的编码器。其中最重要的是修改阶段。在STFT中,设k为每帧的频率索引,则第k个bin的频率Ωk为

 当使用窗口函数w[n]时,可以通过STFT计算X(t_{a}^{r}, Ωk),如下所示:

其中r的帧数,Ra表示原始来源的hop size,t_{a}^{r}=rRa为第r帧的流逝时间。 

由于Ωk已知,最简单的方法是计算相位变化的程度。为此,我们首先需要计算第r帧的瞬时频率ˆωk(tra)

 其中,∆pΦrk是∆Φrk的主要相位角。相位纠正公式如下:

B  Peak phase-locking (PPL)

该方法检测频谱图中的峰值,并锁定相位而不是瞬时频率。相位纠正的公式如下:

Method

提出的算法使用PPL跟踪谱图中的峰值,并确保峰值附近的所有bins具有相同的群延迟。该算法跟踪频谱图中的峰值,但与PPL不同,它不使用峰值的频率进行相位校正。相反,该算法从相邻帧的峰值频率和谱图的幅值模式计算出包含峰值的峰值的中心频率。这是因为频谱上的峰值和实际的中心频率不匹配,在包含振动的声谱图中,例如歌声,稍后将会描述。该算法包括峰值检测、中心频率计算、中心频率校正和相移算法,并依次执行。峰值检测和中心频率计算算法计算一帧内的中心频率。而中心频率校正算法则是对相邻帧之间在时间方向上的中心频率变化进行校正。相移算法是PPL的一种实现

A Peak detection

算法1给出了峰值检测算法的伪代码。左边在谱图搜索开始时初始化为第0个bin,如果之前搜索过峰值,它与前一个峰值的右边相同,所以很容易计算。问题是找到正确的位置和峰。在bin数k增加的方向上搜索谱图时,不断更新峰位置中心到振幅最高的位置,并将振幅存储在峰中。决定是否停止寻找峰值的变量cut最初被设置为0。

如果当前bin的幅值小于峰值(FailTrigger)的一定倍数,则cut为1,即当前峰值幅值减小。当cut = 1时,如果振幅的增加大于RiseTrigger乘数大于峰的最低部分的振幅,则峰的右谷对应的右返回到峰的最低部分(rightbkup),停止搜索。它是振幅最大(整数)的bin位置,而不是峰值的频率(实数)。通过算法计算得到的左t、右、峰值和中心值存储在l、r、p、k中,用于计算中心频率

B  Center frequency calculation

以下为中心频率计算的公式:

与现有的PPL算法不同,该算法并不只使用峰值附近的几个bin。当一个颤音在短时间内含有噪声时,其峰值频率不一定代表中心频率。所以该算法平均本峰值对应的频率和平均两个极端的地区的频率。此地区有一个振幅大于或等于峰值振幅PeakCutoff 来替代C_{k}(r),算法得到的峰值为(C_{k}^{'}[r])。最后,它使用周围的PeakWidth bins来计算中心频率。在具有理想颤音的正弦信号中,C_{k}^{'}​​​​​​​ [r]等于C_{k}[r]。在包含噪声的音频信号中,C_{k}^{'}​​​​​​​ [r]比C_{k}[r]更接近信号的中心频率。

C  Center frequency correction

方程(7)是对该算法的峰值校正。

其中w_{k}[r]是第r帧第k个bin的中心频率。函数fshape接收5个相邻帧的中心频率,并根据相邻帧的中心频率是否接近m返回大小为5的核函数,m可以是1或0,取决于两个中心频率的差值。因为k可以是任何数字,ω⌊w_{k}[r]⌉被用来代替w_{k},其中⌊·⌉是四舍五入运算到最近的整数来找到相邻帧中的峰值。为了减少噪声对中心频率的误判,必须进行此操作。如果计算值不能很好地跟踪中心频率,则相位声码器的性能将会下降,因此需要进行合理的折衷。

图2显示了在执行峰值校正之前(左)和(右)后的中心频率的变化。在每一帧中,在中心频率对应的部分上绘制黑点。在前一句话中,“减少差异”意味着使上面图像中的黑点尽可能地形成一条平滑的曲线。该算法就像是一个处理中心频率随时间变化的滤波器。对于相邻的五帧,根据五帧之间的中心频率对适当的核k进行卷积来实现滤波。

实验步骤

常数设置:

在实验中,使用了N=4096的FFT尺寸和功率为3的余弦窗口。该算法能准确预测中心频率,且中心频率不随时间变化迅速,具有较好的性能。为了减少中心频率随时间的变化,该算法在使用高重叠时表现出更好的性能,因此使用了95%的重叠来进行实验。

实验中使用Matlab编写的经典相位声码器包括STFT、相位校正和ISTFT,原始信号和目标信号具有相同的hop size(以及不同的帧数)。在相位校正中,目标信号的帧的幅度和相位是由原始信号的帧的幅度和相位来确定的。当时间拉伸之比为α时,目标信号的第r帧由原始信号的第(rα)帧和第(rα+1)帧确定。幅度通过插值确定,相变量由两帧之间的相位差决定。

实验结果

图3为使用不同相位声码器对歌唱和撞击声源进行2×stretch后的频谱图结果。可以看到,SBSMS显示了最清晰的频谱图。提出的算法也显示了比较干净的频谱图。

图4显示了多相位声码器算法在单线程和多线程上的相对计算时间。可以看到,所提出的算法具有较高的并行处理效率,并且可以在多核处理器环境下快速执行。即使没有并行处理,该算法仍然比SBSMS更快。

总结

提出了一种相位声码器算法,该算法可以在时间拉伸应用中提供高质量的结果,只包括stft -相位估计- istft结构,而不需要任何额外的模块。相位估计算法是基于中心频率估计,通过寻找合适的频率峰值,对时间拉伸进行更精确的相位估计。此外,该算法在并行处理方面具有优势,使其成为实现需要实时时间扩展的应用程序的有用选择。

2022.4.28

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是VB Phase Vocoder算法matlab代码,用于实现音频信号的时间伸缩和音高变化: ```matlab % VB Phase Vocoder算法 % 输入:x - 原始音频信号 % alpha - 时间伸缩系数 % beta - 音高变化系数 % hop - 帧移参数 % 输出:y - 处理后的音频信号 function y = vb_phase_vocoder(x, alpha, beta, hop) % 窗函数 win = hann(hop*2); % 参数设置 N = length(win); % 窗口长度 M = round(N/hop); % 每帧采样点数 L = length(x); % 信号长度 K = ceil(L/hop); % 帧数 t = (0:L-1)'/fs; % 时间向量 % 初始化 y = zeros(round(L/alpha),1); % 输出信号长度 phi = zeros(N/2+1,1); % 初始相位 omega = 2*pi*(0:N/2)'/N; % 基本频率 pd = zeros(N/2+1,1); % 相位差 last_y = zeros(N,1); % 上一帧输出 % 处理每帧信号 for i = 1:K % 获取当前帧信号 idx = (i-1)*hop + (1:N); if idx(end) > L x(end+1:idx(end)) = 0; L = idx(end); end xw = x(idx).*win; % 短时傅里叶变换 X = fft(xw); Xmag = abs(X(1:N/2+1)); Xphase = angle(X(1:N/2+1)); % 相位差计算 pd = Xphase - phi - omega*hop; phi = Xphase; % 时间伸缩 pd = pd - round(pd/hop)*hop; pd = pd*alpha/hop; % 音高变化 new_Xmag = interp1((0:N/2)'/N, Xmag, (0:N/2)'*beta/N); new_Xmag(2:end-1) = 2*new_Xmag(2:end-1); % 重构信号 Y = new_Xmag.*exp(1i*(phi+pd)); yw = real(ifft([Y;conj(Y(end-1:-1:2))])); yw = yw.*win; y((i-1)*hop+1:i*hop) = y((i-1)*hop+1:i*hop) + yw(1:hop); % 重叠相加 y((i-1)*hop+1:i*hop) = y((i-1)*hop+1:i*hop) + last_y(hop+1:end); last_y = yw; end end ``` 需要说明的是,该代码中的变量含义如下: - `x`:原始音频信号 - `alpha`:时间伸缩系数 - `beta`:音高变化系数 - `hop`:帧移参数 - `win`:窗函数 - `N`:窗口长度 - `M`:每帧采样点数 - `L`:信号长度 - `K`:帧数 - `t`:时间向量 - `y`:处理后的音频信号 - `phi`:初始相位 - `omega`:基本频率 - `pd`:相位差 - `last_y`:上一帧的输出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值