矩形波のピッチシフト2006年10月17日 23:12

矩形波のピッチシフト
 http://cessna373.asablo.jp/blog/2006/10/08/553245
より、
 > タイムストレッチ等の機能を評価するにも使われているようです。
ということで、矩形波でピッチシフトを試してみました。

上の絵は 100Hz の矩形波(上)に対して、汎用/中品質設定で 4/5 倍のピッチシフトを行ったもの(下)です。
なるほど、確かに波形の歪みがよく分かります。これが正弦波や三角波だと、ここまで顕著な歪みは出ません。
一方、基本周波数はきちんと 4/5 倍になっていることも分かります。

Audio timescale-pitch modification2006年09月14日 21:33

Wikipedia にタイムストレッチ、ピッチシフトの情報がありました。
 http://en.wikipedia.org/wiki/Audio_timescale-pitch_modification

今までここで紹介したサイトもリンクされているようです。
情報を集めるのに苦労していましたが、ここを最初にチェックすればよかったですね。

タイムストレッチとピッチシフトの関係2006年09月11日 23:27

タイムストレッチとピッチシフトはいわば双対関係にあり、一方が実現できれば他方も簡単に実現することができます。
RH1FFT では
 http://www.dspdimension.com/data/html/download.html
のソースコードを利用してピッチシフトを実現し、既存の再生速度変更機能と組み合わせてタイムストレッチも実現しています。

しかし文献を見る限りでは、最初にタイムストレッチを実現し、それを利用してピッチシフトも実現するという流れのものが多いようです。
フリーのオープンソースライブラリの一つ SoundTouch
 http://www.surina.net/soundtouch/
でもそうなっていますが、このライブラリではタイムストレッチに周波数領域ではなく時間領域で処理を行う方式が使用されているようです。

実際に試していないのでどの程度の品質かは分かりませんが、タイムストレッチのみを行う場合は、直接タイムストレッチを行う方が少なくとも処理効率の面では有利です。
RH1 FFT でも可能であれば試してみたいと思います。

ステレオデータのタイムストレッチとピッチシフト2006年09月09日 03:01

タイムストレッチやピッチシフトというのはかなり無理矢理な操作であり、元の音声を歪めてしまいます。
そのためにステレオデータの左右のチャンネルを別々に処理した場合、左右の位相情報が崩れてしまって品質が落ちるという問題があるようです。
詳しくは見ていないのですが、それに対応する方法もいろいろとあるみたいです。

RH1FFT ではそのような問題には対応しておらず、単純に左右のチャンネルを別々に処理しています。

再生速度と音程を独立に変更する方法 (5)2006年08月26日 21:06

進展があったので
 http://cessna373.asablo.jp/blog/2006/08/15/484980
の続報をお伝えします。

前にも紹介したサイトの
 http://www.dspdimension.com/data/html/download.html
でダウンロードできるソースコードを利用して、ピッチシフトを実現することができました。
このソースコードは The Wide Open License
 http://www.dspguru.com/wol.htm
で自由に使用・改変できるようです。多謝。

これと現在 RH1 FFT にある再生速度変更機能を組み合わせると、音程を変化させずに再生速度だけ変更することも可能になります。
この機能は次バージョンに組み込まれます。

再生速度と音程を独立に変更する方法 (4)2006年08月15日 22:54

 http://cessna373.asablo.jp/blog/2006/08/14/482731
の続きというか補足です。

音程を変化させる方法としてまず思いつくのが FFT --> 周波数領域でデータをずらす --> IFFT というものではないでしょうか。
私も最初にこれを考えましたし、調べているときもこれでコケて質問している人をたびたび見かけました。

これでダメな理由を 100% クリアに説明することは私にはできません。
基本的には 「重要なのは位相であり、それを上手く調節してやらなければならない」 ということのようです。
考えてみれば正弦波を重ね合わせるだけで無音に近い状態も表現できるわけで、それには位相をうまく合わせて打ち消しあうようにしなければならないというのは直感的に分かります。

