我试图在使用相位声码器冻结声音的过程中产生效果。我通过存储频谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来实现此目的。要播放冻结的帧,只需将频谱帧重复插入相位声码器的反函数中,每次用我的相位差值递增(并环绕)相位。

这是我目前正在做的一些伪代码(为简便起见),其中frameA和frameB是相位声码器fft表示的幅度/相位表示。

void analyze(inputSignal) {
    // convert time domain "inputSignal" to frequency domain
    frameA = vocoder.forward(inputSignal);

    // calculate the inter-frame phase delta
    phaseDeltaA = frameA.phase - lastPhases;
    lastPhases = frameA.phase;
}

void playback(outputSignal) {
    frameA.phase += phaseDeltaA;
    outputSignal = vocoder.reverse(frameA);
}

效果很好。但是我要做的是将此冻结频谱帧与其他“冻结”帧结合起来(累加它们)。

我尝试将帧加在一起,也尝试将相位差加在一起,但这只会产生讨厌的声音。
void analyze(inputSignal) {

    ...

    // naively sum the magnitudes and phases of both frames
    combinedFrame.magnitude = frameA.magnitude + frameB.magnitude;
    combinedFrame.phase = frameA.phase + frameB.phase;

    // sum the phase deltas
    combinedPhaseDelta = phaseDeltaA + phaseDeltaB;

}
void playback(outputSignal) {
    combinedFrame.phase += combinedPhaseDelta;
    outputSignal = vocoder.reverse(combinedFrame);
}

最佳答案

将增量相位加在一起将改变频率,从而破坏使合成声音“良好”所需的任何谐波关系。

另一种可能的解决方案是不合并帧,而是合并完整的合成音轨。例如确保每个相位声码器合成的音轨本身听起来都不错,然后使用混音器合成结果。

关于audio - 将2相声码器帧混合在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45575173/

10-09 04:18