我正在尝试使用相位声码器来冻结声音的效果。我通过存储光谱帧(幅度和相位)以及前一帧和当前帧之间的相位差来做到这一点。为了回放冻结的帧,我只需将频谱帧重复插入相位声码器的反函数,每次都用我的相位差值递增(并包裹)相位。
这是我目前正在做的一些伪代码(为简洁起见),其中 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);
}