2017-06-22 4 views
6

resampleを使用して信号全体をピッチシフトすることができ、位相ボコーダコードhereを試しました。オクターブ/ MATLABコードを使用して、時間の経過と共に信号のピッチを段階的に変化させる

私もrepmat and interpolationを試みたと私はどのように私は、増分/徐々に時間をかけて信号のピッチを変更することができますfft and interp1

に見えましたか?私はOriginal Signalの例を含めましたが、Processed Signalのように聞こえるようにしようとしています(私はAudacityを使って処理した信号を作成し、その効果をSliding time scale/pitch shiftで作成しました)しかし、Octave 4.0でこの信号を作りたいと思います。 Processed Signalを聞くと、ファイルのピッチが徐々に増えていくのが聞こえますが、ファイルの長さはOriginal Signalと同じです(秒)。私はMatlabの

のようなものであるオクターブ4.0を使用してい

は、ここで全体の信号のピッチを変更して、数秒で元の信号の同じ長さを保つことができるコードですが、私はどのようにわからないんだけどそれは徐々に時間の経過と共に信号のピッチを変化させる。レイリーンにはこれまで私に感謝してくれてありがとう。

+0

音声信号に対してこれを行うことに興味があるようですので、分析/ [PSOLA](https://en.wikipedia.org/wiki/PSOLA)のような再合成ツール。このようなツールは、より自然なピッチの変化をもたらすはずです。 (PSOLAはかなり長いですが、最近はもっと良い選択肢があるかもしれないことに注意してください) –

+0

audacityはSubband Sinusoidal Modelingのために[sbsms](https://sourceforge.net/projects/sbsms/)ライブラリを使用しています。 MATLAB/Octaveですべてを書き直すことができます。それをコンパイルしてmex/octとして使用することができます – rahnema1

答えて

6

私の回答はあなたが投稿したものと全く同じ結果を出すものではありませんが、ピッチストレッチの背後にある重要な概念を提供するのには面白いと思います。 Web上の他の場所に提案している方法は見つけられませんでしたが、誰もこれを前もって考えていないと想像することはできません。

実現する最初の事はあなたが時間にわたりピッチに変換を適用し、ちょうど全体の時間経過の上にそれを相殺しないようにしたい場合は、あなたがそれぞれのを定義しているピッチ「の機能」を使用する必要があるということです信号内容全体(例えば、フーリエ)を要約するものとは対照的に、時間点(例えば、時間 - 周波数変換)である。

それは我々がdefined asヒルベルト相の誘導体である、あなたの信号の瞬時周波数、のようなものが関与する必要があることが明らかになったので、それは(一般的に(1/2Pi) * dPhi/ dtとして採用Hzで動作するように代わりに、これを実現することが重要ですrad/s)である。

私たちは信号の瞬時周波数を変換することができますと仮定すると、私たちはその後、「直線的に増加する瞬間周波数にオフセットを追加すること」に正式に「インクリメンタルピッチを上げる」のアイデアを翻訳することができますが。 良いニュースは、analytic transformを使用して信号の瞬間周波数をかなり簡単に変換できるということです。相に適用する前に、以前のコードで唯一の非自明なことは、我々は「オフセット直線的に増加ピッチ」を統合する必要があるということです

function y = add_linear_pitch(x, fs, df) 
% 
% y = add_linear_pitch(x, fs, df) 
% 
% x, fs: audio signal (1-dimensional) 
% df: the amplitude of frequency offset, in Hz 
% 
% See also: hilbert 
% 

    x = x(:); 
    n = numel(x); % number of timepoints 
    m = mean(x); % average of the signal 
    k = transpose(0:n-1); 

    h = hilbert(x - m); % analytic signal 
    e = abs(h); % envelope 
    p = angle(h) + df*pi*k.^2/fs/n; % phase + linearly increasing offset 
    y = m - imag(hilbert(e .* sin(p))); % inverse-transform 

end 

(または任意の瞬時周波数の変換)、:ここではどのようにあります2Pi(ラジアン単位)を掛けます。私たちの場合、線形関数の積分は単純に二次関数ですが、もっと複雑なもので遊ぶことができます:)

+0

これは本当にエレガントです。特定の周波数で終了したい場合は正しい傾きを計算する方法はありますか?一例は、元のボーカル信号の最大共振周波数が326.8hzで、それが402.3hzで終了したい場合です。 –

+1

私はそれが周波数の差(デルタ-y)と信号の長さ(デルタ-x)に依存するだけでよいと思います。私は忙しいですが、私はそれについてもっと考えて、数日以内に投稿を編集します。 – Sheljohn

+0

この数式は数学のセクションに掲載しましたが、この式は便利ですか? https://math.stackexchange.com/posts/comments/4816923?noredirect=1 –

関連する問題