2017-08-08 12 views
0

フェーズボコーダーを使用してサウンドをフリーズさせようとしています。私はスペクトルフレーム(大きさと位相)と前のフレームと現在のものとの間の位相差を保存することでこれを行います。フリーズしたフレームを再生するには、スペクトルフレームを位相ボコーダの逆関数に繰り返しプラグインするだけで、位相差の値で位相を増分(およびラップ)します。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); 
} 

答えて

0

デルタ位相を一緒に追加すると周波数が変化し、合成音を「良好」にするために必要な高調波関係が損なわれます。

もう一つの可能​​な解決策は、フレームではなく合成サウンドトラックを結合することです。例えば各フェーズボコーダーで合成されたサウンドトラックがそれ自身で良いサウンドになるようにしてから、ミキサーを使用して結果を合成してください。

+0

私は時間領域に戻ってそれらを移動した後に音を合算することになります(私は実際には、このような音が聞こえるようにするために働いている)が、私は周波数ドメインでそれをしたいので、私が必要とする以上のIFFTをしなくてはなりません。私はFFTが線形なので、何とか2つの信号を追加できるはずだと思った。ちょうどそれの周りに私の頭を得ることができません。 – mazbox

関連する問題