我使用Stefan Bernsee 的代码实现了一个协调器,效果很好。我弄清楚了找到根音的逻辑,以及音阶中的正确和声。
唯一的问题是,我的高音听起来像是吸了太多氦气的人!
经过一番研究,我发现那是因为我没有保留共振峰。问题是我不知道该怎么做!我听说我必须使用倒谱,但仅此而已。
我修改的斯蒂芬的代码是:
/* ***************** PROCESSING ******************* */
/* this does the actual pitch shifting */
memset(mSynMagn, 0, mParent.mFftFrameSize * sizeof(float));
memset(mSynFreq, 0, mParent.mFftFrameSize * sizeof(float));
for (k = 0; k <= mParent.mFftFrameSize2; k++)
{
index = k * pitchShift;
if (index <= mParent.mFftFrameSize2)
{
mSynMagn[index] = mParent.mAnaMagn[k];
mSynFreq[index] = mParent.mAnaFreq[k] * pitchShift;
}
}
我想我必须弄乱 SynMagn 数组,但我不知道该怎么做。我认为计算倒谱,只是通过 manaMag 并记录日志?(哪个基数?)那么当我有那个倒谱时,我该怎么办?那些线应该变成什么?
mSynMagn[index] = mParent.mAnaMagn[k];
mSynFreq[index] = mParent.mAnaFreq[k] * pitchShift;