将2相声码器帧混合在一起

时间:2017-08-08 18:04:26

标签: audio signal-processing fft aubio

我正在试图使用相位声码器冻结声音。我这样做是通过存储谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来实现的。为了回放冻结的帧,我只是将频谱帧重复插入相位声码器的反函数中,每次用相位差值递增(和换行)相位。

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

1 个答案:

答案 0 :(得分:0)

将delta相位加在一起会改变频率,从而破坏使合成发声所需的任何谐波关系" good"。

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