ピッチは、ある瞬間(短時間)の音量の周波数成分から解析する。
音階は、440Hzを基準の「ラ」として、周波数が2倍になる毎に1オクターブずつ上昇し、同じ「ラ」(1オクターブ上の「ラ」は880Hz)となる。
1オクターブを12等分した十二
平均律(ド・ド#・レ・レ#・ミ・ファ・ファ#・ソ・ソ#・ラ・ラ#・シ)では、隣り合う音階(全音+半音)は、周波数比が2^(1/12)倍になっている。
タイムストレッチは音程を保ったまま再生速度を変える処理、 ピッチシフトは再生速度を保ったまま音程を変える処理のこと。
一般に、再生速度を変更すると音程も変化してしまい、再生速度を速めれば音程が高く、遅めれば低くなる。
再生速度を2倍にすると、音の波形の波長は0.5倍となり、周波数が2倍となるため、音程は1オクターブだけ高くなる。
再生速度を0.5倍にすると、音の波形の波長は2倍となり、周波数が0.5倍となるため、音程は1オクターブだけ低くなる。
逆に、音程を変更すると再生速度や再生時間も変化してしまう。
単純に音の波形を拡大、縮小すると再生速度と音程が両方変わってしまうため、再生速度と音程を別々に変更するには 特殊な処理をする必要がある。
タイムストレッチ、ピッチシフトのアルゴリズムには、FFTを用いる手法やクロスフェードを利用する手法などがある。
- クロスフェードによるタイムストレッチとピッチシフトのアルゴリズム
(タイムストレッチ)
タイムストレッチでは、タイムレングス(波形の全長)を変更することで、再生速度を変更することが可能。
再生速度を2倍にするには、音の波形を小さなブロックに分割し、ブロックを1つおきに配置し、ブロック総数を0.5倍にする。
再生速度を0.5倍にするには、コピー元の位置を0.5ブロックずつずらしながら、重複分が隣接するように配置し、ブロック総数を2倍にする。
低い音は周波数が低く、波長が長いため、ブロックのサイズをある程度大きくする必要がある。
ブロックを大きくしすぎるとスムーズに聞こえなくなるため、50msec程度がよい。
コピー元の位置をずらす量を0.9倍、1.1倍などにすれば、 再生速度を0.9倍、1.1倍にすることも可能。
(クロスフェード)
波形を切り貼りする方法では、ブロックの境界で波形が不連続なため、再生するとプツプツという雑音が聞こえる。
この雑音を抑えるため、各ブロックにフェードイン・フェードアウトをかけ、前のブロックのフェードアウトと次のブロックのフェードインを重ねる。
(区切り位置の探索)
クロスフェードをかけることでプツプツ音を抑えることができるものの、 波形が重なる部分に位相差があると打ち消しあって音量が小さくなる。
フェードイン・フェードアウトのカーブを直線ではなくSin波にしたり、ブロックの区切り位置をゼロクロス点にすることで位相をそろえ、音量の変化を抑制する。
2乗誤差や自己相関を求め、波形が似通っている箇所を検索して位相をそろえる方法もある。
(ピッチシフト)
ピッチシフトでは、タイムストレッチに単純な波形の拡大・縮小を組み合わせることで、再生速度を保ったまま音程を変更することが可能。
ピッチを2倍にする(音程を1オクターブ上げる)には、再生速度を0.5倍(タイムレングスを2倍)にしてから、波形を単純に0.5倍に縮小する。
ピッチを0.5倍にする(音程を1オクターブ下げる)には、再生速度を2倍(タイムレングスを0.5倍)にしてから、波形を単純に2倍に拡大する。
一般的に、再生速度をv倍、ピッチをp倍したい時は、 タイムストレッチのアルゴリズムで再生速度をv/p倍(タイムレングスをp/v倍)してから、 波形を単純に1/p倍に拡大・縮小する。
参考サイト:
http://ackiesound.ifdef.jp/tech/timestretch.html
テンポは、音量増加量の時間方向の周波数成分から解析する。
音量は音が鳴り始める時に、主に拍の頭で増加する。
(例えば120BPMの曲であれば1分間に120回の割合で増加し、 音量増加量の時間方向の周波数成分を求めると120/60=2Hzの成分が検出される)
①音声のスペクトルから音量が増加している部分のみを取り出し、音量増加量を求める。
②音量増加量の時間方向の周波数成分を求める。
②多くの場合では、最も大きい周波数成分が、正しいテンポか、または正しいテンポの2倍=×2または0.5倍=×1/2になっている。
(正しいテンポの 0.75倍=×3/4、1.25倍=×5/4、1.5倍=×3/2の成分が突出していることもある)
参考サイト:
http://ackiesound.ifdef.jp/tech/tempo.html
最終更新:2010年04月19日 01:54