ピッチシフタを作る4つの方法

というビデオをYouTubeで見かけたので視聴してみました。少し前にピッチシフタを実装しましたし、最近はピッチシフタとは似て非なる「周波数シフタ」に興味を惹かれたりもしていたましたので、他にも方法があるのかなと気になりました。


ピッチシフタを作る方法ですが、ちょっと考えると
・先日実装したようなバッファを利用するタイムストレッチ/タイムラプス
・FFTして周波数をずらして逆FFT
はすぐ思いつきますね。あとは、FFTの代わりにボコーダを応用するくらいかな・・・と調べてみると、ピッチシフトの方式はすでにいろいろ整理されていて、Wikipediaもだいぶ参考になりました。

Audio time stretching and pitch scaling - Wikipedia
タイムストレッチ/ピッチシフト - Wikipedia
A Review of Time-Scale Modification of Music Signals
Time-scale modification (TSM) is the task of speeding up or slowing down an audio signal’s playback speed without changi...

また、ライブラリとしてはSoundTouchというOSSの実装が割と広く使われているようです。これを利用しているソフトウェアにはAudacityやFirefoxなどの名前も挙がっています。

SoundTouch Sound Processing Library

表題のビデオですが、これはADC(Audio Developer Conference)というカンファレンスでの講演のようです。(このカンファレンスはFocusriteやAvid、Arturiaなどおなじみのベンダが協賛しており、他にもいろいろ面白そうな講演があります。)

また、コードがこちらで公開されています。

GitHub - Signalsmith-Audio/pitch-time-example-code: "Four Ways To Write A Pitch-Shifter" example code
"Four Ways To Write A Pitch-Shifter" example code. Contribute to Signalsmith-Audio/pitch-time-example-code development b...

前半はグレインを使う手法やFFTを使う手法の話なのですが、後半30分を過ぎたあたりからだんだん難しくなってきます。基本的にはフェイズ・ボコーダを使う手法で、短時間の音声信号に窓関数を掛けてFFTし、周波数をシフトして逆FFTするものです。

FFT→逆FFTするとき、異なる周波数帯で位相が異なると、意図しないキャンセリングが起こるので、どうやって位相を合わせるか?といった話をしているようです。FFT系の方式だと、パーカッションのようなノイズ系の音を解析・合成するのはちょっとハードル高そうですし、周波数によって位相がずれてしまうとアタック成分が崩れてしまいそうな感じはしますね。

上のリンク先のコードをダウンロードして1.5倍のピッチ変換をさせてみましたが、結果はなかなかのもので、ノイズの音色は微妙に変化するものの楽器音はクリアですしアタック成分も失われていません。

以下は変換後のファイルです。(元の曲はHoward Jonesの”Equality”という曲です。)

ちなみにPitchyで同じピッチ変換をすると以下のような感じです。グレイン(2048サンプルに設定)の影響が出てしまっていますし、エイリアシングの影響か、S/Nが良くないですね。もともと、こういった楽曲の変換というよりは、単音の変換に向いた方式だと思います。

コメント