Смешивание 2-фазных кадров вокодера вместе
Я пытаюсь создать эффект, когда я замораживаю звук с помощью фазового вокодера. Я делаю это путем сохранения спектрального кадра (величины и фазы), а также разности фаз между предыдущим и текущим кадром. Чтобы воспроизвести замороженный кадр, я просто вставляю спектральный кадр в обратную функцию фазового вокодера несколько раз, каждый раз увеличивая (и оборачивая) фазу своими значениями разности фаз.
Вот некоторый псевдокод (для краткости) того, что я делаю в данный момент, где 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 ответ
Добавление дельта-фаз вместе изменит частоты, тем самым разрушая любые гармонические отношения, необходимые для того, чтобы синтез звучал "хорошо".
Другим возможным решением было бы объединить не кадры, а законченные синтетические звуковые дорожки. например, убедитесь, что каждая синтезированная звуковая дорожка фазового вокодера звучит хорошо, а затем используйте микшер для компоновки результата.