私の回答はあなたが投稿したものと全く同じ結果を出すものではありませんが、ピッチストレッチの背後にある重要な概念を提供するのには面白いと思います。 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
(ラジアン単位)を掛けます。私たちの場合、線形関数の積分は単純に二次関数ですが、もっと複雑なもので遊ぶことができます:)
音声信号に対してこれを行うことに興味があるようですので、分析/ [PSOLA](https://en.wikipedia.org/wiki/PSOLA)のような再合成ツール。このようなツールは、より自然なピッチの変化をもたらすはずです。 (PSOLAはかなり長いですが、最近はもっと良い選択肢があるかもしれないことに注意してください) –
audacityはSubband Sinusoidal Modelingのために[sbsms](https://sourceforge.net/projects/sbsms/)ライブラリを使用しています。 MATLAB/Octaveですべてを書き直すことができます。それをコンパイルしてmex/octとして使用することができます – rahnema1