では実際に FFT --> 周波数領域でデータをずらす --> IFFT を行うとどうなるのでしょうか。
周波数領域で(データを間引いて)単純に一オクターブ分低くして上半分を 0 で埋めた場合、確かに音程は低くなるのですが再生速度も半分になります。
つまり時間領域でデータを補間して再生速度を下げるのと同じ結果になります。
(データ量が同じで再生速度が遅くなるわけですから、音声が途中で途切れます)
要するに周波数領域でちょっといじるだけでは本質的には何も変わらないということですね。

再生速度と音程を独立に変更する方法 (3)2006年08月13日 23:56

引き続き
 http://cessna373.asablo.jp/blog/2006/08/11/480789
の続報です。

上の記事でも紹介したサイトにある以下のページは分かりやすくまとまっていると思います。
 http://www.dspdimension.com/data/html/timepitch.html

これによると、再生速度変更には Phase Vocoder 方式と Time Domain Harmonic Scaling 方式があります。
前者は短い間隔で FFT を繰り返し、位相の時間変化率を保持したままデータを補間する(あるいは間引く)方法です。
後者は基本周波数に基づいて、時間領域でデータを補間する(あるいは間引く)方法です。
 http://cessna373.asablo.jp/blog/2006/08/03/471112
で説明されているものは後者にあたります。

いずれも単純な方法では高品質な結果は得られないようです。
Phase Vocoder 方式は、smearing と呼ばれる音が鈍るようなサイドエフェクトが発生します。
Time Domain Harmonic Scaling 方式は、単音でないとうまく処理できません。
また再生速度の変更量が大きい場合は前者、小さい場合は後者の方がいい結果が得られるようです。

改良する方法もいろいろ提案されているようで、たとえば Phase Vocoder 方式では以下のようなものが見つかりました。
 http://www.ee.columbia.edu/~dpwe/papers/LaroD99-pvoc.pdf
 http://www.elec.qmul.ac.uk/people/juan/Documents/Ravelli-DAFx-2005.pdf

音程変更も再生速度変更と本質的には同じですが、formant 周波数を保持するなどという新たなトピックがあるみたいです。

RH1 FFT では、実装するにしてもあまり凝ったことはできそうにありません。
まずは単純な処理でどの程度のことができるか試してみることにします。

再生速度と音程を独立に変更する方法 (2)2006年08月11日 22:57

 http://cessna373.asablo.jp/blog/2006/08/09/478693
の続報です。

継続して調べていますが、これぞというのはまだありません。
キーワードは vocoder, time stretching/time scaling, pitch shifting/pitch transposition あたりでしょうか。

オープンソースのものもあるようなので、最終的にはこれらのソースを調べれば分かるのかもしれません。
 http://www.csounds.com/
 http://ccrma.stanford.edu/software/stk/index.html

以下のページには理論からソースコードまで載っていて期待できそうです。
 http://www.dspdimension.com/data/index.html

こんな本もあるようですが \17,000 超…。
 http://www.amazon.co.jp/gp/product/0471490784
 http://www2.hsu-hh.de/ant/dafx2002/DAFX_Book_Page/chapter8.html

再生速度と音程を独立に変更する方法2006年08月09日 22:59

現在の RH1 FFT の再生速度変更機能は、単純にデータを時間方向に伸縮しているだけなので、音程も変わってしまいます。
 http://cessna373.asablo.jp/blog/2006/08/03/471112
にも書かれているとおり、再生速度と音程を独立に変更する機能が望まれるところです。

これについて今のところ見つかった資料でよさそうなのは以下のものです。
 http://www.panix.com/~jens/pvoc-dolson.par
後ろの方に time scaling と pitch transposition という表現で記述されています。
まだ全部読んでいませんが、もし可能なようであれば実装してみたいと思います。

これ以外にも参考になる資料があればお知らせください。
日本語で詳しく書かれているのがあればいいんですが。