我试图了解改变信号音高的过程。在对加窗信号执行 FFT 后,我们得到了信号的频率信息。为什么我们不能简单地改变这些频率来改变信号的音高?相反,我们必须首先使用音高检测方法来确定时域函数中存在的音高。FFT 怎么不给你这些信息?如果不是时域信号的频率,FFT 给出的频率信息是什么?
为什么在音高校正中需要音高检测?
我不知道您到底在说什么算法,因为您没有在问题中说明这一点,但是我对音高校正的想法包括检测实际音高并将其移至正确的音高。
您问为什么需要音高检测。好吧,为了能够编写一个自动校正录音音高的程序(即,与您手动检查每个时刻的正确频率的情况相反),您首先应该有一个包含所有可能的数组音符对应的频率。也就是说,一个包含所有检测到正确的值的列表,这样就不必更改它们。如果歌手准确地击中了,那么你为什么要自动调整它?
然后,您应该使用 STFT执行音高检测。对于每一时刻,都会有一个主导频率。一种(原始)方法是找到显示最大振幅的频率。当您找到最大值(音高检测)时,您应该将其所在的频率与您之前创建的音符数组进行比较。然后,假设歌手不是那么糟糕并且他击中的音调接近于所需的音调,则应该将检测到的频率带到最接近的音符(音高转换)。例如,如果在检测到最大值,则可以选择 ( ) 而不是 ()。我相信这里应该考虑一些关于对数感知的事情,但这与这个问题无关。考虑到有音高检测算法,我只是以这种简单的方法为例进行说明。
这就是为什么必须进行检测的原因。如果您不知道歌手的实际音高,则无法自动将音高“四舍五入”到正确的音高。
较长信号的有限长度段(窗口)的 DFT 或 FFT 不会为您提供该信号中的频率。它将该信号分解为一组有限的基向量,这些基向量在 FFT 长度内正交,这可能表示或可能不表示任何单个 FFT 结果箱中较长窗口正弦曲线的频率。如果较长的信号包含不在 FFT 基向量中的频谱频率,则不会在 FFT 结果中找到它,除非是与感兴趣的实际频率略有不同的频率(和相位)的大量混合。
如果您处理的频率不同,从附近的 FFT 结果箱中的细微差别到非常不同的频率,覆盖 FFT 结果的整个频谱,与真实的(例如,您关心的较长原始无窗源中的正弦曲线) ,你可能会也可能不会得到你想要的结果。
此外,音调不同于正弦频率基矢量。这是一种更复杂的心理声学现象,必须单独估计。
很好地参考了Michael Peimani 的论文。对于学士学位的论文来说,这还不错。我认为这对于 MS 来说是不够的。
音高校正是关于基于期望(输出)音高与实际(输入)音高之间的差异的音高偏移量。通常(如 Autotune 或比 AT 更好的音高校正器)所需的音高是输入音高的函数。
音高移位需要一个参数,即音高移位量(即输出和输入音高之间的差异),但不一定(或固有地)输入(或输出)音高。事实上,人们可以从概念上改变没有单一输入音高的声音的音高。它可能是一些具有许多频率分量的滤波噪声的宽带段,并且输出将使所有这些分量在对数频率范围内向上或向下移动给定数量。
频域音高移位(相位声码器或正弦建模)不需要知道输入音高,但仍需要知道主音高移位量;向上或向下移动多少个半音(
时域音高移位(这将被称为各种不同的名称,有时意味着相同的东西)需要了解输入信号的一些信息,以便拼接输入信号以延长它(用于上移)或缩短它(用于降档)。该信息来自音高检测器。音调检测器基本上返回基频,它是周期的倒数,时域音调移位器将拼接或拼接出整数个周期,以避免拼接产生的毛刺。