0

2 つの配列の要素ごとの乗算を実行したいのですが、どちらも複合型ですが、次のエラー メッセージが表示されます。

serge@ubuntu:~/Downloads/OpenCV/opencv-2.4.9/build$ g++ -o myfft myfft.cpp -std=c++14
myfft.cpp:14:0 からインクルードされたファイル:
cs_delay.cpp: 関数 'void cs_delay(CArray&, int, int, int)' 内:
cs_delay.cpp:35:28: エラー: 'operator*' に一致しません (オペランドの型は 'void' と 'Complex {aka std::complex}' です)
         x[j] = ifft(fft(x) * rot[j]);
                            ^
cs_delay.cpp:35:28: 注: 候補は次のとおりです。
myfft.cpp:1:0 からインクルードされたファイル:
/usr/include/c++/4.9/complex:381:5: 注意: テンプレート std::complex std::operator*(const std::complex&, const std::complex&)
     operator*(const complex& __x, const complex& __y)
     ^
/usr/include/c++/4.9/complex:381:5: 注: テンプレート引数の推定/置換に失敗しました:
myfft.cpp:14:0 からインクルードされたファイル:
cs_delay.cpp:35:35: 注: 型が一致していません 'const std::complex' と 'void'
         x[j] = ifft(fft(x) * rot[j]);
                                   ^
myfft.cpp:1:0 からインクルードされたファイル:
/usr/include/c++/4.9/complex:390:5: 注意: テンプレート std::complex std::operator*(const std::complex&, const _Tp&)
     operator*(const complex& __x, const _Tp& __y)
     ^
/usr/include/c++/4.9/complex:390:5: 注: テンプレート引数の推定/置換に失敗しました:
myfft.cpp:14:0 からインクルードされたファイル:
cs_delay.cpp:35:35: 注: 型が一致していません 'const std::complex' と 'void'
         x[j] = ifft(fft(x) * rot[j]);
                                   ^
myfft.cpp:1:0 からインクルードされたファイル:
/usr/include/c++/4.9/complex:399:5: 注意: テンプレート std::complex std::operator*(const _Tp&, const std::complex&)
     operator*(const _Tp& __x, const complex& __y)
     ^
/usr/include/c++/4.9/complex:399:5: 注: テンプレート引数の推定/置換に失敗しました:
myfft.cpp:14:0 からインクルードされたファイル:
cs_delay.cpp:35:35: 注: パラメータ '_Tp' ('void' と 'double') の競合する型を推測しました
         x[j] = ifft(fft(x) * rot[j]);
                                   ^
/usr/include/c++/4.9/valarray:587:0 からインクルードされたファイルで、
                 myfft.cpp:3 から:
/usr/include/c++/4.9/bits/valarray_after.h:404:5: 注意: テンプレート std::_Expr、型名 std::__fun::result_type> std::operator*(const std::_Expr&, const std ::_Expr&)
     _DEFINE_EXPR_BINARY_OPERATOR(*, __乗算)
     ^
/usr/include/c++/4.9/bits/valarray_after.h:404:5: 注: テンプレート引数の推定/置換に失敗しました:
myfft.cpp:14:0 からインクルードされたファイル:
cs_delay.cpp:35:35: 注: 型が一致していません 'const std::_Expr' と 'void'
         x[j] = ifft(fft(x) * rot[j]);
                                   ^
/usr/include/c++/4.9/valarray:587:0 からインクルードされたファイルで、
                 myfft.cpp:3 から:
/usr/include/c++/4.9/bits/valarray_after.h:404:5: 注: テンプレート std::_Expr、型名 std::__fun::result_type> std:

エラーを返す関数:

//cs_delay.cpp
using namespace std;

typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;


