Swiftで時間波形をオーバーラップ抽出するコード

  • このエントリーをはてなブックマークに追加

長時間の信号処理を行う場合、信号を細かくフレームに区切り、さらにフレームを重ねながら信号を抽出するオーバーラップという手法があります。過去にPythonで実装したこのオーバーラップ処理を、今回はiOSアプリで動作させるためにSwiftで実装する方法と検証結果を紹介します。

こんにちは。wat(@watlablog)です。今回は言語変換回なのでサクッといきますが、Swiftでオーバーラップ処理を実装します

Pythonで実装したオーバーラップ処理のおさらい

当WATLABブログでは2019年にPythonによるオーバーラップ処理コードを紹介しました。こちらの記事にオーバーラップ処理の概要やアルゴリズムを図解していますので是非ご覧ください。

PythonでFFTをする前にオーバーラップ処理をしよう!

オーバーラップ処理の図と式を再度示します。今回はこの処理をSwiftで実装します。

オーバーラップ処理の概要
\[ x_{ol}= F_{s}\left ( 1-\frac{overlap}{100} \right )\\ N_{ave}= \frac{T_{s}-\left ( F_{c} \frac{overlap}{100}\right )}{F_{c}\left ( 1-\frac{overlap}{100} \right )} \]

Swiftでオーバーラップ処理を実装するコード

オーバーラップ処理の原理等はPython記事に記載したので、今回は簡単にSwiftコードのみを紹介します。以下のコードのfunc ov{}がオーバーラップ処理部分です。
できるだけPythonコードの書き方とそろえてみたので、Pythonユーザーは是非見比べてみてください。

オーバーラップ抽出した波形はChartに全てプロットしています。

実行結果①:Fs=25, overlap=0

上記コードのサンプル信号はデータ点数が100です。まずはオーバーラップ率overlap=0[%]でフレームサイズFs=25と設定して(上記コードはデフォルトでこの設定です)、信号を1/4ずつ抽出してみましょう。

こちらが結果です。元信号はFs=100の場合ですが、正弦波が綺麗に1/4ずつ分割されて抽出できています。

Fs=25, overlap=0の結果

実行結果②:Fs=50, overlap=25

続いてFs=50、overlap=25の結果です。全信号が100に対してフレームサイズが50なので、オーバーラップ25[%]だとしても2フレーム抽出するのが限界です。

こちらが実行結果です。元信号と比べてみても正確に抽出できているようですね。

Fs=50, overlap=25の結果

まとめ

今回はショートTips記事ですが、SwiftでもPythonと同様にオーバーラップ処理を実装することができました。
アプリとして成立させるのは別問題ですが、今は材料をそろえている段階です。
次は窓関数や平均化処理を実装してみたいと思います。

Swiftでオーバーラップ処理を実装できました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*