Add ifftshift
This commit is contained in:
@@ -837,13 +837,30 @@ Matrix Aurora::ifft_symmetric(const Matrix &aMatrix,long length)
|
|||||||
|
|
||||||
void Aurora::fftshift(Matrix &aMatrix){
|
void Aurora::fftshift(Matrix &aMatrix){
|
||||||
int backwardLength = aMatrix.getDimSize(0)/2;
|
int backwardLength = aMatrix.getDimSize(0)/2;
|
||||||
|
if (aMatrix.getDimSize(0)%2!=0)++backwardLength;
|
||||||
int forwardLength = aMatrix.getDimSize(0) - backwardLength;
|
int forwardLength = aMatrix.getDimSize(0) - backwardLength;
|
||||||
double* buffer = malloc(forwardLength,true);
|
double* buffer = malloc(forwardLength,true);
|
||||||
|
int valueStep = aMatrix.isComplex()?2:1;
|
||||||
for (int i = 0; i<aMatrix.getDimSize(1); ++i) {
|
for (int i = 0; i<aMatrix.getDimSize(1); ++i) {
|
||||||
double* dataPtr = aMatrix.getData()+aMatrix.getDimSize(0)*i*2;
|
double* dataPtr = aMatrix.getData()+aMatrix.getDimSize(0)*i*valueStep;
|
||||||
cblas_dcopy(forwardLength*2, dataPtr+backwardLength*2, 1, buffer, 1);
|
cblas_dcopy(forwardLength*valueStep, dataPtr+backwardLength*valueStep, 1, buffer, 1);
|
||||||
cblas_dcopy(backwardLength*2, dataPtr, 1, dataPtr+forwardLength*2, 1);
|
cblas_dcopy(backwardLength*valueStep, dataPtr, 1, dataPtr+forwardLength*valueStep, 1);
|
||||||
cblas_dcopy(forwardLength*2, buffer, 1, dataPtr, 1);
|
cblas_dcopy(forwardLength*valueStep, buffer, 1, dataPtr, 1);
|
||||||
|
}
|
||||||
|
Aurora::free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Aurora::ifftshift(Matrix &aMatrix){
|
||||||
|
int forwardLength= aMatrix.getDimSize(0)/2;
|
||||||
|
if (aMatrix.getDimSize(0)%2!=0)++forwardLength;
|
||||||
|
int backwardLength = aMatrix.getDimSize(0) - forwardLength;
|
||||||
|
double* buffer = malloc(forwardLength,true);
|
||||||
|
int valueStep = aMatrix.isComplex()?2:1;
|
||||||
|
for (int i = 0; i<aMatrix.getDimSize(1); ++i) {
|
||||||
|
double* dataPtr = aMatrix.getData()+aMatrix.getDimSize(0)*i*valueStep;
|
||||||
|
cblas_dcopy(forwardLength*valueStep, dataPtr+backwardLength*valueStep, 1, buffer, 1);
|
||||||
|
cblas_dcopy(backwardLength*valueStep, dataPtr, 1, dataPtr+forwardLength*valueStep, 1);
|
||||||
|
cblas_dcopy(forwardLength*valueStep, buffer, 1, dataPtr, 1);
|
||||||
}
|
}
|
||||||
Aurora::free(buffer);
|
Aurora::free(buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,12 @@ namespace Aurora
|
|||||||
*/
|
*/
|
||||||
void fftshift(Matrix &aMatrix);
|
void fftshift(Matrix &aMatrix);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fftshift,在原有数据上进行修改,将fft的数据的前半部分和后半部分交换,支持2D数据
|
||||||
|
* @param aMatrix
|
||||||
|
*/
|
||||||
|
void ifftshift(Matrix &aMatrix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 逆fft,支持到2维,输入必须是复数,输出必是复数
|
* 逆fft,支持到2维,输入必须是复数,输出必是复数
|
||||||
* @attention 如有需要可使用real去除虚部
|
* @attention 如有需要可使用real去除虚部
|
||||||
|
|||||||
@@ -369,6 +369,17 @@ TEST_F(Function2D_Test, fftAndComplexAndIfft){
|
|||||||
EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[4].imag()));
|
EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[4].imag()));
|
||||||
EXPECT_DOUBLE_EQ(-1.0, fourDecimalRound(result3[13].real()));
|
EXPECT_DOUBLE_EQ(-1.0, fourDecimalRound(result3[13].real()));
|
||||||
EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[16].imag()));
|
EXPECT_DOUBLE_EQ(-3.4641, fourDecimalRound(result3[16].imag()));
|
||||||
|
{
|
||||||
|
auto fm = Aurora::Matrix::fromRawData(new double[7]{1,2,3, 4, 5, 6, 7},7,1);
|
||||||
|
Aurora::fftshift(fm);
|
||||||
|
EXPECT_DOUBLE_EQ(5, fm[0]);
|
||||||
|
EXPECT_DOUBLE_EQ(1, fm[3]);
|
||||||
|
EXPECT_DOUBLE_EQ(4, fm[6]);
|
||||||
|
Aurora::ifftshift(fm);
|
||||||
|
EXPECT_DOUBLE_EQ(1, fm[0]);
|
||||||
|
EXPECT_DOUBLE_EQ(4, fm[3]);
|
||||||
|
EXPECT_DOUBLE_EQ(7, fm[6]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Function2D_Test, hilbert) {
|
TEST_F(Function2D_Test, hilbert) {
|
||||||
|
|||||||
Reference in New Issue
Block a user