0

我正在尝试使用相位声码器来冻结声音的效果。我通过存储光谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来做到这一点。为了回放冻结的帧,我只需将频谱帧重复插入相位声码器的反函数,每次都用我的相位差值递增(并包裹)相位。

这是我目前正在做的一些伪代码(为简洁起见),其中 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);
}
4

1 回答 1

0

将 delta 相位加在一起会改变频率,从而破坏使合成听起来“好”所需的任何谐波关系。

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

于 2017-08-08T22:33:39.083 回答