フェーズボコーダーを使用してサウンドをフリーズさせようとしています。私はスペクトルフレーム(大きさと位相)と前のフレームと現在のものとの間の位相差を保存することでこれを行います。フリーズしたフレームを再生するには、スペクトルフレームを位相ボコーダの逆関数に繰り返しプラグインするだけで、位相差の値で位相を増分(およびラップ)します。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);
}
私は時間領域に戻ってそれらを移動した後に音を合算することになります(私は実際には、このような音が聞こえるようにするために働いている)が、私は周波数ドメインでそれをしたいので、私が必要とする以上のIFFTをしなくてはなりません。私はFFTが線形なので、何とか2つの信号を追加できるはずだと思った。ちょうどそれの周りに私の頭を得ることができません。 – mazbox