デジタル信号処理の分野に潜って、Apple の Accelerate framework が高速フーリエ変換を使ってどうやってオーディオ周波数を特定しているのかを見てみましょう。Swift のような強力な言語でオーディオサンプリングレートを分解する方法を対話的なデモを通して見てみましょう。
デジタル信号処理 in Swift
NYから来ました。iOSでは珍しい処理、DSPですデジタル信号処理。
信号を扱うので他の分野と一線を画しています
映像の増幅や音声認識
DSPのテクニックは細かい理論や数学を知らなくても利用できます。 みなさんがDSPをどう利用し実験できるか感覚を掴んで下さい
Swiftで音のサウンドをどう表現するか、ビデオ会議、電話番号、ノイズキャンセリングを思い出してもいいです。
すべてDSPです
スピーカーから出した水、正弦波
異なる周波数で繰り返すとコンポーネントが フーリエ変換によって包括的音響マップになる
Accelerate frameworkがDSPや画像処理に使われる。フーリエ変換含むライブラリがある。
周波数領域間の一次元及び二次元データのフーリエ変換がある
AVAudioEnginは複雑なオーディオ用
CoreAudioように不可欠でサンプリング定理
良い信号を得るには周波数の2倍のサンプルが必要。
↑2017年のWWDC詳細を参照
オーディオとiOSはAPIがわかりにくかったり遅かったりしますが、Swiftでは見逃しがちなことだと思っているのでSwiftでできることをみていきます。
FFTから幾つかの固有店を表示してみましょう
AudioListener
セッションが起動するとエンジンを設定、エンジン起動してサンプルが2倍、オーディオバスにタップをインストールしてPCMを設定します。このクロージャーではアウトプットを観測しています。 データポインタに値を設定してフレーム長文それを繰り返します
どうすればなまのPCMをスペクトルに入れることができるか、振幅を見ることができます。あくせれれいとふれーむわーくが必要になります。
あまりにも複雑かもしれませんが、Swiftのエキスパートなのでできます。
ステップ2です
VTSPファンクションを使います。
ファンクションを小0るする前に使ってFFTのwait arrayが使える? クエリを掛けることができてエネルギーレベルをとったりできる。変数がlog2nということになる elementの一番大きな数を特定できる。
log2nですが引数とイコール、またはそれを超える数でなければなりません。
データ型で定義されていますrealとimagがあります。
アウトプットが一連の複雑な数字になっています。realですがevenodを分解したものです。 そのまえにvdsp 反うぃんどwwotukaimasu . これを使うと波形のエッジがスムーズになります。
フィルターまたはサーキュラーバッファーを使っていない場合、ハニングを使うことでより高いプライオリティのスレッドで行われます。
さいごにctoz リアルコンポーネントとoddindexsampleが入っていってパフォーマンス面からインターリブドコンプレックスデータを使います
ユニークデータがでてきます。次は何でしょうか。
音のエネルギーをだしたmagnitudeをUIviewの高さにしてみます
DEMO
Guiter tokyoの音楽です。
機能することがわかりました
ただ私の実装が性格だったかはわかりません。magunitudeをデシベルに返るとかもできたかもしれません。
こうするとよりエラーハンドリングなどが必要になりますが、これは読むためのものではないです。
AudioComponentをセットアップしてステータスをハンドリングしセットアップしコールバックを記録します。Swiftは必ずしもオーディオ処理には最適ではないといえます。
オーディオ開発をMacなどで行う場合ミスを避けることができることを教えてくれます
SurgeはAccelerateFrameworkラッパーを作った人です。
並列プログラミング、FFTコンピューティングがこのAPIで提供されているので試して
メリットは?
もともとShazamのシンプルバージョンを作りたかったのでした
Shazamアルゴリズムのペーパーです。
これは6ページですがオーディオフィンガープリンティングでハッシュセグメントと比べる。
SwiftAudiofingerPrintLibraryあると良いと思いませんか?まだ無いですが
資料
DSPすたくエクスチェンジサイトです。どうすればミスを割けられるか、どうiOSに統合できるか
最後にマイクアッシュが素晴らしい記事を書いています。
今日の発表のギットハブリンクが最後です。
ありがとうございました