問題タブ [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 投票する
2 に答える
1474 参照

signal-processing - フレームワーク vDSP、FFT フレーミングを高速化

Apple の vDSP を使用して、録音されたオーディオ ファイルに FFT 計算を実装しようとしています (モノラル PCM と仮定します)。

ここで調査を行ったところ、次のトピックが非常に役立つことがわかりました。

たとえば、frame_size N = 1024 サンプル、log2n=10 で FFT を構成しました。

コードのどこかに:

私が今欠けているのは、FFT の使用法を理解する上で、大きなオーディオ ファイルの完全なスペクトルを取得する方法です。合計で 12800 サンプルと仮定しましょう。


Q: 生データをサイズ 1024 サンプル (~ 12800 / 1024 = 13 フレーム) のフレームに分割し、各フレームで個別に FFT を実行し、何らかの方法で平均 13 FFT の結果を結果のスペクトルにする必要がありますか? それが正しい仮定である場合、平均化を実行する方法は?

助けていただければ幸いです。

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

performance - OpenCL が遅い -- 理由がわからない

mpeg4dst リファレンス オーディオ エンコーダーを最適化することで、OpenCL を独学しています。CPU でベクトル命令を使用して 3 倍のスピードアップを達成しましたが、おそらく GPU の方が効率がよいと考えました。

最初の改善領域として、OpenCL での自己相関ベクトルの計算に焦点を当てています。CPUコードは次のとおりです。

私のテスト ファイルでは、この関数が完了するまでに約 188 ミリ秒かかりました。

これが私のOpenCLメソッドです:

これは、次のように呼ばれます。

Instruments によると、私の OpenCL 実装には約 13 ミリ秒かかり、約 54 ミリ秒のメモリ コピー オーバーヘッド (gcl_memcpy) がかかるようです。

はるかに大きなテスト ファイルを使用すると、1 分間の 2 チャネルの音楽 vs. 1 秒間の 6 チャネルの音楽で、OpenCL コードの測定されたパフォーマンスは同じように見えますが、CPU 使用率は約 50% に低下し、全体がプログラムの実行には約 2 倍の時間がかかります。

Instruments でこの原因を見つけることができず、OpenCL の内外で非常に大きなオーバーヘッドの切り替えが予想されることを示唆するものをまだ読んでいません。

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

signal-processing - vDSP はどうなっていますか?

zrvmul、vvsinf、vvcosf (vForce.h で定義) などの関数を使用しようとすると、「一致する関数がありません」というエラーが発生します。私は加速フレームワークを #include しており、ビルド段階でリンクしています。さらに、vDSP_fft_zip などの他の高速化機能も問題なく使用しています。

もちろん、for ループを使用して問題を回避できます。しかし、誰かが私のために状況を照らすことができますか? vForce 機能を引き続き使用する方法はありますか? もしそうなら、どのように?

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

signal-processing - 信号合成のオーバーラップ加算

この質問が非常に基本的なものである場合は、申し訳ありません。

FFT を使用してオーディオ信号 (現在は単純な正弦波) を時間領域から周波数領域に変換してから、時間領域に戻して元の信号との差を比較しています。

現在私は:
- 重複しないフレーム (フレームごとに 1024 サンプルなど) を取得します。
- そのフレームの FFT
- 周波数ドメイン情報の iFFT
- スピーカーへの出力の送信

編集 (1):
これは現在動作しているようです (入力 = 茶色、出力 = 青のウィンドウのない画像とウィンドウのある画像を参照してください)。
ここに画像の説明を入力
ここに画像の説明を入力
編集終了 (1)

次に、overlapp-add メソッドを実行します。
- 50% のオーバーラップでフレームを取得します (サンプル 0-1023、512-1535、1024-2047...)
- ハニング ウィンドウを ecah フレームに適用します
- FFT
- iFFT
- ?? ? これは私の質問です!!

したがって、iFFT の最後には、1024 サンプルの出力フレームがあります。つまり、最初の 512 サンプルをスピーカーに送信し、残りの 512 サンプル (512 ~ 1023) をバッファーに保持して、次のフレームの最初の 512 サンプルに追加する必要があるということですか? それはそれと同じくらい簡単ですか、それとも私は何かを誤解していますか?

ありがとう!

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

audio - オーディオ分析合成でオーバーラップを追加

入力としてオーディオ信号 (現在は正弦波) を受け取り、次のことを行うコードをいくつか書きました。

  1. n(1024) サンプルのフレームを取る
  2. FFT を適用
  3. iFFT を適用する
  4. 再生出力

このプロセスにより、出力信号は基本的に入力信号と同じになります。

さて、2回目の試みで私は次のことを行います:

  1. 入力からオーバーラップフレームを取得する
  2. ウィンドウ関数を適用する
  3. FFT
  4. iFFT
  5. 出力フレームを重ねる

ステップ 1 で、2 の累乗 (4、8、256...) のホップ サイズ (次のフレームを取得するためにジャンプするサンプル数) を使用してオーバーラップ フレームを取得すると、出力サウンドは滑らかで、元の入力サウンドに似ています。 、しかし、他のホップサイズでは、音が割れ始めます. これは、入力信号の任意の周波数で発生します。質問 1. ホップ サイズが 2^n の場合にのみ音が滑らかになるのはなぜですか? .

現在、私はハニング窓を使用しています。ホップサイズが大きい場合 (例: 512) は、ホップサイズが小さい場合 (例: 64) よりも出力音の音量が小さくなります。ホップ サイズが小さいということは、サンプルがより多くのフレームで再構築され、より多くの信号が追加されることを意味するため、これは予期された動作のようです。質問 2. 音量が元の信号に似るように、出力信号を適切にスケーリングする方法はありますか?

ありがとうございました!

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

ios - ベクトル内のコンポーネントの合計を高速化

コンポーネントを 4 つのブロックで合計して、別の配列から配列を作成したいと思います。たとえば、次のようになります。

これを加速させたい。vDSP や v​​Force など、iOS で利用可能なライブラリを調べましたが、適切なものが見つかりませんでした。最も近い候補は vDSP_vswsum ですが、それは私が望んでいることではありません。これをスピードアップする方法についてのヒントはありますか?

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

ios - Accelerate フレームワーク (vDSP) と Novocaine を使用したバンドパス フィルター オーディオ録音

私は信号処理にかなり慣れていないので、ご容赦ください。iPad から取得したオーディオ録音に適用するバンドパス フィルターを実装しようとしています。録音は、ExtFile 関数と AudioBufferList を使用して Float32 ポインターに変換されています。サンプリングレートは44100Hzです。録音の長さは約 9 秒 (約 396900 サンプル) で、2 ~ 6kHz のチャープと周囲のノイズが含まれています。どの時点でチャープが発生するかを見つけるために、2 ~ 6kHz の周波数範囲で録音をバンドパス フィルター処理する必要があります。バンドパス フィルターを作成するために、次のリソースを参照しました。

https://github.com/bartolsthoorn/NVDSP/blob/master/NVDSP.mm

https://github.com/bartolsthoorn/NVDSP/blob/master/Filters/NVBandpassFilter.m

私の質問は、録音用の float 値の配列を上記のバンドパス フィルターに単純に渡すことはできますか? これを試してみましたが、配列内のすべての値の値を単純に減らすように見えるため、機能しているかどうかはわかりません。レコーディングを通過した後、何が見られると期待すべきですか

ただし、最初に FFT を使用して値を時間領域から周波数領域に変換する必要があると言うリソースを見たことがあります。いくつかの vDSP 関数を使用してこれを行うために、次のコードを試しました。

しかし、この関数から何が返されているのかわかりません。録音をフィルターに渡す前に FFT を適用する必要がある場合、calculateFFT 関数から何を返してフィルターに渡す必要がありますか?

前もって感謝します。

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

ios - vDSP_conv から返される奇妙な結果

私は Accelerate フレームワークを使用してオーディオ信号処理を行い、このvDSP_conv関数を使用して相互相関を実行しました。通常、返される値は次のようになります (左の列は配列のインデックスで、右の列は から返された後のそのインデックスの配列の値ですvDSP_conv)。

しかし、明確な理由もなく、結果が次のようになることがあります。

これらの結果を取得した後、プログラムを再度実行したところ、元の (正しい) 結果に戻りました。他の誰かがこれを経験したことがありますか、またはなぜそれが起こっているのかについて何か考えがありますか?