再生速度と音程を独立に変更する方法 (4) ― 2006年08月15日 22:54
http://cessna373.asablo.jp/blog/2006/08/14/482731
の続きというか補足です。
音程を変化させる方法としてまず思いつくのが FFT --> 周波数領域でデータをずらす --> IFFT というものではないでしょうか。
私も最初にこれを考えましたし、調べているときもこれでコケて質問している人をたびたび見かけました。
これでダメな理由を 100% クリアに説明することは私にはできません。
基本的には 「重要なのは位相であり、それを上手く調節してやらなければならない」 ということのようです。
考えてみれば正弦波を重ね合わせるだけで無音に近い状態も表現できるわけで、それには位相をうまく合わせて打ち消しあうようにしなければならないというのは直感的に分かります。
では実際に FFT --> 周波数領域でデータをずらす --> IFFT を行うとどうなるのでしょうか。
周波数領域で(データを間引いて)単純に一オクターブ分低くして上半分を 0 で埋めた場合、確かに音程は低くなるのですが再生速度も半分になります。
つまり時間領域でデータを補間して再生速度を下げるのと同じ結果になります。
(データ量が同じで再生速度が遅くなるわけですから、音声が途中で途切れます)
要するに周波数領域でちょっといじるだけでは本質的には何も変わらないということですね。
の続きというか補足です。
音程を変化させる方法としてまず思いつくのが FFT --> 周波数領域でデータをずらす --> IFFT というものではないでしょうか。
私も最初にこれを考えましたし、調べているときもこれでコケて質問している人をたびたび見かけました。
これでダメな理由を 100% クリアに説明することは私にはできません。
基本的には 「重要なのは位相であり、それを上手く調節してやらなければならない」 ということのようです。
考えてみれば正弦波を重ね合わせるだけで無音に近い状態も表現できるわけで、それには位相をうまく合わせて打ち消しあうようにしなければならないというのは直感的に分かります。
では実際に FFT --> 周波数領域でデータをずらす --> IFFT を行うとどうなるのでしょうか。
周波数領域で(データを間引いて)単純に一オクターブ分低くして上半分を 0 で埋めた場合、確かに音程は低くなるのですが再生速度も半分になります。
つまり時間領域でデータを補間して再生速度を下げるのと同じ結果になります。
(データ量が同じで再生速度が遅くなるわけですから、音声が途中で途切れます)
要するに周波数領域でちょっといじるだけでは本質的には何も変わらないということですね。
コメント
_ cessna373 ― 2006年08月16日 08:59
周波数分解能 fHzの周波数領域のデータは時間領域では1/f秒になることはFFTの原理から変わらないわけだから、周波数領域のデータの周波数を半分にして、半分のデータを一つ飛びに消去すれば、もとのデータに対し半分の周波数で、時間は同じというデータができるね。上のデータを0で埋めなければサンプリングレートは半分になってしまいますが。。。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
トラックバック
このエントリのトラックバックURL: http://cessna373.asablo.jp/blog/2006/08/15/484980/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。