diff --git a/src/Function2D.cu b/src/Function2D.cu index 8a4fa8f..25e817f 100644 --- a/src/Function2D.cu +++ b/src/Function2D.cu @@ -1337,12 +1337,12 @@ CudaMatrix Aurora::fft(const CudaMatrix &aMatrix, long aFFTSize){ float* data = nullptr; cudaMalloc((void**)&data, sizeof(float)*2*bufferSize); - if (aMatrix.isComplex()){ +if (aMatrix.isComplex()){ complexCopyKernel<<>>(aMatrix.getData(), data, needCopySize, aMatrix.getDimSize(0),ColEleCount); } else{ - complexFillKernel<<>>(aMatrix.getData(), data, needCopySize, aMatrix.getDimSize(0),ColEleCount); - } + complexFillKernel<<>>(aMatrix.getData(), data, needCopySize, aMatrix.getDimSize(0),ColEleCount); +} auto ret = Aurora::CudaMatrix::fromRawData(data,ColEleCount,aMatrix.getDimSize(1),1,Complex); ExecFFT(ret,0); return ret; @@ -1503,4 +1503,35 @@ CudaMatrix Aurora::sub2ind(const CudaMatrix &aVMatrixSize, std::vector>>(data, aLength / 2 - 1); + cudaDeviceSynchronize(); + return real(ifft(CudaMatrix::fromRawData(data,aLength,1,1,Complex))); } \ No newline at end of file diff --git a/src/Function2D.cuh b/src/Function2D.cuh index 8abaa45..2a3e502 100644 --- a/src/Function2D.cuh +++ b/src/Function2D.cuh @@ -69,6 +69,13 @@ namespace Aurora */ CudaMatrix sub2ind(const CudaMatrix &aVMatrixSize, std::vector aSliceIdxs); + /** + * Symmetric逆fft,支持到2维,输入必须是复数,输出必是实数 + * @param aMatrix + * @return ifft后的实数矩阵 + */ + CudaMatrix ifft_symmetric(const CudaMatrix &aMatrix,long aLength); + } #endif // __FUNCTION2D_CUDA_H__ \ No newline at end of file diff --git a/test/Function2D_Cuda_Test.cpp b/test/Function2D_Cuda_Test.cpp index 584345d..e9f7b0e 100644 --- a/test/Function2D_Cuda_Test.cpp +++ b/test/Function2D_Cuda_Test.cpp @@ -894,4 +894,17 @@ TEST_F(Function2D_Cuda_Test, sub2ind) { { EXPECT_FLOAT_EQ(result1[i], result2[i]); } +} + +TEST_F(Function2D_Cuda_Test, ifft_symmetric) { + float *input = new float[18]{10,2,1,3,4,4,16,3,1,2,15,-2,1,-3,4,-4,1,-3}; + auto matrixHost = Aurora::Matrix::fromRawData(input,9,1,1,Aurora::Complex); + auto matrixDevice = matrixHost.toDeviceMatrix(); + auto result1 = Aurora::ifft_symmetric(matrixHost,18); + auto result2 = Aurora::ifft_symmetric(matrixDevice,18).toHostMatrix(); + EXPECT_FLOAT_EQ(result1.getDataSize(),result2.getDataSize()); + for(unsigned int i=0; i