Exemplo n.º 1
0
	// the signal processing routine;
	inline int perform(t_sample ** __ins, t_sample ** __outs, int __n) { 
		vectorsize = __n;
		const t_sample * __in1 = __ins[0];
		t_sample * __out1 = __outs[0];
		if (__exception) { 
			return __exception;
			
		} else if (( (__in1 == 0) || (__out1 == 0) )) { 
			__exception = GENLIB_ERR_NULL_BUFFER;
			return __exception;
			
		};
		double mul_2327 = (m_resonance_13 * 0.125);
		double exp_2328 = exp(mul_2327);
		double mul_2326 = (exp_2328 * 0.882497);
		double mul_2322 = (mul_2326 * mul_2326);
		double expr_2437 = safediv(((m_cutoff_14 * 2) * 3.1415926535898), 44100);
		double cos_2325 = cos(expr_2437);
		double mul_2324 = (cos_2325 * mul_2326);
		double mul_2323 = (mul_2324 * -2);
		double add_2321 = ((mul_2323 + mul_2322) + 1);
		double mstosamps_2393 = (m_window_15 * (samplerate * 0.001));
		double mstosamps_2309 = (m_window_19 * (samplerate * 0.001));
		double rsub_2296 = (1 - m_ratio_20);
		double mul_2295 = (rsub_2296 * 1000);
		double div_2294 = safediv(mul_2295, m_window_19);
		samples_to_seconds = (1 / samplerate);
		double rsub_2380 = (1 - m_ratio_18);
		double mul_2379 = (rsub_2380 * 1000);
		double div_2378 = safediv(mul_2379, m_window_15);
		// the main sample loop;
		while ((__n--)) { 
			const double in1 = (*(__in1++));
			double noise_2247 = noise();
			double abs_2264 = fabs(noise_2247);
			double mul_2270 = (abs_2264 * m_blur_17);
			double noise_2246 = noise();
			double abs_2263 = fabs(noise_2246);
			double mul_2267 = (abs_2263 * m_blur_17);
			double noise_2330 = noise();
			double abs_2348 = fabs(noise_2330);
			double mul_2354 = (abs_2348 * m_blur_17);
			double noise_2332 = noise();
			double abs_2350 = fabs(noise_2332);
			double mul_2360 = (abs_2350 * m_blur_17);
			double noise_2249 = noise();
			double abs_2266 = fabs(noise_2249);
			double mul_2276 = (abs_2266 * m_blur_17);
			double noise_2248 = noise();
			double abs_2265 = fabs(noise_2248);
			double mul_2273 = (abs_2265 * m_blur_17);
			double noise_2331 = noise();
			double abs_2349 = fabs(noise_2331);
			double mul_2357 = (abs_2349 * m_blur_17);
			double noise_2329 = noise();
			double abs_2347 = fabs(noise_2329);
			double mul_2351 = (abs_2347 * m_blur_17);
			double mul_2318 = (mul_2322 * m_y_10);
			double mul_2319 = (mul_2323 * m_y_1);
			double phasor_2315 = m_phasor_21(div_2294, samples_to_seconds);
			double add_2293 = ((phasor_2315 + m_history_9) + 0.5);
			double mod_2292 = safemod(add_2293, 1);
			double delta_2272 = m_delta_22(mod_2292);
			double sah_2252 = m_sah_23(mul_2270, delta_2272, 0);
			double sah_2271 = m_sah_24(mstosamps_2309, delta_2272, 0);
			double mul_2260 = (sah_2271 * mod_2292);
			double sub_2291 = (mod_2292 - 0.5);
			double mul_2290 = (sub_2291 * 3.1415926535898);
			double cos_2289 = cos(mul_2290);
			double mul_2279 = (cos_2289 * cos_2289);
			double add_2287 = ((phasor_2315 + m_history_8) + 0.75);
			double mod_2286 = safemod(add_2287, 1);
			double delta_2269 = m_delta_25(mod_2286);
			double sah_2250 = m_sah_26(mul_2267, delta_2269, 0);
			double sah_2268 = m_sah_27(mstosamps_2309, delta_2269, 0);
			double mul_2259 = (sah_2268 * mod_2286);
			double sub_2285 = (mod_2286 - 0.5);
			double mul_2284 = (sub_2285 * 3.1415926535898);
			double cos_2283 = cos(mul_2284);
			double mul_2278 = (cos_2283 * cos_2283);
			double add_2314 = ((phasor_2315 + m_history_7) + 0);
			double mod_2313 = safemod(add_2314, 1);
			double delta_2257 = m_delta_28(mod_2313);
			double sah_2256 = m_sah_29(mul_2276, delta_2257, 0);
			double sah_2277 = m_sah_30(mstosamps_2309, delta_2257, 0);
			double mul_2262 = (sah_2277 * mod_2313);
			double sub_2312 = (mod_2313 - 0.5);
			double mul_2311 = (sub_2312 * 3.1415926535898);
			double cos_2310 = cos(mul_2311);
			double mul_2281 = (cos_2310 * cos_2310);
			double add_2308 = ((phasor_2315 + m_history_6) + 0.25);
			double mod_2307 = safemod(add_2308, 1);
			double delta_2275 = m_delta_31(mod_2307);
			double sah_2254 = m_sah_32(mul_2273, delta_2275, 0);
			double sah_2274 = m_sah_33(mstosamps_2309, delta_2275, 0);
			double mul_2261 = (sah_2274 * mod_2307);
			double tap_2300 = m_delay_12.read_linear(mul_2262);
			double tap_2301 = m_delay_12.read_linear(mul_2261);
			double tap_2302 = m_delay_12.read_linear(mul_2260);
			double tap_2303 = m_delay_12.read_linear(mul_2259);
			double mul_2282 = (tap_2303 * mul_2278);
			double mul_2288 = (tap_2302 * mul_2279);
			double mul_2298 = (tap_2300 * mul_2281);
			double sub_2306 = (mod_2307 - 0.5);
			double mul_2305 = (sub_2306 * 3.1415926535898);
			double cos_2304 = cos(mul_2305);
			double mul_2280 = (cos_2304 * cos_2304);
			double mul_2297 = (tap_2301 * mul_2280);
			double phasor_2399 = m_phasor_34(div_2378, samples_to_seconds);
			double add_2377 = ((m_history_5 + phasor_2399) + 0.5);
			double mod_2376 = safemod(add_2377, 1);
			double delta_2356 = m_delta_35(mod_2376);
			double sah_2335 = m_sah_36(mul_2354, delta_2356, 0);
			double sah_2355 = m_sah_37(mstosamps_2393, delta_2356, 0);
			double mul_2344 = (sah_2355 * mod_2376);
			double sub_2375 = (mod_2376 - 0.5);
			double mul_2374 = (sub_2375 * 3.1415926535898);
			double cos_2373 = cos(mul_2374);
			double mul_2363 = (cos_2373 * cos_2373);
			double add_2398 = ((m_history_4 + phasor_2399) + 0);
			double mod_2397 = safemod(add_2398, 1);
			double delta_2340 = m_delta_38(mod_2397);
			double sah_2339 = m_sah_39(mul_2360, delta_2340, 0);
			double sah_2361 = m_sah_40(mstosamps_2393, delta_2340, 0);
			double mul_2346 = (sah_2361 * mod_2397);
			double sub_2396 = (mod_2397 - 0.5);
			double mul_2395 = (sub_2396 * 3.1415926535898);
			double cos_2394 = cos(mul_2395);
			double mul_2365 = (cos_2394 * cos_2394);
			double add_2392 = ((m_history_3 + phasor_2399) + 0.25);
			double mod_2391 = safemod(add_2392, 1);
			double delta_2359 = m_delta_41(mod_2391);
			double sah_2337 = m_sah_42(mul_2357, delta_2359, 0);
			double sah_2358 = m_sah_43(mstosamps_2393, delta_2359, 0);
			double mul_2345 = (sah_2358 * mod_2391);
			double sub_2390 = (mod_2391 - 0.5);
			double mul_2389 = (sub_2390 * 3.1415926535898);
			double cos_2388 = cos(mul_2389);
			double mul_2364 = (cos_2388 * cos_2388);
			double add_2371 = ((m_history_2 + phasor_2399) + 0.75);
			double mod_2370 = safemod(add_2371, 1);
			double delta_2353 = m_delta_44(mod_2370);
			double sah_2333 = m_sah_45(mul_2351, delta_2353, 0);
			double sah_2352 = m_sah_46(mstosamps_2393, delta_2353, 0);
			double mul_2343 = (sah_2352 * mod_2370);
			double tap_2384 = m_delay_11.read_linear(mul_2346);
			double tap_2385 = m_delay_11.read_linear(mul_2345);
			double tap_2386 = m_delay_11.read_linear(mul_2344);
			double tap_2387 = m_delay_11.read_linear(mul_2343);
			double mul_2382 = (tap_2384 * mul_2365);
			double mul_2381 = (tap_2385 * mul_2364);
			double mul_2372 = (tap_2386 * mul_2363);
			double sub_2369 = (mod_2370 - 0.5);
			double mul_2368 = (sub_2369 * 3.1415926535898);
			double cos_2367 = cos(mul_2368);
			double mul_2362 = (cos_2367 * cos_2367);
			double mul_2366 = (tap_2387 * mul_2362);
			double mul_2320 = ((((((((mul_2298 + mul_2297) + mul_2288) + mul_2282) + mul_2366) + mul_2372) + mul_2381) + mul_2382) * add_2321);
			double sub_2317 = (mul_2320 - (mul_2319 + mul_2318));
			double mix_2450 = (in1 + (m_mix_16 * (sub_2317 - in1)));
			double out1 = mix_2450;
			double y2_next_2440 = m_y_1;
			double history_2253_next_2441 = sah_2252;
			double history_2251_next_2442 = sah_2250;
			double history_2258_next_2443 = sah_2256;
			double history_2255_next_2444 = sah_2254;
			double history_2336_next_2445 = sah_2335;
			double history_2341_next_2446 = sah_2339;
			double history_2338_next_2447 = sah_2337;
			double history_2334_next_2448 = sah_2333;
			double y1_next_2449 = sub_2317;
			m_delay_12.write(in1);
			m_delay_11.write(in1);
			m_y_10 = y2_next_2440;
			m_history_9 = history_2253_next_2441;
			m_history_8 = history_2251_next_2442;
			m_history_7 = history_2258_next_2443;
			m_history_6 = history_2255_next_2444;
			m_history_5 = history_2336_next_2445;
			m_history_4 = history_2341_next_2446;
			m_history_3 = history_2338_next_2447;
			m_history_2 = history_2334_next_2448;
			m_y_1 = y1_next_2449;
			m_delay_11.step();
			m_delay_12.step();
			// assign results to output buffer;
			(*(__out1++)) = out1;
			
		};
		return __exception;
		
	};
