(57)【特許請求の範囲】
【請求項１】
入力信号の波形のエンベロープを抽出する抽出手段と、
該入力信号を平坦化する平坦化手段と、
タイムストレッチする量を指示する指示手段と、
該平坦化手段で平坦化した入力信号をフィルタを用いて複数の帯域に分割し各帯域の信号を振幅成分と周波数成分に変換してその時間変化の速度を該指示手段で指示した指示量に基づき変えた後に再合成することで該平坦化した入力信号をタイムストレッチする第１のタイムストレッチ手段と、
該抽出手段で抽出したエンベロープを該指示手段で指示した指示量に基づきタイムストレッチする第２のタイムストレッチ手段と、
該第１のタイムストレッチ手段でタイムストレッチした該平坦化した入力信号にそのエンベロープとして該第２のタイムストレッチ手段でタイムストレッチしたエンベロープを施すエンベロープ付加手段と
を備えたタイムストレッチ装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、フレーズ等の一連の音の列に対してそのテンポ等をピッチとは独立に変えることができるタイムストレッチ装置に関する。
かかるタイムストレッチ装置は電子楽器などに搭載して利用することができる。
【０００２】
ある自然なひと区切りのメロディ・ラインなどの一連の音列をフレーズ（楽句、楽節などともいう）と称しているが、電子楽器において、あるフレーズのテンポを変化させるには、最も単純な方法では、そのフレーズのデータをメモリに蓄えておいてその読出し速度を変化させることで実現できる。しかし、この方法では、テンポ（すなわち読出し速度）を変化させると、それに伴ってピッチも変化してしまう。
【０００３】
そこで、ピッチを変えずにテンポを変える方法が幾つか提案されており、例えば無音区間を検出しその区間の長さを調整してピッチを変えずにテンポを変化させる方法、あるいは台形窓を使ってフレーズから波形を切り出す方法などがある。
【０００４】
ところが、無音区間による方法では、無音区間がない若しくは少ないフレーズでは、調整に限界がある。また台形窓による方法では、台形窓のエンベロープが雑音として聴こえてしまい、十分満足できるものとは言えない。
【０００５】
さらに、入力信号を複数の帯域に分割した後に、その各帯域についてその振幅と位相変化量（ピッチ）を検出し、その振幅データを用いてテンポ変化を実現し、位相変化量を調節することによりピッチ変化を実現する方法がある。
【０００６】
図１３にはこの方法によりタイムストレッチ（時間の圧縮／伸張、すなわちテンポの調整に相当）を行う装置の構成例が示される。図示するように、入力信号を、通過帯域のそれぞれ異なる例えば１００個の帯域フィルタを用いて、図１４に示すような１００の帯域（バンド）Ｂａｎｄ０〜Ｂａｎｄ９９に分割し、その分割した各帯域の信号についてその振幅成分と周波数成分（ピッチ成分）とを抽出し、それら各帯域の振幅成分の時間変化の速度と周波数成分の時間変化の速度とをテンポ変化指示量に応じてそれぞれ変えることにより、これら振幅成分と周波数成分の時間軸をそれぞれ例えば図１５に示すように圧縮／伸張し、その後に各帯域の振幅成分と周波数成分を合成することで、元の入力信号をタイムストレッチして出力するものである。ここで、図１５（Ａ）は元の信号（振幅成分と周波数成分）の波形、図１５（Ｂ）は時間軸を伸張した後の信号（振幅成分と周波数成分）の波形である。
【０００７】
この方法の原理は、各帯域の信号は、帯域フィルタの数を十分多くすることで、帯域幅（よって帯域内での周波数変化幅）を十分小さくでき、よって時間軸を圧縮／伸張しても周波数成分は殆ど変化がないと見なすことができるので、振幅成分をその振幅値を変えずに時間軸を圧縮／伸張してもピッチが変わらないというものである。
【０００８】
【発明が解決しようとする課題】
従来の帯域分割によるタイムストレッチ方法では、リズム音などのような急峻な変化（アタック部分など）がある楽音信号が入力されると、用いているフィルタの影響で、そのアタック部分の前部分にプリエコーと呼ばれるノイズが発生して、アタック部分が鈍った音になってしまい、音楽性に欠けるものになってしまうという問題点がある。これは、帯域を分割するフィルタのタップ数（フィルタの次数）が多いと生じる現象であり、タップ数を減らすことで、この鈍り具合を低減することができる。
【０００９】
一方、フィルタはそのタップ数を減らせば減らすほど、その帯域幅が広くなってしまう性質を持っており、結局、タップ数を減らすと入力信号を帯域分割する分割数を少なくせざるを得なくなる。このように分割数が少なくなった場合、倍音構造が重要な音（主にメロディに使用される音）では、その倍音構造がきちんと再現されなくなり、やはり音楽性に欠けたものとなってしまう。
【００１０】
このように、従来の帯域分割によるタイムストレッチ方法では、フィルタのタップ数とそれらフィルタによる帯域分割数とは、タイムストレッチした楽音の音楽性を保つという観点からはトレードオフの関係にあり、リズム系の楽音とメロディ系の楽音の何れをも音楽的に満足できるようにタイムストレッチすることは容易ではなかった。
【００１１】
本発明はかかる問題点に鑑みてなされたものであり、リズム系やメロディ系などのような楽音の種々のタイプに対応して、音楽性を損なうことなく入力信号をタイムストレッチできるようにすることを目的とする。
【００１２】
【課題を解決するための手段】
上述の課題を解決するために、本発明に係るタイムストレッチ装置は、入力信号の波形のエンベロープを抽出する抽出手段と、該入力信号を平坦化する平坦化手段と、タイムストレッチする量を指示する指示手段と、該平坦化手段で平坦化した入力信号をフィルタを用いて複数の帯域に分割し各帯域の信号を振幅成分と周波数成分に変換してその時間変化の速度（例えばテンポなど）を該指示手段で指示した指示量に基づき変えた後に再合成することで該平坦化した入力信号をタイムストレッチする第１のタイムストレッチ手段と、該抽出手段で抽出したエンベロープを該指示手段で指示した指示量に基づきタイムストレッチする第２のタイムストレッチ手段と、該第１のタイムストレッチ手段でタイムストレッチした該平坦化した入力信号にそのエンベロープとして該第２のタイムストレッチ手段でタイムストレッチしたエンベロープを施すエンベロープ付加手段とを備える。
なお、上述の平坦化手段は、該抽出手段で抽出したエンベロープのサンプル値でのエンベロープのサンプル値に対応する入力信号のサンプル値を除することで入力信号を平坦化するように構成することができる。
【００１３】
【作用】
抽出手段で入力信号の波形のエンベロープを抽出し、その後に平坦化手段により入力信号を平坦化する。この平坦化した入力信号を第１のタイムストレッチ手段によりタイムストレッチするのであるが、入力信号が平坦化されているため、元の入力信号が例えばリスム音系や減衰音系などのアタック部分が急峻なものであっても、また倍音構造が重要となるメロディ音系のものであっても、それら入力信号のタイプに関わりなく、好ましい帯域の分割数とフィルタのタップ数を選んで、タイムストレッチすることができる。このタイムストレッチ後の平坦化された入力信号に、第２のタイムストレッチ手段でタイムストレッチしたエンベロープを施せば、元の入力信号をタイムストレッチしたと同等の出力信号を得ることができる。この場合、第２のタイムストレッチ手段は、フィルタの帯域分割等を行っていないので、エンベロープが急峻であっても、また倍音構造が重要なものであっても問題はない。
このようにすれば、リズム音系の入力信号もそのアタック部分などが鈍ることがなくなり、またメロディ音系の入力信号でもその倍音構造がきちんと再現されるようになる。これにより、いずれのタイプの入力信号に対しても音楽性を損なうことなくタイムストレッチすることが可能となる。
【００１４】
【発明の実施の形態】
以下、図面を参照して本発明の実施の形態を説明する。
図１には本発明に係る一実施例としてのタイムストレッチ装置の構成が示される。かかるタイムストレッチ装置は例えばサンプラや電子楽器などに搭載することができる。図１において、ＣＰＵ１は装置の全体的な制御を司る中央処理装置、ＲＯＭ２は制御プログラムや各種データのテーブル等を格納しているリード・オンリー・メモリ、ＲＡＭ３は作業用のメモリエリアなどとして利用されるランダム・アクセス・メモリ、操作子群４は各種スイッチ類からなるもの、表示器５はパラメータの選択等の際にパラメータを画面表示するなどに用いる液晶表示器である。ハードディスク駆動装置６、ＣＤ−ＲＯＭ駆動装置７は外部記憶装置をなすものである。また、Ａ／Ｄ変換器８はアナログ入力信号をディジタル信号に変換して入力するためのもの、Ｄ／Ａ変換器９は装置内で処理したディジタル信号をアナログ出力信号に変換して出力するためのものである。
【００１５】
ここで、この波形変換装置において、分析にかける入力信号（入力データ）は一連の音の列からなるフレーズの波形を逐次にサンプリングしたサンプル値（振幅値）である。ここではこの入力データの元来のサンプリング周波数（あるいはシステムのサンプリング周波数ともいう）をｆsoとする。さらに、この入力データはＡ／Ｄ変換器８や外部記憶装置（ハードディスク駆動装置６、ＣＤ−ＲＯＭ駆動装置７）から入力されてＲＡＭ３に転送される。この入力データはＲＡＭ３から一旦読み出されてＣＰＵ１の制御下に分析され、その分析されたデータはＲＡＭ３に再び格納され、その後にハードディスク駆動装置６などに転送される。
【００１６】
図２には、表示器５の画面に表示される入力信号のタイプ設定画面が示される。図示するように、入力信号する楽音のタイプとして、リズム音系の「リズミック」とメロディ音系の「メロディック」の二種類のうちの何れかをユーザがカーソルキー等の操作子を用いて指定することが可能である。この実施例装置では、入力信号タイプ指示フラグＴＹＰＥを有しており、「リズミック」が指定されたときにはこの入力信号タイプ指示フラグＴＹＰＥが「１」に、「メロディック」が指定された場合には「０」に設定される。また、「リズミック」が指定されたときには、後述する変数であるオクターブ内分割数Ｍと間引き数ＤＥＣＩがそれぞれ「４」に設定される。一方、「メロディック」が指定されたときにはそれら２つの変数は「８」に設定される。
【００１７】
以下、図面を参照して実施例装置の動作を説明する。
まず、入力信号の分析処理の手順を図４、図５に示すフローチャートを用いて説明する。この入力信号の分析処理は、入力信号のエンベロープを検出して保存するとともに入力信号に急峻な部分（例えばアタック部分）がなくなるようにその振幅を平坦化し、その後に、平坦化した入力信号を複数の帯域に分割して、各帯域の信号をそれぞれその振幅成分と周波数成分に変換するものである。
【００１８】
図３にはこの実施例における帯域分割の概念が示される。ここで、システムのサンプリング周波数をｆsoとすると、入力信号の周波数は角周波数ωで表示されており、角周波数ω＝πは周波数換算でｆso／２に相当している。ここで、ωがπ〜π／２の区間が第１オクターブ、π／２〜π／４の区間が第２オクターブ、π／４〜π／８の区間が第３オクターブ・・・というようにして、第１０オクターブまでオクターブ単位で分割されている。ここではこれらの各帯域をオクターブ帯域と称することにする。いずれの番号のオクターブ帯域であるかはオクターブ数カウンタｏｃｔによって識別される。さらに各オクターブ帯域のなかは、オクターブ内分割数Ｍで等分に分割されており、これら分割された各帯域（以下、オクターブ内分割帯域と称することにする）はオクターブ内分割数カウンタｍによって識別される。ここで、オクターブ内分割数Ｍは、本実施例では前述したとおり、入力信号のタイプが「リズミック」の場合には「４」、「メロディック」の場合には「８」となる。図３に示した例は前者の「リズミック」の場合のものである。
【００１９】
分析処理においては、まず、入力信号ｉｎ（ｉ）のエンベロープ検出とその平坦化を行う（ステップＳ１）。図６にはこのエンベロープ検出および平坦化の詳細な手順が示される。図６のエンベロープ検出および平坦化の処理において、ｉは入力信号（例えば図１０に示すもの）のサンプル値の時間軸上での順序を示すカウンタであり、ｃｕｒはエンベロープ検出処理を行うためのカレント（現）振幅値である。また、ｅｎｖ（ｉ）は入力信号ｉｎ（ｉ）から検出されたエンベロープ（包絡線）値である。さらにＲＥＬＥＡＳはリリースパラメータ（リリース係数）、ＡＴＴＡＣＫはアタックパラメータ（アタック係数）、ＬＥＮはデータ長（分析対象のフレーズの長さ）である。
【００２０】
図６において、まず、カウンタｉ＝０、カレント振幅値ｃｕｒ＝０に設定し（ステップＳ２１）、このカレント振幅値ｃｕｒを入力信号ｉｎ（ｉ）の絶対値と比較する。すなわち、
｜ｉｎ（ｉ）｜＞ｃｕｒ
かを判断する。入力信号ｉｎ（ｉ）の絶対値のほうがカレント振幅値ｃｕｒよりも大きい場合には、現在の入力信号のエンベロープ部分は急峻に立ち上がっているからアタック部分のものと推定することができ、この場合、カレント振幅値ｃｕｒを以下の計算式
ｃｕｒ＝ｃｕｒ＋（｜ｉｎ（ｉ）｜−ｃｕｒ）＊ＡＴＴＡＣＫ
（但し、「＊」の印は掛け算を表すものとする。以下同じ）
により、アタック係数ＡＴＴＡＣＫに従って増加するように更新する（ステップＳ２４）。
【００２１】
一方、入力信号ｉｎ（ｉ）の絶対値がカレント振幅値ｃｕｒ以下の場合には、現在の入力信号のエンベロープ部分は緩やかに立ち下がっているからリリース部分のものと推定することができ、この場合、カレント振幅値ｃｕｒを以下の計算式
ｃｕｒ＝ｃｕｒ＋（｜ｉｎ（ｉ）｜−ｃｕｒ）＊ＲＥＬＥＡＳＥ
により、リリース係数ＲＥＬＥＡＳＥに従って減少するように更新する（ステップＳ２４）。
なお、このアタック係数ＡＴＴＡＣＫおよびリリース係数ＲＥＬＥＡＳＥは予め別のモードにおいてユーザにより設定されているものである。
【００２２】
この後、更新したカレント振幅値ｃｕｒを入力信号ｉｎ（ｉ）のエンベロープ値ｅｎｖ（ｉ）とし（ステップＳ２５）、バッファ（メモリ）に格納する。すなわち、
ｅｎｖ（ｉ）＝ｃｕｒ
とする。
【００２３】
次いで、入力信号ｉｎ（ｉ）の平坦化を行う。これは、入力信号ｉｎ（ｉ）をカレント振幅値ｃｕｒ（したがってエンベロープ値）で割算することで実現する（ステップＳ２７）。これにより、原理的には入力信号ｉｎ（ｉ）は「１」となるが、実際にはカレント振幅値ｃｕｒは正確なエンベロープの値を必ずしも表していないため「１」に近い値となる。なお、カレント振幅値ｃｕｒが０と判定された場合には（ステップＳ２６）、ステップＳ２７の除算はできないので、この場合にはステップＳ２７を飛ばす。
【００２４】
次いで、入力信号ｉｎ（ｉ）の時間軸上の位置を更新するために、カウンタｉを一つインクリメントする（ステップＳ２８）。すなわち、
ｉ＝ｉ＋１
とし、この更新したカウンタｉがデータ長ＬＥＮを超えるまで、同じ処理を繰り返す（ステップＳ２９）。これによりエンベロープ値格納用のバッファに１フレーズ分の入力信号のエンベロープを格納することができる。
【００２５】
ここで、図１０は上述のエンベロープ検出処理により入力信号の波形から抽出したエンベロープを示すものであり、図１１はエンベロープを抽出した後の入力信号を、抽出したエンベロープで平坦化した信号の波形を示す。
【００２６】
図４の分析処理のフローに戻り、このエンベロープ検出およびエンベロープの平坦化が終了したら（ステップＳ１）、各種変数の初期化を行う。すなわち、オクターブ数カウンタｏｃｔを「１」に、オクターブ内分割数カウンタｍを「０」に、間引きカウンタｄを「０」に設定する（ステップＳ２）。すなわち、
ｏｃｔ＝１
ｍ＝０
ｄ＝０
とする。
【００２７】
次いで、オクターブ数カウンタｏｃｔが「１」か否かを判定し（ステップＳ３）、それによりダウンサンプリングを行うか否かを決める。このダウンサンプリングは、入力信号ｉｎをオクターブ単位で分割した各オクターブ帯域毎にサンプリング周波数ｆs を変化させるものである。具体的には入力信号の低域成分に対してはサンプリング周波数ｆs を低くするものである。これにより処理データ量の削減などの効果を得ることができる。この実施例では、オクターブ数カウンタｏｃｔが「１」を超えたら、ダウンサンプリングを行ってそのオクターブ番号（ｏｃｔ）のオクターブ帯域についてサンプリング周波数を半分にする（ステップＳ４）。つまり、図３において、第１オクターブについては元のサンプリング周波数ｆsoを用いるが、第２オクターブ以降はオクターブ数カウンタｏｃｔが増加する毎にサンプリング周波数ｆs を半分にしていくことになる。このダウンサンプリングの処理は、具体的には入力信号を遮断周波数がπ／２の特性を持つ低域フィルタに通過させた後に１サンプル間引きをすることで、サンプリングレートを半分にするものである。
【００２８】
次いで、ステップＳ５〜Ｓ１３では、現在のオクターブ帯域（オクターブ数カウンタｏｃｔで示されるオクターブ帯域）をオクターブ内分割数Ｍで分割した複数のオクターブ内分割帯域について、間引き変数ＤＥＣＩで示される数（ＤＥＣＩ−１）のサンプル値ずつ入力信号のデータを間引きつつ（つまり、時間軸上で（ＤＥＣＩ−１）置きに入力信号のデータを取り出して）、回転とフィルタリング処理を施してその振幅成分と周波数成分（ピッチ成分）に変換して、得たデータを、それぞれ対応する帯域のバンクメモリ（ｂａｎｋ）に保存するものである。
【００２９】
ここで、バンクメモリは各オクターブ帯域の各オクターブ内分割帯域にそれぞれ対応して設けられているものであり、第１オクターブのｍ＝０のオクターブ内分割帯域に対応するバンクをバンク番号ｂａｎｋ＝０として以下順に並んだオクターブ内分割帯域に対応してバンク番号が付けられるものであり、その最大数ＭＡＸ−ＢＡＮＫは、〔Ｍ＊（ＭＡＸ−ＯＣＴ）−１〕となる。但し、ＭＡＣ−ＯＣＴはオクターブ数ｏｃｔの最大値である。
【００３０】
まず、回転処理（ステップＳ５）では以下の処理を行う。すなわち、入力信号に対して複素数ｅ-jA 、〔但し、Ａ＝π／２＋（２ｍ＋１）π／４Ｍ〕、をかけることにより、π／２＋（ｍ＋１）π／２Ｍ〜π／２＋ｍπ／２Ｍの帯域を、−π／２Ｍ〜π／２Ｍに移動させる。
ここで、オクターブ内分割数カウンタｍは０〜（Ｍ−１）の値をとり、Ｍはオクターブ内分割数であり、ユーザが入力信号のタイプとして「メロディック」または「リズミック」のいずれを選択するかでその値が決まる。
【００３１】
また、フィルタリング処理は、回転処理によって帯域をシフトさせた信号を低域通過フィルタに通すことに実現する（ステップＳ５）。この低域通過フィルタは、ユーザにより指定された入力信号のタイプが「メロディック」であり、従ってオクターブ内分割数Ｍ＝８の時には、遮断周波数がπ／１６で阻止利得が−５０dBの低域通過フィルタが用いられる。一方、ユーザにより指定された入力信号のタイプが「リズミック」であり、従ってオクターブ内分割数Ｍ＝４の時には、遮断周波数がπ／８で阻止利得が−１００dBの低域通過フィルタが用いられる。ここで、「メロディック」の遮断周波数がπ／１６で阻止利得が−５０dBの低域通過フィルタは、そのタップ数が、「リズミック」の遮断周波数がπ／８で阻止利得が−１００dBの低域通過フィルタよりも多くなっている関係にある。
【００３２】
このフィルタリング処理を行った入力信号を振幅成分とピッチ成分に変換する（ステップＳ６）。詳細には、回転・フィルタリング処理後の入力信号の実部Ｒ（ｔ）と虚部Ｉ（ｔ）を、次式に従って振幅成分とピッチ成分に変換するものである。すなわち、入力信号を
Ｒ（ｔ）＋ｊＩ（ｔ）
とすると、振幅ｐｏｗｅｒ（ｔ）は、
ｐｏｗｅｒ（ｔ）＝〔Ｒ（ｔ）2 ＋Ｉ（ｔ）2 〕1/2 
で求める。一方、周波数成分であるピッチｐｉｔｃｈ（ｔ）は、
ｐｉｔｃｈ（ｔ）＝［［Ｉ（ｔ）｛Ｒ（ｔ−１）−Ｒ（ｔ）｝−Ｒ（ｔ）｛Ｉ（ｔ−１）−Ｉ（ｔ）｝］／｛Ｒ（ｔ）2 ＋Ｉ（ｔ）2 ｝＋π／２＋（２ｍ＋１）π／４Ｍ］＊２oct-1 
で求める。
【００３３】
次いで、入力信号データの間引きをステップＳ７〜Ｓ１１で行う。これは、入力信号のサンブル値を（ＤＥＣＩ−１）個ずつ間引いて保存（つまり、（ＤＥＣＩ−１）おきに一つずつ保存）するものであり、これにより保存するデータの量を削減している。
【００３４】
まず、間引きカウンタｄの値が「０」かを判定し（ステップＳ７）、「０」であれば、ステップＳ６で求めた振幅ｐｏｗｅｒ（ｔ）とピッチｐｉｔｃｈ（ｔ）をデータとして現在の泰一に該当するバンク（ｂａｎｋ）に格納する（ステップＳ８）。「０」でなければ、間引きカウンタｄの値を一つインクリメントし（ステップＳ９）、その間引きカウンタｄが（間引き数ＤＥＣＩ−１）に達したかを判定し（ステップＳ１０）、達していれば、間引きカウンタｄを「０」にクリアする（ステップＳ１１）。（ＤＥＣＩ−１）に達していなければ、オクターブ内分割数カウンタｍを一つ更新し（ステップＳ１２）、このオクターブ内分割数カウンタｍがオクターブ内分割数Ｍに達するまで（ステップＳ１３）、ステップＳ５からステップＳ１２までの処理を繰り返す。これにより、各オクターブ内分割帯域について入力信号データが時間軸上で（ＤＥＣＩ−１）個ずつ間引かれて、それぞれの帯域に対応するバンクに格納されることになる。
【００３５】
オクターブ内の分割数Ｍだけ処理を終えたならば（ステップＳ１３）、次には、オクターブ数カウンタｏｃｔを一つ更新するとともに、オクターブ内分割数カウンタｍを「０」にクリアして（ステップＳ１４）、オクターブ数カウンタｏｃｔがオクターブ数ＭＡＸ−ＯＣＴ（ユーザが任意に指定可能であり、本実施例では１０）に達するまで（ステップＳ１５）、上述のステップＳ３〜Ｓ１４を繰り返し、指定分のオクターブ数ＭＡＣ−ＯＣＴの数だけ処理を終了したら、本フローを終える。
【００３６】
次に、上述の分析処理で帯域分割した各信号を再合成する処理を図７および図８のフローチャートを参照して説明する。この図７および図８のフローチャートは再合成処理の手順を示すものであり、この再合成処理は、概略的に述べると、各帯域毎に分割した信号について、その振幅成分とピッチ成分の時間軸を、ユーザが指定した量だけタイムストレッチ（圧縮／伸長）したうえで、それら全部を足し合わすことで再合成し、さらにその再合成した信号（平坦化した信号）に、先の分析処理で抽出したエンベロープを上記同様ユーザが指定した量だけタイムストレッチして施して（すなわち復元して）、元の入力信号の時間軸をタイムストレッチした出力信号を生成するものである。
【００３７】
合成処理が開始されると、まずバンク番号カウンタｂａｎｋを「０」にクリアする（ステップＳ３０）。次いで、サンプリング比ｒａｔｅを、
ｒａｔｅ＝その帯域のサンプリング周波数ｆs ／システムのサンプリング周波数ｆso
により求める（ステップＳ３１）。ここで、上記「その帯域のサンプリング周波数ｆs 」はダウンサンプリングがされているときにはそのダウンサンプリングされたサンプリング周波数ｆs である。
【００３８】
次いで、データカウンタｃｎｔを「０」にクリアする（ステップＳ３２）。次いで、タイムストレッチした出力信号（つまり最終的に得られる出力信号）の時間軸上の位置を示す変数ｐｔｒにダウンサンプリングおよび帯域通過処理によって発生した群遅延の量を入れる（ステップＳ３３）。
【００３９】
さらに、周波数変調に使うｐcos 、ｐsin に初期値を入れる（ステップＳ３４）。すなわち、
ｐcos ＝ｐｃ＝cos （ｐｉｔｃｈ〔ｂａｎｋ〕〔０〕）
ｐsin ＝ｐｓ＝sin （ｐｉｔｃｈ〔ｂａｎｋ〕〔０〕）
とする。
なおここで、ｐｉｔｃｈ〔ｂａｎｋ〕〔ｎ〕の表示は、バンク番号ｂａｎｋのバンクメモリに格納されている時系列のピッチデータのうちから時間番号がｎ番目のデータを読み出すことを意味する。振幅データｐｏｗｅｒ〔ｂａｎｋ〕〔ｎ〕についても同様である。
【００４０】
次いで、変数ｐｔｒの整数部を整数部ｎに、また変数ｐｔｒの小数部を小数部ｘにそれぞれ入れる（ステップＳ３５）。
【００４１】
この後、変数ｐｔｒの現在の値に応じて信号の時間軸をタイムストレッチするために、まず、ステップＳ３６〜Ｓ４０でデータの補間、補外などの処理を行う。すなわち、変数ｐｔｒの整数部ｎが「０」より大きいかを調べ（ステップＳ３６）、「０」以下であれば、振幅ワークバッファｐｗに「０」、周波数ワークバッファｐｔに「０」をそれぞれ入れる（ステップＳ３７）。一方、整数部ｎが「０」よりも大きければ、その整数部ｎがデータ長ＬＥＮを超えていないかを調べる（ステップＳ３８）。超えていなければデータを直線補間する処理を行い（ステップＳ３９）、データ長ＬＥＮに達していればデータを直線補外する処理を行う（ステップＳ４０）。
【００４２】
ここで、ステップＳ３９のデータの直線補間処理は、左右のデータ〔（ｎ＋１）点目とｎ点目のデータ〕からその間のデータを生成して補う処理であり、具体的には、次の計算式
ｐｗ＝（ｐｏｗｅｒ〔ｂａｎｋ〕〔ｎ＋１〕−ｐｏｗｅｒ〔ｂａｎｋ〕〔ｎ〕）×ｘ＋ｐｏｗｅｒ〔ｂａｎｋ〕〔ｎ〕）
ｐｔ＝（ｐｉｔｃｈ〔ｂａｎｋ〕〔ｎ＋１〕−ｐｉｔｃｈ〔ｂａｎｋ〕〔ｎ〕）×ｘ＋ｐｉｔｃｈ〔ｂａｎｋ〕〔ｎ〕）
により求める。
【００４３】
また、ステップＳ４０のデータの直線補外処理は、データ長ＬＥＮの端側にあるデータ（最後のデータと最後から２番目のデータ）に基づいてそのデータ長ＬＥＮよりも更に外側のデータを予測して補う処理であり、具体的には、次の計算式
ｐｗ＝（ｐｏｗｅｒ〔ｂａｎｋ〕〔ＬＥＮ−１〕−ｐｏｗｅｒ〔ｂａｎｋ〕〔ＬＥＮ−２〕）＊ｘ＋ｐｏｗｅｒ〔ｂａｎｋ〕〔ＬＥＮ−２〕）
ｐｔ＝（ｐｉｔｃｈ〔ｂａｎｋ〕〔ＬＥＮ−１〕−ｐｉｔｃｈ〔ｂａｎｋ〕〔ＬＥＮ−２〕）＊ｘ＋ｐｉｔｃｈ〔ｂａｎｋ〕〔ＬＥＮ−２〕）
により求める。
【００４４】
次いで、周波数ワークバッファｐｔにピッチ変化指示量ｐＲａｔｅをかける処理、すなわち
ｐｔ＝ｐｔ＊ｐＲａｔｅ
を行う（ステップＳ４１）。このピッチ変化指示量ｐＲａｔｅは、ユーザがピッチ変化させたい大きさに応じて指示するものであり、ピッチシフト比とも称する。例えばこのピッチ変化指示量ｐＲａｔｅが「１．０」であればピッチはそのまま、「２．０」であれば２倍の周波数つまり１オクターブ上で再生される。これにより、入力信号のピッチをテンポ（すなわちタイムストレッチ）とは独立して変化させることができる。
【００４５】
さらに、変数ｐｔｒをタイム変化指示量ｔＲａｔｅの逆数だけ進める処理、すなわち、
ｐｔｒ＝ｐｔｒ＋ｒａｔｅ／ｔＲａｔｅ
を行う（ステップＳ４２）。このタイム変化指示量ｔＲａｔｅは、ユーザがテンポ変化（すなわちタイムストレッチ）させたい大きさに応じて指示するものであり、タイムストレッチ比とも称する。例えばこのタイム変化指示量ｔＲａｔｅが「１．０」であれば再生時間（テンポ）はそのまま、「２．０」であれば再生時間が２倍になる。
【００４６】
ここで、上式中のサンプリング比ｒａｔｅはステップＳ３１で求めた「その帯域のサンプリング周波数ｆs とシステムのサンプリング周波数ｆsoとの比」であり、よって、入力信号の分析処理においてダウンサンプリングを行った帯域については、ダウンサンプリングにより間引かれたデータ数（サンプル値数）が上式により元のサンプリング数（よってサンプリング周波数ｆso）に戻されることになる。
【００４７】
この後、新しいｐｃとｐｓを、
ｐｃ＝ｐcos ＊cos （ｐｔ）−ｐsin ＊sin （ｐｔ）
ｐｓ＝ｐsin ＊cos （ｐｔ）＋ｐcos ＊sin （ｐｔ）
により求め（ステップＳ４３）、さらにｐcos とｐsin を
ｐcos ＝ｐｃ
ｐsin ＝ｐｓ
により更新する（ステップＳ４４）。
【００４８】
この後、合成データバッファｏｕｔ（ｃｎｔ）に今のバンクのデータを次式
ｏｕｔ（ｃｎｔ）＝ｏｕｔ（ｃｎｔ）＋ｐｗ＊ｐｃ
に従って加える（ステップＳ４５）。そして、データカウンタｃｎｔを一つインクリメントし（ステップＳ４６）、その更新したデータカウンタｃｎｔが（ＬＥＮ＊ｔＲａｔｅ）を超えたか否かを調べる（ステップＳ４７）。（ＬＥＮ＊ｔＲａｔｅ）を超えていなければ、ステップＳ３５〜Ｓ４６の処理を、ｃｎｔ≧（ＬＥＮ＊ｔＲａｔｅ）となるまで繰り返す。データカウンタｃｎｔが（ＬＥＮ／ｔＲａｔｅ）以上となったら、次にはバンク番号カウンタｂａｎｋを一つインクリメントし（ステップＳ４８）、そのバンク番号カウンタｂａｎｋがバンク数ＭＡＸ−ＢＡＮＫを超えたか否かを調べ（ステップＳ４９）、ＭＡＸ−ＢＡＮＫを超えていなければ、ステップＳ３５〜Ｓ４８の処理を、ｂａｎｋ≧ＭＡＸ−ＢＡＮＫとなるまで繰り返す。この処理を繰り返すことで、合成データバッファｏｕｔ（ｃｎｔ）には、各帯域の信号を合計した合成信号を得ることができる。
【００４９】
最後に、エンベロープの復元処理を行う（ステップＳ５０）。図９にはこのエンベロープの復元処理の詳細な手順が示される。このエンベロープの復元処理では、入力信号の分析処理で抽出し保存しておいたエンベロープを、再合成処理で入力信号の時間軸を圧縮／伸張した量だけ同様に時間軸を圧縮／伸長し、そのエンベロープを再合成処理で合成した合成信号に施すことで、元の入力信号の時間軸を圧縮／伸長するものである。
【００５０】
まず、データカウンタｃｎｔを「０」、変数ｐｔｒを「０」にそれぞれクリアする（ステップＳ５１）。次いで、変数ｐｔｒの整数部を整数部ｎに、小数部を小数部ｘに入れる（ステップＳ５２）。
【００５１】
この後、分析処理で抽出したエンベロープの時間軸を変数ｐｔｒの現在値に応じてタイムストレッチするために、まず、ステップＳ５３〜Ｓ５７でエンベロープのデータの補間、補外などの処理を行う。すなわち、変数ｐｔｒの整数部ｎが「０」より大きいかを調べ（ステップＳ５３）、「０」以下であれば、ワークバッファｗｏｒｋに「０」を入れる（ステップＳ５４）。一方、整数部ｎが「０」よりも大きければ、その整数部ｎがデータ長ＬＥＮを超えていないかを調べる（ステップＳ５５）。超えていなければエンベロープのデータを直線補間する処理を行い（ステップＳ５６）、データ長ＬＥＮに達していればエンベロープのデータを直線補外する処理を行う（ステップＳ５７）。
【００５２】
ここで、ステップＳ５６のエンベロープのデータの直線補間処理は、左右のエンベロープのデータ〔（ｎ＋１）点目とｎ点目のデータ〕からその間のデータを生成して補う処理であり、具体的には、次の計算式
ｗｏｒｋ＝（ｅｎｖ〔ｎ＋１〕−ｅｎｖ〔ｎ〕）×ｘ＋ｅｎｖ〔ｎ〕）
によりエンベロープ値ｅｎｖ（ｐｔｒ）を求める。
【００５３】
また、ステップＳ５７のエンベロープのデータの直線補外処理は、データ長ＬＥＮの端側にあるデータ（最後のデータと最後から２番目のデータ）に基づいてそのデータ長ＬＥＮよりも更に外側のデータを予測して補う処理であり、具体的には、次の計算式
ｗｏｒｋ＝（ｅｎｖ〔ＬＥＮ−１〕−ｅｎｖ〔ＬＥＮ−２〕）＊ｘ＋ｅｎｖ〔ＬＥＮ−２〕）
によりエンベロープ値ｅｎｖ（ｐｔｒ）を求める。
【００５４】
次いで、変数ｐｔｒをタイム変化指示量ｔＲａｔｅの逆数だけ進める処理、すなわち、
ｐｔｒ＝ｐｔｒ＋１／ｔＲａｔｅ
を行う（ステップＳ５８）。
【００５５】
この後、合成データバッファｏｕｔ（ｃｎｔ）の合成信号（平坦化された信号）に、タイムストレッチされた上記のエンベロープ値を次式
ｏｕｔ（ｃｎｔ）＝ｏｕｔ（ｃｎｔ）＊ｗｏｒｋ
でかけ（ステップＳ５９）、合成信号にエンベロープを施す。
【００５６】
そして、データカウンタｃｎｔを一つインクリメントし（ステップＳ６０）、その更新したデータカウンタｃｎｔが（ＬＥＮ＊ｔＲａｔｅ）を超えたか否かを調べる（ステップＳ６１）。（ＬＥＮ＊ｔＲａｔｅ）を超えていなければ、ステップＳ５２〜Ｓ６０の処理を、ｃｎｔ≧（ＬＥＮ＊ｔＲａｔｅ）となるまで繰り返す。データカウンタｃｎｔが（ＬＥＮ＊ｔＲａｔｅ）以上となったら、エンベロープ復元処理を終了する。図１０にはこのようにしてタイムストレッチしたエンベロープを用いて復元された出力信号の波形が示される。
【００５７】
本発明の実施にあたっては種々の変形形態が可能である。例えば上述の実施例では、ユーザが入力信号のタイプとして「メロディック」と「リズミック」の何れかを選択し、その選択したタイプに応じてオクターブ内分割数Ｍとフィルタのタップ数を変化させるようにしたが、これはより好ましい実施例であって本発明にとって必須なことではなく、入力信号のタイプにかかわらず帯域の分割数とフィルタのタップ数を一定にしておくものであっても勿論よいものである。
【００５８】
また、例えば上述の実施例では、入力信号の帯域をまずオクターブ単位で分割し、さらにそのオクターブ帯域内を等間隔で分割しているが、各オクターブ帯域内の分割も等間隔ではなくセント軸で行ってもよい。
【００５９】
また複素ＢＰＦ（帯域フィルタ）の実現方法として入力信号に複素変調を施したが、分析フィルタのほうに予め複素変調を施しておき、それを用いて分析を行うようにしてもよいし、（ｆs ／２）以上の折返しが発生しないようにしてフィルタを設計したものを使用してもよい。
【００６０】
また、本実施例で使用しているフィルタは、全て最小位相形ＦＩＲフィルタを用いているが、直線位相ＦＩＲフィルタ若しくは直線位相ＩＩＲフィルタを用いるものであってもよい。
【００６１】
また、実部と虚部からピッチに変換する部分を、前述の実施例における方法の他に、ピッチｐｉｔｃｈ（ｔ）はtan -1〔Ｉ（ｔ）／Ｒ（ｔ）〕で求めた位相から前データをで求めた位相〔ｐｉｔｃｈ（ｔ−１）〕を引いて求めるものであってもよいし、あるいは、
tan -1〔｛Ｒ（ｔ−１）＊Ｉ（ｔ）−Ｉ（ｔ−１）＊Ｒ（ｔ）｝／｛Ｒ（ｔ−１）＊Ｒ（ｔ）−Ｉ（ｔ−１）＊Ｉ（ｔ）｝〕
で求めるものであってもよい。
【００６２】
また、この部分とそれ以外の部分とに訳、複数のＣＰＵまたはＤＳＰによって並列処理するようにしてもよい。
【００６３】
また、合成部分について実施例では余弦値を用いているが、これは正弦値でもよい。また、積分と発振を同時に行っているが、単にピッチを積分してからその位相値によって余弦もしくは正弦を求めてもよい。
【００６４】
【発明の効果】
以上に説明したように、本発明によれば、初めに入力信号のエンベロープを検出してエンベロープを平坦にしてから各帯域毎の分析を行うようにしているので、フィルタリングによって発生するアタック部分のプリエコー等を抑えることができ、よってアタック部分等のより自然なタイムストレッチが可能となる。
これにより、リズム系やメロディ系などのような楽音の種々のタイプに対しても、音楽性を損なうことなく入力信号のタイムストレッチを行うことが可能となる。
【図面の簡単な説明】
【図１】本発明に係る一実施例としてのタイムストレッチ装置の構成を示す図である。
【図２】実施例装置の表示器における入力信号のタイプ設定画面の例を示す図である。
【図３】実施例装置における帯域分割の概念を説明するための図である。
【図４】実施例装置における分析処理の処理手順を示すフローチャート（１／２）である。
【図５】実施例装置における分析処理の処理手順を示すフローチャート（２／２）である。
【図６】実施例装置における分析処理フロー中のエンベロープ検出処理の詳細な処理手順を示すフローチャートである。
【図７】実施例装置における再合成処理の処理手順を示すフローチャート（１／２）である。
【図８】実施例装置における再合成処理の処理手順を示すフローチャート（２／２）である。
【図９】実施例装置における再合成フロー中のエンベロープ復元処理の詳細な処理手順を示すフローチャートである。
【図１０】実施例装置のエンベロープ検出処理により入力信号波形から検出したエンベロープを示す図である。
【図１１】実施例装置の平坦化処理により入力信号信号のエンベロープを平坦化した信号波形を示す図である。
【図１２】実施例装置のエンベロープ復元処理によりエンベロープが復元された出力信号を示す図である。
【図１３】帯域分割と再合成によりタイムストレッチを行う従来装置の構成例を示す図である。
【図１４】帯域分割と再合成によりタイムストレッチを行う従来装置における帯域分割の概念を説明する図である。
【図１５】帯域分割と再合成によりタイムストレッチを行う従来装置において分割した帯域のタイムストレッチの仕方を説明する図である。
【符号の説明】
１  ＣＰＵ（中央処理装置）
２  ＲＯＭ（リード・オンリー・メモリ）
３  ＲＡＭ（ランダム・アクセス・メモリ）
４  操作子群
５  表示器
６  ハードディスク駆動装置
７  ＣＤ−ＲＯＭ駆動装置
８  Ａ／Ｄ変換器
９  Ｄ／Ａ変換器
【図１】
0003945794.tif 000002
【図２】
0003945794.tif 000003
【図３】
0003945794.tif 000004
【図４】
0003945794.tif 000005
【図５】
0003945794.tif 000006
【図６】
0003945794.tif 000007
【図７】
0003945794.tif 000008
【図８】
0003945794.tif 000009
【図９】
0003945794.tif 000010
【図１０】
0003945794.tif 000011
【図１１】
0003945794.tif 000012
【図１２】
0003945794.tif 000013
【図１３】
0003945794.tif 000014
【図１４】
0003945794.tif 000015
【図１５】
0003945794.tif 000016