問題タブ [vdsp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
632 参照

iphone - カメラからの光パルスを検出する

iPhone用の心拍検出アルゴリズムを実装しようとしています。これは、すでにいくつかのアプリがそれを行っているという事実を考慮して、教育目的です...

フレームの色のバリエーションを取得するためにこの関数を持っています...

画像の支配的な色を取得する次の関数

しかし、各フレームから一連の赤いコンポーネントをプロットしても、信頼できる心拍数のプロットは得られません...

これは正しい進め方ですか?FFTで遊んでいますが、ピークをカウントするために信号のスペクトルを処理するのは無意味だと思います... FFTを使用してローパスフィルターで畳み込みを適用し、チェックするために逆FFTを適用することができますこれらの新しいデータのピーク...

0 投票する
2 に答える
2047 参照

c++ - vDSP_deq22 (biquad IIR フィルター) でフィルターを実行した後のノイズ/歪み

Novocaineの DSP クラス (obj-c++) に取り組んでいますが、私のフィルターは信号にノイズ/歪みを引き起こすだけのようです。

完全なコードと係数をここに投稿しました: https://gist.github.com/2702844 しかし、基本的には次のようになります。

完全なコード/コンテキストについては要旨を参照してください。

係数:

(すべて で除算a0)

係数は次の順序であると推定したため{ b0/a0, b1/a0, b2/a0, a1/a0, a2/a0 }(参照:ピーキング EQ の IIR 係数、それらを vDSP_deq22 に渡す方法は? )

歪み/ノイズの原因 (フィルターが機能しない) は何ですか?

0 投票する
1 に答える
1988 参照

ios - Power ofTwo以外の画像の2D信号処理にIOSAccelerateFrameworkを使用していますか?

//編集...

特に2の累乗以外の画像を操作する問題に対処するために、質問を少し編集しています。256x256や1024x1024のようなサイズの正方形のグレースケール画像で機能する基本構造がありますが、任意のサイズの画像に一般化する方法がわかりません。fft関数では、幅と高さのlog2を含める必要があるようですが、結果のデータを解凍する方法や、データがスクランブルされているだけではないかどうかが不明です。明らかなことは、npot画像をより大きな、すべて黒の画像の中央に配置し、データを見るときにそれらの位置の値を無視することだと思います。しかし、npotデータを操作するためのそれほど厄介な方法があるかどうか疑問に思います。

//...編集終了

AccelerateFrameworkのドキュメントに少し問題があります。通常はFFTW3を使用しますが、実際のIOSデバイスでコンパイルするのに問題があります(この質問を参照)。誰かが私に次のようなことをするAccelerateを使用した非常に単純な実装を指摘できますか?

1)画像データをAccelerateのFFTメソッドに渡すことができる適切なデータ構造に変換します。
FFTW3では、最も単純な場合、グレースケールイメージを使用して、符号なしバイトを「fftw_complex」配列に配置します。これは、2つのfloatの構造体であり、1つは実数値を保持し、もう1つは虚数(および虚数はピクセルごとにゼロに初期化されます)。

2)このデータ構造を取得し、FFTを実行します。

3)振幅と位相を出力します。

4)その上でIFFTを実行します。

5)IFFTの結果のデータから元の画像を再作成します。

これは非常に基本的な例ですが、Appleのサイトのドキュメントを使用するのに問題があります。ここでのPiによるSOの回答は非常に役立ちますが、グレースケール(またはカラー)2D画像を使用してこの基本機能を実行するためにAccelerateを使用する方法についてはまだ多少混乱しています。

とにかく、2D画像を処理するポインタや特にいくつかの単純な作業コードは非常に役立ちます!

\\\ 編集 \\\

さて、ドキュメントとSOおよびpkmitalのgithubリポジトリに関するいくつかの非常に役立つコードを詳しく調べた後、1)から理解するのに時間がかかったと思った実用的なコードがいくつかあります。それと2)残りの質問がいくつかあるので...

FFT「計画」を初期化します。2乗の正方形の画像を想定すると、次のようになります。

