InterpolationTestsF32.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "InterpolationTestsF32.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #define SNR_THRESHOLD 120
  5. /*
  6. Reference patterns are generated with
  7. a double precision computation.
  8. */
  9. #define REL_ERROR (8.0e-5)
  10. void InterpolationTestsF32::test_linear_interp_f32()
  11. {
  12. const float32_t *inp = input.ptr();
  13. float32_t *outp = output.ptr();
  14. unsigned long nb;
  15. for(nb = 0; nb < input.nbSamples(); nb++)
  16. {
  17. outp[nb] = arm_linear_interp_f32(&S,inp[nb]);
  18. }
  19. ASSERT_EMPTY_TAIL(output);
  20. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  21. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  22. }
  23. void InterpolationTestsF32::test_bilinear_interp_f32()
  24. {
  25. const float32_t *inp = input.ptr();
  26. float32_t *outp = output.ptr();
  27. float32_t x,y;
  28. unsigned long nb;
  29. for(nb = 0; nb < input.nbSamples(); nb += 2)
  30. {
  31. x = inp[nb];
  32. y = inp[nb+1];
  33. *outp++=arm_bilinear_interp_f32(&SBI,x,y);
  34. }
  35. ASSERT_EMPTY_TAIL(output);
  36. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  37. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  38. }
  39. void InterpolationTestsF32::test_spline_square_f32()
  40. {
  41. const float32_t *inpX = inputX.ptr();
  42. const float32_t *inpY = inputY.ptr();
  43. const float32_t *outX = outputX.ptr();
  44. float32_t *outp = output.ptr();
  45. float32_t *buf = buffer.ptr(); // ((2*4-1)*sizeof(float32_t))
  46. float32_t *coef = splineCoefs.ptr(); // ((3*(4-1))*sizeof(float32_t))
  47. arm_spline_instance_f32 S;
  48. arm_spline_init_f32(&S, ARM_SPLINE_PARABOLIC_RUNOUT, inpX, inpY, 4, coef, buf);
  49. arm_spline_f32(&S, outX, outp, 20);
  50. ASSERT_EMPTY_TAIL(buffer);
  51. ASSERT_EMPTY_TAIL(splineCoefs);
  52. ASSERT_EMPTY_TAIL(output);
  53. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  54. }
  55. void InterpolationTestsF32::test_spline_sine_f32()
  56. {
  57. const float32_t *inpX = inputX.ptr();
  58. const float32_t *inpY = inputY.ptr();
  59. const float32_t *outX = outputX.ptr();
  60. float32_t *outp = output.ptr();
  61. float32_t *buf = buffer.ptr(); // ((2*9-1)*sizeof(float32_t))
  62. float32_t *coef = splineCoefs.ptr(); // ((3*(9-1))*sizeof(float32_t))
  63. arm_spline_instance_f32 S;
  64. arm_spline_init_f32(&S, ARM_SPLINE_NATURAL, inpX, inpY, 9, coef, buf);
  65. arm_spline_f32(&S, outX, outp, 33);
  66. ASSERT_EMPTY_TAIL(buffer);
  67. ASSERT_EMPTY_TAIL(splineCoefs);
  68. ASSERT_EMPTY_TAIL(output);
  69. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  70. }
  71. void InterpolationTestsF32::test_spline_ramp_f32()
  72. {
  73. const float32_t *inpX = inputX.ptr();
  74. const float32_t *inpY = inputY.ptr();
  75. const float32_t *outX = outputX.ptr();
  76. float32_t *outp = output.ptr();
  77. float32_t *buf = buffer.ptr(); // ((2*3-1)*sizeof(float32_t))
  78. float32_t *coef = splineCoefs.ptr(); // ((3*(3-1))*sizeof(float32_t))
  79. arm_spline_instance_f32 S;
  80. arm_spline_init_f32(&S, ARM_SPLINE_PARABOLIC_RUNOUT, inpX, inpY, 3, coef, buf);
  81. arm_spline_f32(&S, outX, outp, 30);
  82. ASSERT_EMPTY_TAIL(buffer);
  83. ASSERT_EMPTY_TAIL(splineCoefs);
  84. ASSERT_EMPTY_TAIL(output);
  85. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  86. }
  87. void InterpolationTestsF32::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  88. {
  89. const int16_t *pConfig;
  90. Testing::nbSamples_t nb=MAX_NB_SAMPLES;
  91. (void)params;
  92. switch(id)
  93. {
  94. case InterpolationTestsF32::TEST_LINEAR_INTERP_F32_1:
  95. input.reload(InterpolationTestsF32::INPUT_F32_ID,mgr,nb);
  96. y.reload(InterpolationTestsF32::YVAL_F32_ID,mgr,nb);
  97. ref.reload(InterpolationTestsF32::REF_LINEAR_F32_ID,mgr,nb);
  98. S.nValues=y.nbSamples(); /**< nValues */
  99. /* Those values must be coherent with the ones in the
  100. Python script generating the patterns */
  101. S.x1=0.0; /**< x1 */
  102. S.xSpacing=1.0; /**< xSpacing */
  103. S.pYData=y.ptr(); /**< pointer to the table of Y values */
  104. break;
  105. case InterpolationTestsF32::TEST_BILINEAR_INTERP_F32_2:
  106. input.reload(InterpolationTestsF32::INPUTBI_F32_ID,mgr,nb);
  107. config.reload(InterpolationTestsF32::CONFIGBI_S16_ID,mgr,nb);
  108. y.reload(InterpolationTestsF32::YVALBI_F32_ID,mgr,nb);
  109. ref.reload(InterpolationTestsF32::REF_BILINEAR_F32_ID,mgr,nb);
  110. pConfig = config.ptr();
  111. SBI.numRows = pConfig[1];
  112. SBI.numCols = pConfig[0];
  113. SBI.pData = y.ptr();
  114. break;
  115. case TEST_SPLINE_SQUARE_F32_3:
  116. inputX.reload(InterpolationTestsF32::INPUT_SPLINE_SQU_X_F32_ID,mgr,4);
  117. inputY.reload(InterpolationTestsF32::INPUT_SPLINE_SQU_Y_F32_ID,mgr,4);
  118. outputX.reload(InterpolationTestsF32::OUTPUT_SPLINE_SQU_X_F32_ID,mgr,20);
  119. ref.reload(InterpolationTestsF32::REF_SPLINE_SQU_F32_ID,mgr,20);
  120. splineCoefs.create(3*(4-1),InterpolationTestsF32::COEFS_SPLINE_F32_ID,mgr);
  121. buffer.create(2*4-1,InterpolationTestsF32::TEMP_SPLINE_F32_ID,mgr);
  122. output.create(20,InterpolationTestsF32::OUT_SAMPLES_F32_ID,mgr);
  123. break;
  124. case TEST_SPLINE_SINE_F32_4:
  125. inputX.reload(InterpolationTestsF32::INPUT_SPLINE_SIN_X_F32_ID,mgr,9);
  126. inputY.reload(InterpolationTestsF32::INPUT_SPLINE_SIN_Y_F32_ID,mgr,9);
  127. outputX.reload(InterpolationTestsF32::OUTPUT_SPLINE_SIN_X_F32_ID,mgr,33);
  128. ref.reload(InterpolationTestsF32::REF_SPLINE_SIN_F32_ID,mgr,33);
  129. splineCoefs.create(3*(9-1),InterpolationTestsF32::COEFS_SPLINE_F32_ID,mgr);
  130. buffer.create(2*9-1,InterpolationTestsF32::TEMP_SPLINE_F32_ID,mgr);
  131. output.create(33,InterpolationTestsF32::OUT_SAMPLES_F32_ID,mgr);
  132. break;
  133. case TEST_SPLINE_RAMP_F32_5:
  134. inputX.reload(InterpolationTestsF32::INPUT_SPLINE_RAM_X_F32_ID,mgr,3);
  135. inputY.reload(InterpolationTestsF32::INPUT_SPLINE_RAM_Y_F32_ID,mgr,3);
  136. outputX.reload(InterpolationTestsF32::OUTPUT_SPLINE_RAM_X_F32_ID,mgr,30);
  137. ref.reload(InterpolationTestsF32::REF_SPLINE_RAM_F32_ID,mgr,30);
  138. splineCoefs.create(3*(3-1),InterpolationTestsF32::COEFS_SPLINE_F32_ID,mgr);
  139. buffer.create(2*3-1,InterpolationTestsF32::TEMP_SPLINE_F32_ID,mgr);
  140. output.create(30,InterpolationTestsF32::OUT_SAMPLES_F32_ID,mgr);
  141. break;
  142. }
  143. output.create(ref.nbSamples(),InterpolationTestsF32::OUT_SAMPLES_F32_ID,mgr);
  144. }
  145. void InterpolationTestsF32::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  146. {
  147. (void)id;
  148. output.dump(mgr);
  149. }