月別アーカイブ: 2008年2月

AudioUnitをオフラインで使う

オーディオファイルにエフェクトをバッチ処理でかけるような時に、AudioUnitを使って出来ないかと思ったのですが、そういう事ができそうなkAudioUnitType_OfflineEffectを取得しても、VariSpeedやTimePitchしか出てきません。しかし、Logicとかで出来てる事が出来ないはずはないと思い、普通のkAudioUnitType_Effectをオフラインで使える方法はないかと調べてみました。 リアルタイムでの処理をシミュレートするという形で調べた結果、ポイントのみをとりあえず書いておきます。 ・AudioUnitRender関数を実行すると別のスレッドでエフェクト... read more

高速フーリエ変換

vDSPで高速フーリエ変換を行う関数の使い方です。 vDSP One-Dimensional Fast Fourier Transforms Referenceというリファレンスを見ると、一次元のフーリエ変換だけで30個ほどの関数が用意されています。 大きく分けてRealとComplexがあり、そのそれぞれがさらに、In-Place(変換前のバッファにそのまま上書き)かOut-of-Place(変換前と後で別々のバッファ)かで分かれています。さらに細かく見るとfloat用とdouble用とか、一度にたくさん処理するものとか、いろいろあります。 今回はIn-PlaceでComplexのfft_z... read more

dBとリニア値を変換する

0.0 = -inf dB、1.0 = 0dBとした場合。 リニア値からdBへ変換するには、 dBVolume = 20.0*log10(linearVolume); dBからリニア値へ変換するには、 linearVolume = pow(10.0, dBVolume/20.0); で、できる ちなみにvDSPにはvDSP_vdbconという関数があり、リニア値からdBへの変換はできる。 void  vDSP_vdbcon (    float * A,    vDSP_Stride I,    ... read more

biquad filter

Mac OS XのAccelerateフレームワークには、連続したデータの配列にデジタル信号処理をするときなどに便利な関数がいろいろ用意されています。Accelerateフレームワークを使えば1つの記述をするだけで、内部で勝手に判断してAltiVecやSSE等で素早く処理を行ってくれるようです。場合によってはアクセラレートしない事もありますが、いちいち自分でfor文を回したりしなくても良くて、処理が速くなる可能性があるのですから、使わない手はありません。 では、Accelerateフレームワークの中にあるvDSP_deq22()という関数でbiquadのフィルタをかけるクラスを作ってみます。v... read more