デジタル信号処理 in Swift | try! Swift Tokyo 2018 Day2-10

デジタル信号処理の分野に潜って、Apple の Accelerate framework が高速フーリエ変換を使ってどうやってオーディオ周波数を特定しているのかを見てみましょう。Swift のような強力な言語でオーディオサンプリングレートを分解する方法を対話的なデモを通して見てみましょう。

デジタル信号処理 in Swift

f:id:niwatako:20180302150448j:plain

NYから来ました。iOSでは珍しい処理、DSPですデジタル信号処理。

f:id:niwatako:20180302150624j:plain

信号を扱うので他の分野と一線を画しています

映像の増幅や音声認識

DSPのテクニックは細かい理論や数学を知らなくても利用できます。 みなさんがDSPをどう利用し実験できるか感覚を掴んで下さい

Swiftで音のサウンドをどう表現するか、ビデオ会議、電話番号、ノイズキャンセリングを思い出してもいいです。

すべてDSPです

f:id:niwatako:20180302150755j:plain

f:id:niwatako:20180302150804j:plain

f:id:niwatako:20180302150811j:plain

スピーカーから出した水、正弦波

異なる周波数で繰り返すとコンポーネントフーリエ変換によって包括的音響マップになる

f:id:niwatako:20180302150856j:plain

Accelerate frameworkがDSPや画像処理に使われる。フーリエ変換含むライブラリがある。

周波数領域間の一次元及び二次元データのフーリエ変換がある

AVAudioEnginは複雑なオーディオ用

CoreAudioように不可欠でサンプリング定理

良い信号を得るには周波数の2倍のサンプルが必要。

f:id:niwatako:20180302151033j:plain

↑2017年のWWDC詳細を参照

f:id:niwatako:20180302151117j:plain

オーディオとiOSAPIがわかりにくかったり遅かったりしますが、Swiftでは見逃しがちなことだと思っているのでSwiftでできることをみていきます。

FFTから幾つかの固有店を表示してみましょう

AudioListener

f:id:niwatako:20180302151224j:plain

セッションが起動するとエンジンを設定、エンジン起動してサンプルが2倍、オーディオバスにタップをインストールしてPCMを設定します。このクロージャーではアウトプットを観測しています。 データポインタに値を設定してフレーム長文それを繰り返します

f:id:niwatako:20180302151328j:plainf:id:niwatako:20180302151331j:plainf:id:niwatako:20180302151335j:plain

どうすればなまのPCMをスペクトルに入れることができるか、振幅を見ることができます。あくせれれいとふれーむわーくが必要になります。

あまりにも複雑かもしれませんが、Swiftのエキスパートなのでできます。

ステップ2です

VTSPファンクションを使います。

ファンクションを小0るする前に使ってFFTのwait arrayが使える? クエリを掛けることができてエネルギーレベルをとったりできる。変数がlog2nということになる elementの一番大きな数を特定できる。

log2nですが引数とイコール、またはそれを超える数でなければなりません。

f:id:niwatako:20180302151524j:plain

f:id:niwatako:20180302151535j:plain

データ型で定義されていますrealとimagがあります。

アウトプットが一連の複雑な数字になっています。realですがevenodを分解したものです。 そのまえにvdsp 反うぃんどwwotukaimasu . これを使うと波形のエッジがスムーズになります。

フィルターまたはサーキュラーバッファーを使っていない場合、ハニングを使うことでより高いプライオリティのスレッドで行われます。

さいごにctoz リアルコンポーネントとoddindexsampleが入っていってパフォーマンス面からインターリブドコンプレックスデータを使います

f:id:niwatako:20180302151734j:plain

ユニークデータがでてきます。次は何でしょうか。

音のエネルギーをだしたmagnitudeをUIviewの高さにしてみます

DEMO

f:id:niwatako:20180302151842j:plain

f:id:niwatako:20180302151845j:plain

Guiter tokyoの音楽です。

機能することがわかりました

ただ私の実装が性格だったかはわかりません。magunitudeをデシベルに返るとかもできたかもしれません。

f:id:niwatako:20180302152007j:plain

こうするとよりエラーハンドリングなどが必要になりますが、これは読むためのものではないです。

f:id:niwatako:20180302152027j:plain

AudioComponentをセットアップしてステータスをハンドリングしセットアップしコールバックを記録します。Swiftは必ずしもオーディオ処理には最適ではないといえます。

f:id:niwatako:20180302152100j:plain

オーディオ開発をMacなどで行う場合ミスを避けることができることを教えてくれます

f:id:niwatako:20180302152142j:plain

SurgeはAccelerateFrameworkラッパーを作った人です。

並列プログラミング、FFTコンピューティングがこのAPIで提供されているので試して

メリットは?

f:id:niwatako:20180302152219j:plain

もともとShazamのシンプルバージョンを作りたかったのでした

f:id:niwatako:20180302152236j:plain

Shazamアルゴリズムのペーパーです。

これは6ページですがオーディオフィンガープリンティングでハッシュセグメントと比べる。

SwiftAudiofingerPrintLibraryあると良いと思いませんか?まだ無いですが

資料

f:id:niwatako:20180302152340j:plain

DSPすたくエクスチェンジサイトです。どうすればミスを割けられるか、どうiOSに統合できるか

最後にマイクアッシュが素晴らしい記事を書いています。

今日の発表のギットハブリンクが最後です。

f:id:niwatako:20180302152445j:plain

ありがとうございました

[広告]面白かったら、ためになったら

  • はてなブックマークSwift タグをつけてブックマーク!
  • 「インターネットで生活を楽しく豊かにしたい」仲間を募集しています
  • Bitcoin: 3KGqXtR1ZaGVdkvcw8CCNrkDxDhdbZBYHL