我正在试图使用相位声码器冻结声音。我这样做是通过存储谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来实现的。为了回放冻结的帧,我只是将频谱帧重复插入相位声码器的反函数中,每次用相位差值递增(和换行)相位。
这是我正在做的一些伪代码(为了简洁起见),其中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);
}
答案 0 :(得分:0)
将delta相位加在一起会改变频率,从而破坏使合成发声所需的任何谐波关系" good"。
另一种可能的解决方案是组合不是帧,而是完整的合成音轨。例如确保每个相位声码器合成声道本身听起来不错,然后使用混音器合成结果。