void cs_delay(CArray& x, int rate_hz, int delay_s, int n)
{

const size_t N = x.size();
    if (N <= 1) return;

int j;
double cycLen_s;
double nCyc;
double* f = new double[n];
double* phase = new double[n];
Complex* rot = new Complex[n];
cycLen_s = n/rate_hz;
nCyc = delay_s / cycLen_s;
/*************************************************************/
for ( j = 0 ; j < n ; j++ ){

        f[j] =j+floor(n/2);
        f[j] =fmod(f[j], n);
        f[j] =f[j]-floor(n/2);
        phase[j] = -2 * PI * f[j] * nCyc;
        rot[j] = exp(1i*phase[j]);
        std::cout << "rot["<<j<<"] ="<<rot[j] <<std::endl;
        fft(x);
        x *= rot[j];
        ifft(x);
        }
/*************************************************************/
        delete [] f;
        delete [] phase;
        delete [] rot;
}

fft と ifft は次のとおりです。

//fft.cpp
using namespace std;
const double PI = 3.141592653589793238460;


//functions declarations

typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
// Cooley–Tukey FFT (in-place, divide-and-conquer)
// Higher memory requirements and redundancy although more intuitive
void fft(CArray& x)
{
    const size_t N = x.size();
    if (N <= 1) return;

    // divide
    CArray even = x[std::slice(0, N/2, 2)];
    CArray  odd = x[std::slice(1, N/2, 2)];

    // conquer
    fft(even);
    fft(odd);

    // combine
    for (size_t k = 0; k < N/2; ++k)
    {
        Complex t = std::polar(1.0, -2 * PI * k / N) * odd[k];
        x[k    ] = even[k] + t;
        x[k+N/2] = even[k] - t;
    }
}
// inverse fft (in-place)
void ifft(CArray& x)

{
    // conjugate the complex numbers
    x = x.apply(std::conj);

    // forward fft
    fft( x );

    // conjugate the complex numbers again
    x = x.apply(std::conj);

    // scale the numbers
    x /= x.size();
}

ここに私の主な機能があります:

#include <complex>
#include <iostream>
#include <valarray>
#include <malloc.h>
#include <string>
#include <stdlib.h>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <cmath>
#include "fft.cpp"
#include "cs_delay.cpp"
using namespace std;
//const double PI  = 3.141592653589793238460;
char filename[]  = "vidres6.txt";
char filename2[] = "vidres7.txt";

//typedef std::complex<double> Complex;
//typedef std::valarray <Complex> CArray;
/***********************************************************************************************
*                                 function declarations
************************** ******************************************************** ***********/
void fft(CArray& x);
void ifft(CArray& x);
void binFreq(int n);
void cs_delay(CArray& x, int rate_hz, int delay_s, int n);

int main()

{
        int dTest_samples;
        int cTest;
        //cTest = -cTest;  
        int n=299;
        int i;
        int j;
        double x [n];

    /*****************************getting x*******************************/

        string line;
        double Result;
             ifstream myfile (filename);
             if (myfile.is_open())
               {
                 for ( i = 0 ; (i < n) && (myfile >> x[i]) ; ++i)

                        cout << line << '\n';
                         stringstream convert(line);

                         if ( !(convert >> Result) )
                        Result = 0;
                        x[i]=Result;


               }
                else cout << "Unable to open file";
    /***********************************************************************/


    Complex test[n];

    for ( i = 0 ; i < n ; ++i )
    test[i] = x[i];

    CArray data(test,n);

    // forward fft
    fft(data);

    std::cout << "fft" << std::endl;
    for (int i = 0; i <n; ++i)
    {
        cout << data[i] << endl;
    }

    // inverse fft
    ifft(data);

    std::cout << std::endl << "ifft" << std::endl;
    for (int i = 0; i <n; ++i)
    {
        std::cout << data[i] << std::endl;
    }

    return 0;
}
4

1 に答える 1

0

fftは何も返しません ( を返しますvoid) が、結果に何か (" ") を掛けようとしていますfft(x) * rot[j]。これはうまくいきません。

ifft同じ行で、 toの結果を代入しますが、x[j]ifftも返しません。

fftと が引数をその場で正しく変更していると仮定してifft、行を置き換えてみてください

x[j] = ifft(fft(x) * rot[j]);

fft(x);
x *= rot[j];
ifft(x);
于 2016-06-07T15:16:23.347 に答える