0

画像加工アプリを譲り受けました。ここで物事を理解しようとしています。3 つの質問があります。1) F2C、C2C、C2F の順序は正しいですか? 2) C2C を一方向に 1 回実行する必要がありますか? 3) どちらの方向 (前方または後方) を使用する必要がありますか?

バックグラウンド:

入力と出力は 2D 画像です。

最初に R2C が cufftF2C (既製の cuda) を使用して実行され、次に C2C が実行されます。これは、元の開発者によって手作業でコーディングされました。最後に、C2R は cufftC2F (既製の cuda) を使用して行われます。

その結果、見苦しいジグザグ線のみが表示される素晴らしい画像が得られます。元の開発者は 1D プラン (nx = x およびバッチ = y) を使用していました。これらを 2D プラン (nx = x および ny = y) に置き換えたいと考えています。また、自家栽培の C2C を既製の cufftC2C に置き換えたいと考えています。

4

1 に答える 1

1

1) [R2C]、C2C、[C2R] の順序は正しいですか? いいえ、フーリエ変換には空間と周波数の 2 つのドメインがあります。変換は、 で空間から周波数へCUFFT_FORWARD、 で周波数から空間へと進みCUFFT_INVERSEます。

2) C2C を一方向に 1 回実行する必要がありますか? エルミート対称性の使用法によっては、必ずしも必要ではありませんC2C(以下を参照)。

3) どちらの方向 (前方または後方) を使用する必要がありますか? 画像処理フィルタを適用する場合、出力は入力と同じ空間にある可能性が高いため、1 つの順変換と 1 つの逆変換として適用する必要があります。

データのレイアウトとR2C最適C2R化に関する注意事項

C2RまたはR2C変換を使用する場合は、周波数空間ベクトルcufft のエルミート対称性を利用しているため、ベクトルの前半のみを格納します (残りの部分は変更されません)。

一般的な複素数から複素数 (C2C) への変換とは別に、cuFFT は実数から複素数 (R2C) と複素数から実数 (C2R) の 2 つのタイプを効率的に実装します。多くの実用的なアプリケーションでは、入力ベクトルは実数値です。この場合、出力がエルミート対称性 ( X k = XN − k ∗ 、星印は複素共役を表す) を満たすことは簡単に示されます。逆も真です。複素エルミート入力の場合、逆変換は純粋に実数値になります。cuFFT はこの冗長性を利用して、エルミート ベクトルの前半のみで機能します。

周波数領域で実行している操作が同じエルミート対称性を持たない場合、最適化はもはや真ではなく、C2R操作は期待される結果を提供しません。

また、 の場合とは少し異なるアプローチのデータ要件とレイアウトにも注意してくださいC2C

于 2016-05-27T08:14:22.640 に答える