I am trying to multiple every element of a complex array by a multiplying factor, for the application of fourier transform. I am applying a hanning window filter to a complex file of a wave function.
I am working in C++ with CodeBlocks, I keep getting -->
error: invalid types 'double[int]' for array subscript
My code is here:
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <cmath>
#define PI 3.14159265359
using namespace std;
class Complex {
public:
Complex();
Complex(double realNum);
Complex(double realNum, double imagNum);
//Complex(double real = 0.0, double imaginary = 0.0); This avoids the 3 above?
Complex(const Complex& obj);
private:
double real;
double imaginary;
};
Complex::Complex(const Complex& obj) {
real = obj.real;
imaginary = obj.imaginary;
}
Complex::Complex () {
real = 0;
imaginary = 0;
}
Complex::Complex (double realNum) {
real = realNum;
imaginary = 0;
}
Complex::Complex (double realNum, double imagNum) {
real = realNum;
imaginary = imagNum;
}
int main () {
Complex *complexArray = new Complex[1000];
ifstream myfile("myfile.txt");
/* this will match the complex numbers of the form - 123.123 + 14.1244 or 123 - 1343.193 and so on,
basically assumes that both the real and the imaginary parts are both doubles*/
regex reg_obj("^[ ]*([-]?\\d+(\\.\\d+)?)\\s*([+-])\\s*(\\d+(\\.\\d+)?)i");
smatch sm;
string line;
int i = 0;
double real, imag;
if (myfile.is_open()) {
while (! myfile.eof()) {
getline(myfile, line);
if(regex_search(line, sm, reg_obj)){
real = stod(sm[1]); // this ([-]?\\d+(\\.\\d+)?) is group 1 and will match the real part of the number
imag = stod(sm[4]); // second group (\\d+(\\.\\d+)?)i is group 4 which matches the imaginary part of the complex number without matching + or - which are taken care of separately because there could be space between the +|- symbol and the imaginary part
if(sm[3]=="-") imag = -imag;
complexArray[i] = Complex(real, imag);
i++;
}
// Hanning Window
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
}
myfile.close();
}else {
cout << "Error. Could not find/open file." ;
}
cout << complexArray << endl;
return 0;
};
I would like to multiply each element of the complex object by each element in the multiplication array. I'm not sure of the correct way to do this.
For starters in this loop
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
the variable multiplier
is declared as a scalar object of the type double. So you need to write
complexArray[i] = multiplier * complexArray[i];
instead of
complexArray[i] = multiplier[i] * complexArray[i];
Also you need to overload the operator *
for your class.
For example
class Complex {
public:
Complex();
Complex(double realNum);
Complex(double realNum, double imagNum);
//Complex(double real = 0.0, double imaginary = 0.0); This avoids the 3 above?
Complex(const Complex& obj);
friend const Complex operator *( double, const Complex & );
private:
double real;
double imaginary;
};
//...
const Complex operator *( double value, const Complex &c )
{
return { value * c.real, value * c.imaginary };
}
Also the condition in the while loop
while (! myfile.eof()) {
getline(myfile, line);
//...
substitute for
while ( getline(myfile, line) ) {
//...
And this loop
for (int i = 0; i < 1000; i++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[i] = multiplier[i] * complexArray[i];
}
should be outside the while loop. For example
for ( int j = 0; j < i; j++) {
double multiplier = 0.5 * (1 - cos(2*PI*i/999));
complexArray[j] = multiplier * complexArray[j];
}