Exemplo n.º 2
0
	// the signal processing routine;
	inline int perform(t_sample ** __ins, t_sample ** __outs, int __n) { 
		vectorsize = __n;
		const t_sample * __in1 = __ins[0];
		t_sample * __out1 = __outs[0];
		if (__exception) { 
			return __exception;
			
		} else if (( (__in1 == 0) || (__out1 == 0) )) { 
			__exception = GENLIB_ERR_NULL_BUFFER;
			return __exception;
			
		};
		double expr_5155 = safediv(((m_cutoff_16 * 2) * 3.1415926535898), 44100);
		double sin_5012 = sin(expr_5155);
		double clamp_5013 = ((sin_5012 <= 1e-05) ? 1e-05 : ((sin_5012 >= 0.99999) ? 0.99999 : sin_5012));
		double mstosamps_5148 = (m_delay_14 * (samplerate * 0.001));
		double mstosamps_5077 = (m_delay_18 * (samplerate * 0.001));
		double rsub_5064 = (1 - m_ratio_12);
		double mul_5063 = (rsub_5064 * 1000);
		double div_5062 = safediv(mul_5063, m_delay_18);
		samples_to_seconds = (1 / samplerate);
		double rsub_5135 = (1 - m_ratio_15);
		double mul_5134 = (rsub_5135 * 1000);
		double div_5133 = safediv(mul_5134, m_delay_14);
		// the main sample loop;
		while ((__n--)) { 
			const double in1 = (*(__in1++));
			double noise_5014 = noise();
			double abs_5031 = fabs(noise_5014);
			double mul_5035 = (abs_5031 * m_blur_17);
			double noise_5086 = noise();
			double abs_5104 = fabs(noise_5086);
			double mul_5112 = (abs_5104 * m_blur_17);
			double noise_5015 = noise();
			double abs_5032 = fabs(noise_5015);
			double mul_5038 = (abs_5032 * m_blur_17);
			double noise_5084 = noise();
			double abs_5102 = fabs(noise_5084);
			double mul_5106 = (abs_5102 * m_blur_17);
			double noise_5017 = noise();
			double abs_5034 = fabs(noise_5017);
			double mul_5044 = (abs_5034 * m_blur_17);
			double noise_5087 = noise();
			double abs_5105 = fabs(noise_5087);
			double mul_5115 = (abs_5105 * m_blur_17);
			double noise_5016 = noise();
			double abs_5033 = fabs(noise_5016);
			double mul_5041 = (abs_5033 * m_blur_17);
			double noise_5085 = noise();
			double abs_5103 = fabs(noise_5085);
			double mul_5109 = (abs_5103 * m_blur_17);
			double phasor_5083 = m_phasor_19(div_5062, samples_to_seconds);
			double add_5055 = ((phasor_5083 + m_history_9) + 0.75);
			double mod_5054 = safemod(add_5055, 1);
			double delta_5037 = m_delta_20(mod_5054);
			double sah_5018 = m_sah_21(mul_5035, delta_5037, 0);
			double sah_5036 = m_sah_22(mstosamps_5077, delta_5037, 0);
			double mul_5027 = (sah_5036 * mod_5054);
			double sub_5053 = (mod_5054 - 0.5);
			double mul_5052 = (sub_5053 * 3.1415926535898);
			double cos_5051 = cos(mul_5052);
			double mul_5046 = (cos_5051 * cos_5051);
			double add_5061 = ((phasor_5083 + m_history_8) + 0.5);
			double mod_5060 = safemod(add_5061, 1);
			double delta_5040 = m_delta_23(mod_5060);
			double sah_5020 = m_sah_24(mul_5038, delta_5040, 0);
			double sah_5039 = m_sah_25(mstosamps_5077, delta_5040, 0);
			double mul_5028 = (sah_5039 * mod_5060);
			double sub_5059 = (mod_5060 - 0.5);
			double mul_5058 = (sub_5059 * 3.1415926535898);
			double cos_5057 = cos(mul_5058);
			double mul_5047 = (cos_5057 * cos_5057);
			double add_5082 = ((phasor_5083 + m_history_7) + 0);
			double mod_5081 = safemod(add_5082, 1);
			double delta_5025 = m_delta_26(mod_5081);
			double sah_5024 = m_sah_27(mul_5044, delta_5025, 0);
			double sah_5045 = m_sah_28(mstosamps_5077, delta_5025, 0);
			double mul_5030 = (sah_5045 * mod_5081);
			double sub_5080 = (mod_5081 - 0.5);
			double mul_5079 = (sub_5080 * 3.1415926535898);
			double cos_5078 = cos(mul_5079);
			double mul_5049 = (cos_5078 * cos_5078);
			double add_5076 = ((phasor_5083 + m_history_6) + 0.25);
			double mod_5075 = safemod(add_5076, 1);
			double delta_5043 = m_delta_29(mod_5075);
			double sah_5022 = m_sah_30(mul_5041, delta_5043, 0);
			double sah_5042 = m_sah_31(mstosamps_5077, delta_5043, 0);
			double mul_5029 = (sah_5042 * mod_5075);
			double tap_5068 = m_delay_11.read_linear(mul_5030);
			double tap_5069 = m_delay_11.read_linear(mul_5029);
			double tap_5070 = m_delay_11.read_linear(mul_5028);
			double tap_5071 = m_delay_11.read_linear(mul_5027);
			double mul_5050 = (tap_5071 * mul_5046);
			double mul_5056 = (tap_5070 * mul_5047);
			double mul_5066 = (tap_5068 * mul_5049);
			double sub_5074 = (mod_5075 - 0.5);
			double mul_5073 = (sub_5074 * 3.1415926535898);
			double cos_5072 = cos(mul_5073);
			double mul_5048 = (cos_5072 * cos_5072);
			double mul_5065 = (tap_5069 * mul_5048);
			double phasor_5154 = m_phasor_32(div_5133, samples_to_seconds);
			double add_5147 = ((m_history_5 + phasor_5154) + 0.25);
			double mod_5146 = safemod(add_5147, 1);
			double delta_5114 = m_delta_33(mod_5146);
			double sah_5092 = m_sah_34(mul_5112, delta_5114, 0);
			double sah_5113 = m_sah_35(mstosamps_5148, delta_5114, 0);
			double mul_5100 = (sah_5113 * mod_5146);
			double sub_5145 = (mod_5146 - 0.5);
			double mul_5144 = (sub_5145 * 3.1415926535898);
			double cos_5143 = cos(mul_5144);
			double mul_5119 = (cos_5143 * cos_5143);
			double add_5126 = ((m_history_4 + phasor_5154) + 0.75);
			double mod_5125 = safemod(add_5126, 1);
			double delta_5108 = m_delta_36(mod_5125);
			double sah_5088 = m_sah_37(mul_5106, delta_5108, 0);
			double sah_5107 = m_sah_38(mstosamps_5148, delta_5108, 0);
			double mul_5098 = (sah_5107 * mod_5125);
			double sub_5124 = (mod_5125 - 0.5);
			double mul_5123 = (sub_5124 * 3.1415926535898);
			double cos_5122 = cos(mul_5123);
			double mul_5117 = (cos_5122 * cos_5122);
			double add_5153 = ((m_history_3 + phasor_5154) + 0);
			double mod_5152 = safemod(add_5153, 1);
			double delta_5095 = m_delta_39(mod_5152);
			double sah_5094 = m_sah_40(mul_5115, delta_5095, 0);
			double sah_5116 = m_sah_41(mstosamps_5148, delta_5095, 0);
			double mul_5101 = (sah_5116 * mod_5152);
			double sub_5151 = (mod_5152 - 0.5);
			double mul_5150 = (sub_5151 * 3.1415926535898);
			double cos_5149 = cos(mul_5150);
			double mul_5120 = (cos_5149 * cos_5149);
			double add_5132 = ((m_history_2 + phasor_5154) + 0.5);
			double mod_5131 = safemod(add_5132, 1);
			double delta_5111 = m_delta_42(mod_5131);
			double sah_5090 = m_sah_43(mul_5109, delta_5111, 0);
			double sah_5110 = m_sah_44(mstosamps_5148, delta_5111, 0);
			double mul_5099 = (sah_5110 * mod_5131);
			double tap_5139 = m_delay_10.read_linear(mul_5101);
			double tap_5140 = m_delay_10.read_linear(mul_5100);
			double tap_5141 = m_delay_10.read_linear(mul_5099);
			double tap_5142 = m_delay_10.read_linear(mul_5098);
			double mul_5137 = (tap_5139 * mul_5120);
			double mul_5136 = (tap_5140 * mul_5119);
			double mul_5121 = (tap_5142 * mul_5117);
			double sub_5130 = (mod_5131 - 0.5);
			double mul_5129 = (sub_5130 * 3.1415926535898);
			double cos_5128 = cos(mul_5129);
			double mul_5118 = (cos_5128 * cos_5128);
			double mul_5127 = (tap_5141 * mul_5118);
			double add_5174 = (((((((mul_5066 + mul_5065) + mul_5056) + mul_5050) + mul_5121) + mul_5127) + mul_5136) + mul_5137);
			double mix_5173 = (m_y_1 + (clamp_5013 * (add_5174 - m_y_1)));
			double mix_5010 = mix_5173;
			double mix_5175 = (in1 + (m_mix_13 * (mix_5010 - in1)));
			double out1 = mix_5175;
			double history_5019_next_5156 = sah_5018;
			double history_5021_next_5157 = sah_5020;
			double history_5026_next_5158 = sah_5024;
			double history_5023_next_5159 = sah_5022;
			double history_5093_next_5160 = sah_5092;
			double history_5089_next_5161 = sah_5088;
			double history_5096_next_5162 = sah_5094;
			double history_5091_next_5163 = sah_5090;
			double y0_next_5164 = mix_5010;
			m_delay_11.write(in1);
			m_delay_10.write(in1);
			m_history_9 = history_5019_next_5156;
			m_history_8 = history_5021_next_5157;
			m_history_7 = history_5026_next_5158;
			m_history_6 = history_5023_next_5159;
			m_history_5 = history_5093_next_5160;
			m_history_4 = history_5089_next_5161;
			m_history_3 = history_5096_next_5162;
			m_history_2 = history_5091_next_5163;
			m_y_1 = y0_next_5164;
			m_delay_10.step();
			m_delay_11.step();
			// assign results to output buffer;
			(*(__out1++)) = out1;
			
		};
		return __exception;
		
	};
