Ошибка вычисления комплексного значения в кросс-спектральной плотности

Я очень новичок в c ++, и я хочу сделать некоторые спектральные вычисления, в этом случае вычисление «перекрестной спектральной плотности» двух сигналов (vecFirst, vecSecond), которые уже обработаны с помощью преобразования FastFourierTransformation. В результате чего freqvec а также freqvec2, содержащий комплексные значения для каждой частоты.

Для этого расчета важно сохранить каждое значение как комплексное значение. Например: CoSpectrum, который рассчитывается в строка 6, должен иметь комплексное значение в результате.

RowVectorXcd freqvec;
RowVectorXcd freqvec2;
fft.fwd(freqvec, vecFirst);
fft.fwd(freqvec2, vecSecond);

// # Create conjugate complex
freqvec.conjugate();
freqvec2.conjugate();
RowVectorXcd Rxy(freqvec.cols());
for (int i = 0; i < freqvec.cols(); i++) {
std::complex<double>CoSpectrum( freqvec(i).real() * freqvec2(i).real() + freqvec(i).imag() * freqvec2(i).imag()) ;
std::complex<double>QuadSpectrum( freqvec(i).real() * freqvec2(i).imag() - freqvec(i).real() * freqvec2(i).imag() ) ;
std::complex<double>CoSpectrum_sqr = CoSpectrum * CoSpectrum ;
std::complex<double>QuadSpectrum_sqr = QuadSpectrum * QuadSpectrum ;
Rxy(i) = sqrt(std::complex<double>(CoSpectrum_sqr + QuadSpectrum_sqr)) ;
}
}

К сожалению, я получаю только сложные значения с нулем в мнимой части.

Кто-нибудь может сказать мне, почему?
Я угадал выражение freqvec(i).real() возвращает только двойное значение, но как я могу получить реальную часть, но оставить ее сложным значением? Или, соответственно, просто умножьте мнимую часть комплексного числа на вещественную часть другого и оставьте в результате сложный дубль.

Спасибо за любую помощь заранее.

1

Решение

Сначала: большое спасибо. Я думал о чем-то подобном, но не был уверен. Спасибо, что есть такие хорошие люди, как вы, которые заботятся о новичках.

Поэтому я изменил фрагмент кода следующим образом:

    // ### Attempting to compute the Frequency Power for Frequency Bins..
RowVectorXcd freqvec;
RowVectorXcd freqvec2;
fft.fwd(freqvec, vecFirst);
fft.fwd(freqvec2, vecSecond);
std::cout<<"freqvec:"<<freqvec.cols()<<std::endl;

// ### Attempting to compute the PowerSpectralDensitiy(PSD) and CrossSpectralDensity(CSD). The cross-spectral density is the Fourier transform of the cross-correlation function.
RowVectorXcd Rxy(n_Epochs, freqvec.cols());
RowVectorXcd Rxx(n_Epochs, freqvec.cols());
RowVectorXcd Ryy(n_Epochs, freqvec.cols());
for (int i = 0; i < n_Epochs; i++) {
std::complex<double>CoSpectrum( std::complex<double>(freqvec(i).real(),0) * std::complex<double>(freqvec2(i).real(),0) + std::complex<double>(0,freqvec(i).imag()) * std::complex<double>(0, freqvec2(i).imag()) ) ;
std::complex<double>QuadSpectrum( std::complex<double>(freqvec(i).real(), 0) * std::complex<double>(0, freqvec2(i).imag()) - std::complex<double>(0,freqvec(i).imag()) * std::complex<double>(freqvec2(i).real(), 0) ) ;
std::complex<double>CoSpectrum_sqr = CoSpectrum * CoSpectrum ;
std::complex<double>QuadSpectrum_sqr = QuadSpectrum * QuadSpectrum ;
Rxy(i) = sqrt(std::complex<double>(CoSpectrum_sqr + QuadSpectrum_sqr)) ;
Rxx(i) = std::complex<double>(freqvec(i).real(), 0) * std::complex<double>(freqvec(i).real(), 0) + std::complex<double>(0, freqvec(i).imag()) * std::complex<double>(0, freqvec(i).imag()) ;
Ryy(i) = std::complex<double>(freqvec2(i).real(), 0) * std::complex<double>(freqvec2(i).real(), 0) + std::complex<double>(0, freqvec2(i).imag()) * std::complex<double>(0, freqvec2(i).imag()) ;
}
}

Это решило мою проблему. Еще раз спасибо за хорошее обсуждение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]