2乗の2乗グレースケール画像のバイト配列を渡し、それをCOMPLEX_SPLITに変換します。

変換された画像データに対してFFTを実行してから、大きさと位相を取得します。

これで、out_fftデータに対してIFFTを実行して、元の画像を取得できます...

または、マグニチュードに対してIFFTを実行して、自己相関を取得することもできます...

最後に、ifftの結果を画像配列に戻すことができます。

Accelerateフレームワークを使用して2の累乗以外の画像を処理する方法がわかりません。セットアップで十分なメモリを割り当てると、FFTを実行し、続いてIFFTを実行して元のイメージを取得できます。しかし、(FFTの大きさで)自己相関を行おうとすると、私の画像は不安定な結果になります。画像を適切にパディングする最善の方法がわからないので、誰かがこれを行う方法を知っているといいのですが。(または、vDSP_convメソッドの動作バージョンを共有してください!)

0 投票する
1 に答える
478 参照

ios - iOS オーディオ アクセラレーション

音声合成に OpenGLES2.0 シェーダー (GLSL) をうまく使っている人はいますか?

私はすでに vDSP を使用して、C コードから単純なベクトル命令セットを提供する iOS アプリでオーディオを高速化しています。vDSP の主な問題は、サンプル単位のメイン ループが各プリミティブ演算 (ベクトル加算、ベクトル乗算) にプッシュ ダウンされるため、ベクトル指向のアセンブリ言語に相当するものを作成する必要があることです。式をこれらのシーケンスにコンパイルすることは、シェーダー言語が自動化する本質です。OpenCL は iOS では公開されていません。また、GLSL が実行時にコンパイルされることも興味深い点です。つまり、サウンド エンジンのほとんどが GLSL にある場合、ユーザーは重要なパッチを提供できることになります。

0 投票する
2 に答える
545 参照

objective-c - オーバーラップを使用してバッファリング/ウィンドウ処理を実行するaddCMSampleBufferRef

iPhoneのAVAssetReaderを使用してビデオファイルから取得したPCMオーディオデータに対して、いくつかの基本的なDSP機能を実行しようとしています。バッファーを正しく読み取っています。バッファーあたりのサンプル数は8192です(デフォルトですか?変更できますか?)。ただし、8192サンプルの長さではないスライスに対して、ウィンドウ処理、fft、およびその他のさまざまな操作を実行する必要があります。実際、各スライス間で50%オーバーラップして、一度に512個のサンプルを処理したいと思います。私はAppleのAccelerate/vDSPフレームワークを深く掘り下げてきましたが、処理などを処理できると思いますが、実際に信号を希望どおりに分割する方法がわかりません。私は強力なDSPのバックグラウンドを持っていますが、残念ながら、私のDSPプログラミングの経験はほとんどMATLABで終わります。

どんな助けでもありがたいです。

0 投票する
1 に答える
1337 参照

iphone - 短時間フーリエ変換にvDSP関数を使用するにはどうすればよいですか?

STFTでvDSP関数を使用する方法を理解しようとしています。だから私はアップルのexpamlesからFFTコードを使用し、最初の1024フレームのFFTを取得できますが、ファイルの終わりまで、次の1024〜2047フレームなどのFFTを取得するにはどうすればよいですか?(この場合、ファイルのサイズを想像しますはintf= 10000)です。

0 投票する
5 に答える
801 参照

arrays - 配列宣言の順序がパフォーマンスに大きな影響を与えるのはなぜですか?

まず、Accelerateフレームワークを使用して周波数分析機能を調整する場合、システムの絶対時間は一貫して反復あたり225msでした。それから昨夜、2つのアレイが宣言される順序を変更しましたが、突然202msになりました。宣言の順序を変更するだけで10%増加するのは、非常識なようです。コンパイラ(最適化するように設定されている)がまだこの解決策を見つけていない理由を誰かが私に説明できますか?

