使用带有 TD-PSOLA 和共振峰保留的音高移位的问题

信息处理 Python 语音处理 沥青 音频处理
2022-02-01 02:00:16

我尝试了 TD-PSOLA ( https://github.com/sannawag/TD-PSOLA ) 的这种实现,即使我知道算法是如何工作的,我也不明白为什么我在使用时输出没有听得见的差异f_ratio = 0.5,假设f_ratio = f_new/f_orig

我尝试在shift_pitch()返回输出后再次使用find_peaks()从原始信号和新信号中打印“峰值”数组的长度(即峰值的总数)。我得到了这些结果:

f_ratio                            #orig_peaks                    #new_peaks
1                                    417                            416
0.9                                  417                            389
0.8                                  417                            403
0.7                                  417                            396
0.6                                  417                            324
0.5                                  417                            404

这在我看来完全是胡说八道。

我已经尝试过使用另一个窗口(numpy 的 Hamming,Hanning)。当然,它必须与重叠和添加过程有关......对吗?

任何帮助将不胜感激。

1个回答

我相信你是对的,这是重叠添加过程的问题。该代码没有正确计算较低音高的三角形窗口。

总之,窗户太大了。

对于低于 1 的任何音高比,例如 0.5(降低一个八度),它会产生不正确的结果。

下图解释了我理解的问题: TD-PSOLA 图,窗口宽度拉伸太多

大窗口引入了如此多的伪影(额外的峰值),结果听起来几乎完全相同,除了“对着风扇说话”效果。

为了解决这个问题,最简单的方法是添加一个 if 语句,该语句仅在音高比等于或大于 1 时才使用现有窗口,否则它应该使用“理想窗口”。

但是,我不确定在 Python 中实现“理想窗口”。现有算法用于newPeaks计算窗口。对于较低的音高,它必须使用旧peaks阵列。但是,这需要新的数学,我不确定如何准确实现。