Add fft,ifft,fftshift,ifftshift and their unittest
This commit is contained in:
@@ -40,9 +40,9 @@ TEST_F(Function2D_Cuda_Test, min)
|
||||
dB = B.toDeviceMatrix();
|
||||
long r,c;
|
||||
|
||||
auto ret1 = Aurora::min(B, Aurora::FunctionDirection::Column,r,c);
|
||||
auto ret1 = Aurora::min(B, Aurora::Column,r,c);
|
||||
|
||||
auto ret2 = Aurora::min(dB, Aurora::FunctionDirection::Column,r,c);
|
||||
auto ret2 = Aurora::min(dB, Aurora::Column,r,c);
|
||||
|
||||
ASSERT_EQ(ret1.getDimSize(0),ret2.getDimSize(0));
|
||||
ASSERT_EQ(ret1.getDimSize(1),ret2.getDimSize(1));
|
||||
@@ -615,6 +615,120 @@ TEST_F(Function2D_Cuda_Test, sort)
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Function2D_Cuda_Test, fft)
|
||||
{
|
||||
{
|
||||
float *input = new float[20]{1,1,0,2,2,0,1,1,0,2,1,1,0,2,2,0,1,1,0,2};
|
||||
auto ma = Aurora::Matrix::fromRawData(input,10,2).toDeviceMatrix();
|
||||
auto fftrett = Aurora::fft(ma);
|
||||
auto fftrettH = fftrett.toHostMatrix();
|
||||
std::complex<float>* result = (std::complex<float>*)fftrettH.getData();
|
||||
//检验fft结果与matlab是否对应
|
||||
EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[1].real()));
|
||||
EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[2].imag()));
|
||||
EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[11].real()));
|
||||
EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[12].imag()));
|
||||
//检验fft的结果是否共轭
|
||||
EXPECT_FLOAT_EQ(0, result[4].imag()+result[6].imag());
|
||||
EXPECT_FLOAT_EQ(0, result[4].real()-result[6].real());
|
||||
|
||||
|
||||
auto ret= Aurora::ifft(fftrett);
|
||||
auto retH = ret.toHostMatrix();
|
||||
std::complex<float>* ifftResult = (std::complex<float>*)retH.getData();
|
||||
EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[1].real()),1.0);
|
||||
EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[3].real()),2.0);
|
||||
EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[11].real()),1.0);
|
||||
EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[13].real()),2.0);
|
||||
// Aurora::fftshift(fftrett);
|
||||
// EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[6].real()));
|
||||
// EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[7].imag()));
|
||||
// EXPECT_FLOAT_EQ(-2., fourDecimalRound(result[10].real()));
|
||||
// EXPECT_FLOAT_EQ(-0.2245, fourDecimalRound(result[11].imag()));
|
||||
|
||||
auto fftrett2 = Aurora::fft(ma,5);
|
||||
auto fftrett2H =fftrett2.toHostMatrix();
|
||||
|
||||
auto result2 = (std::complex<float>*)fftrett2H.getData();
|
||||
//检验fft结果与matlab是否对应
|
||||
EXPECT_FLOAT_EQ(0.3090, fourDecimalRound(result2[1].real()));
|
||||
EXPECT_FLOAT_EQ(-1.3143, fourDecimalRound(result2[2].imag()));
|
||||
EXPECT_FLOAT_EQ(-0.8090, fourDecimalRound(result2[7].real()));
|
||||
EXPECT_FLOAT_EQ(1.3143, fourDecimalRound(result2[8].imag()));
|
||||
|
||||
auto fftrett3 = Aurora::fft(ma,12);
|
||||
auto fftrett3H = fftrett3.toHostMatrix();
|
||||
|
||||
auto result3 = (std::complex<float>*)fftrett3H.getData();
|
||||
//检验fft结果与matlab是否对应
|
||||
EXPECT_FLOAT_EQ(-1.0, fourDecimalRound(result3[1].real()));
|
||||
EXPECT_FLOAT_EQ(-3.4641, fourDecimalRound(result3[4].imag()));
|
||||
EXPECT_FLOAT_EQ(-1.0, fourDecimalRound(result3[13].real()));
|
||||
EXPECT_FLOAT_EQ(-3.4641, fourDecimalRound(result3[16].imag()));
|
||||
}
|
||||
{
|
||||
float *input = new float[20]{1,1,0,2,2,0,1,1,0,2,1,1,0,2,2,0,1,1,0,2};
|
||||
auto ma = Aurora::Matrix::fromRawData(input,10,2);
|
||||
auto maD = ma.toDeviceMatrix();
|
||||
auto ret1 = Aurora::ifft(Aurora::fft(ma),12);
|
||||
auto ret2 = Aurora::ifft(Aurora::fft(maD),12);
|
||||
for (size_t i = 0; i < ret1.getDataSize(); i++)
|
||||
{
|
||||
EXPECT_FLOAT_AE(ret1[i], ret2.getValue(i));
|
||||
}
|
||||
ret1 = Aurora::ifft(Aurora::fft(ma),8);
|
||||
ret2 = Aurora::ifft(Aurora::fft(maD),8);
|
||||
for (size_t i = 0; i < ret1.getDataSize(); i++)
|
||||
{
|
||||
EXPECT_FLOAT_AE(ret1[i], ret2.getValue(i));
|
||||
}
|
||||
|
||||
}
|
||||
{
|
||||
float * data = new float[250000];
|
||||
for (size_t i = 0; i < 250000; i++)
|
||||
{
|
||||
data[i] = i%500;
|
||||
}
|
||||
auto fm = Aurora::Matrix::fromRawData(data,500,250,1,Aurora::Complex);
|
||||
auto fmD = fm.toDeviceMatrix();
|
||||
Aurora::fftshift(fm);
|
||||
Aurora::fftshift(fmD);
|
||||
for (size_t i = 0; i < fm.getDataSize()*2; i++)
|
||||
{
|
||||
EXPECT_FLOAT_AE(fm[i], fmD.getValue(i));
|
||||
}
|
||||
Aurora::ifftshift(fm);
|
||||
Aurora::ifftshift(fmD);
|
||||
for (size_t i = 0; i < fm.getDataSize()*2; i++)
|
||||
{
|
||||
EXPECT_FLOAT_AE(fm[i], fmD.getValue(i));
|
||||
}
|
||||
}
|
||||
{
|
||||
float * data = new float[333*500];
|
||||
for (size_t i = 0; i < 333*500; i++)
|
||||
{
|
||||
data[i] = i%333;
|
||||
}
|
||||
auto fm = Aurora::Matrix::fromRawData(data,333,250,1,Aurora::Complex);
|
||||
auto fmD = fm.toDeviceMatrix();
|
||||
Aurora::fftshift(fm);
|
||||
Aurora::fftshift(fmD);
|
||||
for (size_t i = 0; i < fm.getDataSize()*2; i++)
|
||||
{
|
||||
ASSERT_FLOAT_EQ(fm[i], fmD.getValue(i))<<"index:"<<i;
|
||||
}
|
||||
Aurora::ifftshift(fm);
|
||||
Aurora::ifftshift(fmD);
|
||||
for (size_t i = 0; i < fm.getDataSize(); i++)
|
||||
{
|
||||
EXPECT_FLOAT_AE(fm[i], fmD.getValue(i));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(Function2D_Cuda_Test, immse) {
|
||||
auto matrixHost1 = Aurora::Matrix::fromRawData(Aurora::random(10000), 50,200);
|
||||
auto matrixHost2 = Aurora::Matrix::fromRawData(Aurora::random(10000), 50,200);
|
||||
|
||||
Reference in New Issue
Block a user