追加情報:ループの前に、ループで使用される配列のセットアップがあります。これは、配列を整数から浮動小数点配列(Accelerateの場合)に変換し、時間配列(16行の長さ)のsinとcosを取得することで構成されます。すべてのfloat配列(8配列x 1000要素)は、関数で最初に宣言されます(パラメーターの健全性チェックの後)。フットプリントの縮小がほとんどないためにパフォーマンスが低下するため、これらは常に同じサイズ(定数によって)と宣言されます。それらをグローバルにすることをテストしましたが、パフォーマンスに変化がないため、コンパイラーはすでにそれを理解していると思います。ループの長さは25行です。

---追加---

はい、「-Os」がフラグです。(とにかくXcodeのデフォルト:最速、最小)

(以下はメモリからのものです。コンパイルしようとしないでください。ストライド(1)などを入れなかったためです。ただし、Accelerate呼び出しはすべてそこにあります)

渡されたパラメーター:inttimearray、intamparray、length、scale1、scale2、amp

---現在の解決策---

私は次のようにいくつかの変更を加えました:

配列はすべて整列されていると宣言され、ゼロにされ(次に説明します)、maxsizeは16の倍数になります

長さがmaxsize未満の場合、長さを16の最も近い倍数に切り上げて、ループされたすべての関数が16で割り切れる幅で動作するように、すべての配列をゼロにしました。合計。

利点は次のとおりです。

  • わずかなパフォーマンスの向上
  • 配列宣言の順序に関係なく、速度はほぼ一定です(これは、すべてが大きなブロックではなく、必要になる直前に実行されます)。
  • 速度は、16幅の長さ(つまり、241から256、または225から240 ...)でもほぼ一定ですが、以前は、長さが256から255になると、関数のパフォーマンスが3%以上低下していました。

将来的には(おそらくこのコードでは、分析要件はまだ流動的であるため)、スタックの使用量とベクトルの整列/チャンクをさらに考慮する必要があることに気付きました。残念ながら、このコードでは、この関数を一度に複数のオブジェクトから呼び出すことができるため、これらの配列を静的またはグローバルにすることはできません。

0 投票する
2 に答える
1717 参照

matlab - 非対数ベース2の数値のMatlabFFT(高速フーリエ変換)関数

AppleのAccelerateFrameworkFFT関数を利用するアプリを開発していて、 MatlabのFFT関数の機能を模倣しようとしています。現在のコードは、matlabで実行しているのとまったく同じ方法で出力するように設定しています。同じように出力されないのは、データ配列内の要素の数が!= 2を底とする対数(技術的にはFFTに必要)の場合のみです。Matlab関数がこのケースをどのように処理するかを誰かが知っているかどうか疑問に思いました。アップルコードを使用して実行すると、異なる結果が生成されます。

注:私は単にfft(x)を呼び出しているのではありません。また、FFTシフトして絶対値を取り、それを2乗します。また、FFTの影響を直接受けないため、これらをAppleコードにミラーリングします。彼らは事後に呼ばれます。

例1-16要素(対数ベース2): 同様の出力

Matlabコール:

*長さのために省略されたAppleコード

Appleの出力:

例2-10要素(対数ベース2ではない):異なる出力

Matlabコール:

*長さのために省略されたAppleコード

Appleの出力:

ご覧のとおり、最初の例と2番目の例では明らかに同じ出力が生成されます。私は正と負の両方の入力でテストしましたが、それらが異なるのはログベース2ではない場合だけです。Matlabがこの問題をどのように処理するか知っている人はいますか?おそらく、2進数の対数になるまで配列を0で埋めてから、特定のポイントの平均を計算しますか?私は多くの検索を行いましたが、この特殊なケースで出力を取得するために彼らが何をしているのか理解できません。

0 投票する
1 に答える
543 参照

objective-c - 結果を vDSP フレームワークの入力ベクトルの 1 つに格納することは可能ですか?

Accelerate Framework の vDSP 関数では、すべての関数で結果ベクトルを入力する必要があります。元の入力ベクトルが不要になった場合、入力ベクトル (または入力ベクトルの 1 つ) を結果ベクトルとして渡すのは正しいですか?

私が意味するものの例:

これは、input_vector を取り、すべての要素に scalar_addition を追加します。結果はinput_vectorに格納されます。