diff --git a/src/Function2D.cpp b/src/Function2D.cpp index f32fcf4..c7ba07c 100644 --- a/src/Function2D.cpp +++ b/src/Function2D.cpp @@ -578,23 +578,34 @@ Matrix Aurora::median(const Matrix &aMatrix) { } } -Matrix Aurora::fft(const Matrix &aMatrix) { +Matrix Aurora::fft(const Matrix &aMatrix, long aFFTSize) { double *output = nullptr; mkl_free_buffers(); - output = malloc(aMatrix.getDataSize(), true); + MKL_LONG rowSize = (aFFTSize>0)?aFFTSize:aMatrix.getDimSize(0); + //实际需要copy赋值的非0值 + MKL_LONG needCopySize = (rowSize* result = (std::complex*)ret.getData(); + auto fftrett = Aurora::fft(ma); + std::complex* result = (std::complex*)fftrett.getData(); //检验fft结果与matlab是否对应 EXPECT_DOUBLE_EQ(0.0729, fourDecimalRound(result[1].real())); EXPECT_DOUBLE_EQ(2.4899, fourDecimalRound(result[2].imag())); @@ -344,12 +344,33 @@ TEST_F(Function2D_Test, fftAndComplexAndIfft){ //检验fft的结果是否共轭 EXPECT_DOUBLE_EQ(0, result[4].imag()+result[6].imag()); EXPECT_DOUBLE_EQ(0, result[4].real()-result[6].real()); - ret= Aurora::ifft(ret); + auto ret= Aurora::ifft(fftrett); std::complex* ifftResult = (std::complex*)ret.getData(); EXPECT_DOUBLE_EQ(fourDecimalRound(ifftResult[1].real()),1.0); EXPECT_DOUBLE_EQ(fourDecimalRound(ifftResult[3].real()),2.0); EXPECT_DOUBLE_EQ(fourDecimalRound(ifftResult[11].real()),1.0); EXPECT_DOUBLE_EQ(fourDecimalRound(ifftResult[13].real()),2.0); + Aurora::fftshift(fftrett); + EXPECT_DOUBLE_EQ(0.0729, fourDecimalRound(result[6].real())); + EXPECT_DOUBLE_EQ(2.4899, fourDecimalRound(result[7].imag())); + EXPECT_DOUBLE_EQ(-2., fourDecimalRound(result[10].real())); + EXPECT_DOUBLE_EQ(-0.2245, fourDecimalRound(result[11].imag())); + + auto fftrett2 = Aurora::fft(ma,5); + auto result2 = (std::complex*)fftrett2.getData(); + //检验fft结果与matlab是否对应 + EXPECT_DOUBLE_EQ(0.3090, fourDecimalRound(result2[1].real())); + EXPECT_DOUBLE_EQ(-1.3143, fourDecimalRound(result2[2].imag())); + EXPECT_DOUBLE_EQ(-0.8090, fourDecimalRound(result2[7].real())); + EXPECT_DOUBLE_EQ(1.3143, fourDecimalRound(result2[8].imag())); + + auto fftrett3 = Aurora::fft(ma,12); + auto result3 = (std::complex*)fftrett3.getData(); + //检验fft结果与matlab是否对应 + EXPECT_DOUBLE_EQ(-1.0, fourDecimalRound(result3[1].real())); + EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[4].imag())); + EXPECT_DOUBLE_EQ(-1.0, fourDecimalRound(result3[13].real())); + EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[16].imag())); } TEST_F(Function2D_Test, hilbert) {