我试图在使用相位声码器冻结声音的过程中产生效果。我通过存储频谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来实现此目的。要播放冻结的帧,只需将频谱帧重复插入相位声码器的反函数中,每次用我的相位差值递增(并环绕)相位。
这是我目前正在做的一些伪代码(为简便起见),其中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/