Exemplo n.º 3
0
Arquivo: mlsqr.c Projeto: qsnake/gpaw
// Perform a moving linear least squares interpolation to arrays
// Input arguments:
// order: order of polynomial used (1 or 2)
// cutoff: the cutoff of weight (in grid points)
// coords: scaled coords [0,1] for interpolation
// N_c: number of grid points
// beg_c: first grid point
// data: the array used
// target: the results are stored in this array
PyObject* mlsqr(PyObject *self, PyObject *args)
{
  // The order of interpolation
  unsigned char order = -1;

  // The cutoff for moving least squares
  double cutoff = -1;

  // The coordinates for interpolation: array of size (3, N)
  PyArrayObject* coords = 0;

  // Number of grid points
  PyArrayObject* N_c = 0;

  // Beginning of grid
  PyArrayObject* beg_c = 0;

  // The 3d-data to be interpolated: array of size (X, Y, Z)
  PyArrayObject* data;

  // The interpolation target: array of size (N,)
  PyArrayObject* target = 0;

  if (!PyArg_ParseTuple(args, "BdOOOOO", &order, &cutoff, &coords, &N_c, &beg_c, &data, &target))
    {
      return NULL;
    }

  int coeffs = -1;

  if (order == 1)
    {
      coeffs = 4;
    }
  if (order == 2)
    {
      coeffs = 10;
      // 1 x y z xy yz zx xx yy zz
    }
  if (order == 3)
    {
      // 1 x y z xy yz zx xx yy zz
      // xxy xxz yyx yyz zzx zzy
      // xxx yyy zzz zyz
      coeffs = 20;
    }
  int points = coords->dimensions[0];

  double* coord_nc = DOUBLEP(coords);
  double* grid_points = DOUBLEP(N_c);
  double* grid_start = DOUBLEP(beg_c);
  double* target_n = DOUBLEP(target);
  double* data_g = DOUBLEP(data);


  // TODO: Calculate fit
  const int sizex = ceil(cutoff);
  const int sizey = ceil(cutoff);
  const int sizez = ceil(cutoff);

  // Allocate X-matrix and b-vector
  int source_points = (2*sizex+1)*(2*sizey+1)*(2*sizez+1);
  double* X = GPAW_MALLOC(double, coeffs*source_points);
  double* b = GPAW_MALLOC(double, source_points);
  double* work = GPAW_MALLOC(double, coeffs*source_points);

  // The multipliers for each dimension
  int ldx = data->dimensions[1]*data->dimensions[2];
  int ldy = data->dimensions[2];
  int ldz = 1;

  // For each point to be interpolated
  for (int p=0; p< points; p++)
    {
      double x = (*coord_nc++)*grid_points[0] - grid_start[0];
      double y = (*coord_nc++)*grid_points[1] - grid_start[0];
      double z = (*coord_nc++)*grid_points[2] - grid_start[0];

      // The grid center point
      int cx2 = round(x);
      int cy2 = round(y);
      int cz2 = round(z);

      // Scaled to grid
      int cx = safemod(cx2,data->dimensions[0]);
      int cy = safemod(cy2,data->dimensions[1]);
      int cz = safemod(cz2,data->dimensions[2]);

      double* i_X = X;
      double* i_b = b;
      // For each point to take into account
      for (int dx=-sizex;dx<=sizex;dx++)
	for (int dy=-sizey;dy<=sizey;dy++)
	  for (int dz=-sizez;dz<=sizez;dz++)
	    {
	      // Coordinates centered on x,y,z
	      double sx = (cx2 + dx) - x;
	      double sy = (cy2 + dy) - y;
	      double sz = (cz2 + dz) - z;

	      // Normalized distance from center
	      double d = sqrt(sx*sx+sy*sy+sz*sz) / cutoff;
	      double w = 0.0;
	      if (d < 1)
	      {
	         w = (1-d)*(1-d);
	         w*=w;
	         w*=(4*d+1);
	      }

	      //double w = exp(-d*d);

	      *i_X++ = w*1.0;
	      *i_X++ = w*sx;
	      *i_X++ = w*sy;
	      *i_X++ = w*sz;

	      if (order > 1)
		{
		  *i_X++ = w*sx*sy;
		  *i_X++ = w*sy*sz;
		  *i_X++ = w*sz*sx;
		  *i_X++ = w*sx*sx;
		  *i_X++ = w*sy*sy;
		  *i_X++ = w*sz*sz;
		}

	      if (order > 2)
		{
		  *i_X++ = w*sx*sy*sz; // xyz
		  *i_X++ = w*sx*sx*sx; // xxx
		  *i_X++ = w*sy*sy*sy; // yyy
		  *i_X++ = w*sz*sz*sz; // zzz
		  *i_X++ = w*sx*sx*sy; // xxy
		  *i_X++ = w*sx*sx*sz; // xxz
		  *i_X++ = w*sy*sy*sx; // yyx
		  *i_X++ = w*sy*sy*sz; // yyz
		  *i_X++ = w*sz*sz*sx; // zzx
		  *i_X++ = w*sz*sz*sy; // zzy
		}

	      *i_b++ = w*data_g[ safemod(cx+dx, data->dimensions[0]) * ldx +
				 safemod(cy+dy, data->dimensions[1]) * ldy +
				 safemod(cz+dz, data->dimensions[2]) * ldz ];
	    }

      int info = 0;
      int rhs = 1;
      int worksize = coeffs*source_points;
      int ldb = source_points;
      dgels_("T",
	    &coeffs,              // ...times 4.
	    &source_points,  // lhs is of size sourcepoints...
	    &rhs,            // one rhs.
	    X,               // provide lhs
	    &coeffs,         // Leading dimension of X
	    b,               // provide rhs
	    &ldb,            // Leading dimension of b
	    work,            // work array (and output)
	    &worksize,       // the size of work array
	    &info);          // info
      if (info != 0)
	printf("WARNING: dgels returned %d!", info);

      // Evaluate the polynomial
      // Due to centered coordinates, it's just the constant term
      double value = b[0];

      *target_n++ = value;

      //Nearest neighbour
      //double value = data_g[ cx*data->dimensions[1]*data->dimensions[2] + cy*data->dimensions[2] + cz ];
      //printf("%.5f" , value);
    }

  free(work);
  free(b);
  free(X);
  Py_RETURN_NONE;
}