1

フーリエ変換を使用して実装された数値計算の問題があります。FFT を実装するために fftw を使用していますが、FFT される信号はかなり奇妙です。信号の半分は 1 つの配列からのもので、残りの半分は他の配列からのものです。現在のコードでは、データをコピーするだけです

#include <iostream>
#include <vector>
#include <complex>
#include <fftw3.h>

using namespace std;

void main(void)
{
  std::vector< std::complex<double> > V1(4);
  std::vector< std::complex<double> > V2(4);
  std::vector< std::complex<double> > V(8);

  for (int i=0; i<4; i++) V[i] = V1[i] = std::complex<double>(i, i);
  for (int i=0; i<4; i++) V[i+4] = V2[i] = std::complex<double>(i+4, i+4);

  fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
  fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
  fftw_execute(plan);
}

このコードはかなりうまく機能します。しかし、データをコピーする代わりに、大きな配列で V1 と V2 を参照したいと考えています。次のコードを試してみましたが、うまくいきません。入力配列が ** (ダブル ポインター?) であると言っています。

std::vector< std::complex<double> > V1(4);
std::vector< std::complex<double> > V2(4);
fftw_complex *in[8];
for (int i=0; i<4; i++) in[i] = reinterpret_cast<fftw_complex*>(&V1[i]);
for (int i=0; i<4; i++) in[i+4] = reinterpret_cast<fftw_complex*>(&V2[i]);

for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);

fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
fftw_execute(plan);

とにかく、「参照」配列をfftwの入力として作成することですか? 2d 配列の場合はどうなりますか? 2d-fftw の入力配列が 2 つの別個の 2d 配列を参照することは可能ですか?

4

1 に答える 1

1

私があなたを正しく理解していれば、あなたは 2 つの別々のベクトル オブジェクトを取得したいと考えています。

vector<fftw_complex> V1, V2;

それぞれのコンテンツを組み合わせて別のコンテンツを形成する

vector<fftw_complex> V;

コピーなしで。V1and together が占めるメモリV2は連続していないため、これは不可能です。Vただし、 (任意の)が占有するメモリはvector連続している必要があります。与えられた例でコピーを避けたい場合は、次のようにポインターを使用して行うことができます。

void main(void)
{
    std::complex<double>* V1;
    std::complex<double>* V2;
    std::vector< std::complex<double> > V(8);

    V1=&V[0];V2=&V[4];

    for (int i=0; i<4; i++) V1[i] = std::complex<double>(i, i);
    for (int i=0; i<4; i++) V2[i] = std::complex<double>(i+4, i+4);

    fftw_complex* in = reinterpret_cast<fftw_complex*>(&V[0]);
    fftw_plan plan = fftw_plan_dft_1d(8, in, in, FFTW_FORWARD, FFTW_MEASURE);
    fftw_execute(plan);
 }

もちろん、これはあなたのプログラムでは実行可能かもしれませんし、不可能かもしれません。2 番目のコード セグメントには大きな問題があります。

fftw_complex *in[8];

8つの複素数の配列ではなく、複素数への8つのポインターの配列を定義するため、入力として適合しません。また、適合したとしてfftw_plan_dft_1dも、メモリのシーケンスを供給しているため、結果は意味がありませんあなたのデータの代わりにアドレス。

于 2013-09-19T03:47:33.310 に答える