元素用C两个阵列的方式乘法/ C++

问题描述:

我想执行元两个阵列的方式乘法,两者都是类型的复杂的,但我收到以下错误消息:元素用C两个阵列的方式乘法/ C++

[email protected]:~/Downloads/OpenCV/opencv-2.4.9/build$ g++ -o myfft myfft.cpp -std=c++14 
In file included from myfft.cpp:14:0: 
cs_delay.cpp: In function ‘void cs_delay(CArray&, int, int, int)’: 
cs_delay.cpp:35:28: error: no match for ‘operator*’ (operand types are ‘void’ and ‘Complex {aka std::complex}’) 
     x[j] = ifft(fft(x) * rot[j]); 
          ^
cs_delay.cpp:35:28: note: candidates are: 
In file included from myfft.cpp:1:0: 
/usr/include/c++/4.9/complex:381:5: note: template 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: note: template argument deduction/substitution failed: 
In file included from myfft.cpp:14:0: 
cs_delay.cpp:35:35: note: mismatched types ‘const std::complex’ and ‘void’ 
     x[j] = ifft(fft(x) * rot[j]); 
           ^
In file included from myfft.cpp:1:0: 
/usr/include/c++/4.9/complex:390:5: note: template std::complex std::operator*(const std::complex&, const _Tp&) 
    operator*(const complex& __x, const _Tp& __y) 
    ^
/usr/include/c++/4.9/complex:390:5: note: template argument deduction/substitution failed: 
In file included from myfft.cpp:14:0: 
cs_delay.cpp:35:35: note: mismatched types ‘const std::complex’ and ‘void’ 
     x[j] = ifft(fft(x) * rot[j]); 
           ^
In file included from myfft.cpp:1:0: 
/usr/include/c++/4.9/complex:399:5: note: template std::complex std::operator*(const _Tp&, const std::complex&) 
    operator*(const _Tp& __x, const complex& __y) 
    ^
/usr/include/c++/4.9/complex:399:5: note: template argument deduction/substitution failed: 
In file included from myfft.cpp:14:0: 
cs_delay.cpp:35:35: note: deduced conflicting types for parameter ‘_Tp’ (‘void’ and ‘double’) 
     x[j] = ifft(fft(x) * rot[j]); 
           ^
In file included from /usr/include/c++/4.9/valarray:587:0, 
       from myfft.cpp:3: 
/usr/include/c++/4.9/bits/valarray_after.h:404:5: note: template std::_Expr, typename std::__fun::result_type> std::operator*(const std::_Expr&, const std::_Expr&) 
    _DEFINE_EXPR_BINARY_OPERATOR(*, __multiplies) 
    ^
/usr/include/c++/4.9/bits/valarray_after.h:404:5: note: template argument deduction/substitution failed: 
In file included from myfft.cpp:14:0: 
cs_delay.cpp:35:35: note: mismatched types ‘const std::_Expr’ and ‘void’ 
     x[j] = ifft(fft(x) * rot[j]); 
           ^
In file included from /usr/include/c++/4.9/valarray:587:0, 
       from myfft.cpp:3: 
/usr/include/c++/4.9/bits/valarray_after.h:404:5: note: template std::_Expr, typename 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; 
} 

fft不返回任何东西(它返回void),但你想的东西乘以结果(“fft(x) * rot[j]”)。这是行不通的。

在同一行上,您将ifft的结果分配给x[j],但ifft也不返回任何内容。

假设fftifft正确地修改他们的论点就地,尝试更换线

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

通过

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

我已经做了改变,现在我得到这样的:cs_delay。 cpp:在函数'void cs_delay(CArray&,int,int,int)'中: cs_delay.cpp:32:16:error:无效初始化类型为'CArray&{aka std :: valarray >&}'来自a n类型'std :: _Expr ,std ::复杂>,std ::复杂>' ifft(x * rot [j]); ^ 从myfft.cpp包含的文件中:13:0: fft.cpp:46:6:注意:在传递参数1'void ifft(CArray&)' void ifft(CArray&x) – Serge

+0

@Serge:Ah ,那是因为'x * rot [j]'是临时的,不能作为非const引用传递。试试这个改变。 – Kundor

+0

这似乎工作,我没有得到任何更多的错误,谢谢!最后一件事,我如何检索ifft(x)的结果,以便稍后在我的程序中使用它? ,我正在考虑像x = ifft(x)这样的东西,我可以这样做吗? – Serge