Loading src/main/java/ImageDtt.java +921 −542 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ ** */ import java.util.concurrent.atomic.AtomicInteger; import Jama.Matrix; import ij.ImageStack; Loading Loading @@ -193,6 +194,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -426,6 +428,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -505,6 +508,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -619,6 +623,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -688,6 +693,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -750,6 +756,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -860,6 +867,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -971,9 +979,344 @@ public class ImageDtt { return clt_data; } /* * */ public void generateFPGACompareData( final double [][] image_data, // for selected subcamera final double [][] colorCentersXY, // pixel centers per color (2 - green) final int transform_size, final int width, DttRad2 dtt ){ int height = image_data[0].length/width; double [][][] fpga_clt_data_in = new double [3][4][]; double [][][] fpga_clt_data_out = new double [3][4][]; double [][][] fpga_clt_data_rot = new double [3][4][]; // double [][] fpga_fract_shiftsXY = new double[3][]; double [][] fpga_centersXY = new double [3][2]; // int [][] color_int_shifts = new int [3][2]; double [][][][] fold_coeff = new double[3][][][]; int [] ctile_left = new int [3]; int [] ctile_top = new int [3]; double [][] residual_shift = new double[3][2]; int [] ishx = new int[3]; int [] ishy = new int[3]; double [][] fpga_full_tile = new double [3][FPGA_TILE_SIZE * FPGA_TILE_SIZE]; double [][] fpga_tile = new double [3][4*transform_size*transform_size]; for (int chn = 0; chn<3; chn++) for (int j = 0; j < 2; j++) { fpga_centersXY[chn][j] = colorCentersXY[chn][j]; // Round to FPGA precision fpga_centersXY[chn][j] = Math.round(128*fpga_centersXY[chn][j])/128.0; } for (int chn = 0; chn<3; chn++) { double px = fpga_centersXY[chn][0] - transform_size; double py = fpga_centersXY[chn][1] - transform_size; // Was wrong rounding, fractional part gets to +0.5 ctile_left[chn] = (int) -Math.round(-px); ctile_top[chn] = (int) -Math.round(-py); residual_shift[chn][0] = -(px - ctile_left[chn]); residual_shift[chn][1] = -(py - ctile_top[chn]); } int lt = (FPGA_TILE_SIZE - 2 * transform_size)/2; for (int chn = 0; chn < 3; chn++){ for (int i = 0; i < FPGA_TILE_SIZE; i++){ System.arraycopy( image_data[chn], ((ctile_top[GREEN_CHN] - lt) + i) * width + (ctile_left[GREEN_CHN] - lt), fpga_full_tile[chn], FPGA_TILE_SIZE * i, FPGA_TILE_SIZE); } } for (int chn = 0; chn < 3; chn++){ if ((ctile_left[chn] >= 0) && (ctile_left[chn] < (width - transform_size * 2)) && (ctile_top[chn] >= 0) && (ctile_top[chn] < (height - transform_size * 2))) { for (int i = 0; i < transform_size * 2; i++){ System.arraycopy(image_data[chn], (ctile_top[chn] + i) * width + ctile_left[chn], fpga_tile[chn], transform_size * 2 * i, transform_size* 2); } } else { // copy by 1 for (int i = 0; i < transform_size* 2; i++){ int pi = ctile_top[chn] + i; if (pi < 0) pi &= 1; else if (pi >= height) pi = height - 2 + (pi & 1); for (int j = 0; j < transform_size* 2; j++){ int pj = ctile_left[chn] + j; if (pj < 0) pj &= 1; else if (pj >= width) pj = width - 2 + (pj & 1); fpga_tile[chn][transform_size * 2 * i + j] = image_data[chn][pi * width + pj]; } } } } // Fold and transform for (int chn = 0; chn < 3; chn++){ fold_coeff[chn] = dtt.get_shifted_fold_2d ( // get_shifted_fold_2d( transform_size, residual_shift[chn][0], residual_shift[chn][1], 0); // debug level } for (int chn = 0; chn < 3; chn++){ for (int dct_mode = 0; dct_mode <4; dct_mode++) { // fpga_clt_data_in[chn][dct_mode] = dtt.fold_tile_debug (fpga_tile[chn], transform_size, dct_mode, fold_coeff[chn]); // DCCT, DSCT, DCST, DSST fpga_clt_data_in[chn][dct_mode] = dtt.fold_tile (fpga_tile[chn], transform_size, dct_mode, fold_coeff[chn]); // DCCT, DSCT, DCST, DSST } } for (int chn = 0; chn < 3; chn++) if (chn != GREEN_CHN) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ fpga_clt_data_in[chn][dct_mode][i] *= 2.0; //adding twice each number in FPGA for R and B } } } for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { fpga_clt_data_out[chn][dct_mode] = fpga_clt_data_in[chn][dct_mode].clone(); } } double scale1 = (1 << (FPGA_DTT_IN - 9)); // -1; scale1 *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale1 *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); // scale1 *= 2.0; System.out.println("scale1="+scale1); for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { System.out.println("Color="+chn+" fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv(..., scale1="+scale1); fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv (fpga_clt_data_out[chn][dct_mode], dct_mode, transform_size, scale1, ((1 << 25) -1)); // debug level // fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv (fpga_clt_data_out[chn][dct_mode], dct_mode, transform_size); } } for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { fpga_clt_data_rot[chn][dct_mode] = fpga_clt_data_out[chn][dct_mode].clone(); } } // Rotate for fractional shift: for (int chn = 0; chn < 3; chn++) { fract_shift( // fractional shift in transform domain. Currently uses sin/cos - change to tables with 2? rotations fpga_clt_data_rot[chn], // double [][] clt_tile, transform_size, residual_shift[chn][0], // double shiftX, residual_shift[chn][1], // double shiftY, true); // debug } // int byr_shift = ((ctile_top[GREEN_CHN] & 1) <<1) | (ctile_left[GREEN_CHN] & 1); //GREEN_CHN // Printout System.out.println("// Debugging FPGA implementation"); for (int chn = 0; chn<3; chn++) { System.out.println("// residual_shift["+chn+"][0]="+residual_shift[chn][0]+", residual_shift["+chn+"][1]="+residual_shift[chn][1]); ishx[chn] = (int) Math.round((1 << (FPGA_SHIFT_BITS)) * residual_shift[chn][0]); ishy[chn] = (int) Math.round((1 << (FPGA_SHIFT_BITS)) * residual_shift[chn][1]); if (ishx[chn] >= (1 << (FPGA_SHIFT_BITS-1))) ishx[chn] = (1 << (FPGA_SHIFT_BITS-1)) - 1; if (ishy[chn] >= (1 << (FPGA_SHIFT_BITS-1))) ishy[chn] = (1 << (FPGA_SHIFT_BITS-1)) - 1; if (ishx[chn] < -(1 << (FPGA_SHIFT_BITS-1))) ishx[chn] = -(1 << (FPGA_SHIFT_BITS-1)); if (ishy[chn] < -(1 << (FPGA_SHIFT_BITS-1))) ishy[chn] = -(1 << (FPGA_SHIFT_BITS-1)); residual_shift[chn][0] = ishx[chn] * (1.0/(1 << (FPGA_SHIFT_BITS))); residual_shift[chn][1] = ishy[chn] * (1.0/(1 << (FPGA_SHIFT_BITS))); System.out.println(String.format("%4x // color %d shift_x, %d bits", ishx[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),chn,FPGA_SHIFT_BITS)); System.out.println(String.format("%4x // color %d shift_y, %d bits", ishy[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),chn,FPGA_SHIFT_BITS)); System.out.println(String.format("%4x // color %d ctile_left", ctile_left[chn],chn)); System.out.println(String.format("%4x // color %d ctile_top", ctile_top[chn], chn)); } System.out.println("\n// Full Bayer fpga tile data"); int id = (1 << (FPGA_PIXEL_BITS - 9)); // 8 for (int i = 0; i < FPGA_TILE_SIZE*FPGA_TILE_SIZE; i++) { double d = 0.0; for (int fpga_chn = 0; fpga_chn < 3; fpga_chn++){ d += fpga_full_tile[fpga_chn][i]; } System.out.print(String.format("%4x ",(int) Math.round(id * d))); if (((i+1) %FPGA_TILE_SIZE) == 0) { System.out.println(); } } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_pix_lim = {0.0,0.0}; for (int i = 0; i < 256; i++) if (fpga_tile[chn][i] != 0){ if (fpga_tile[chn][i] > fpga_pix_lim[0]) fpga_pix_lim[0] = fpga_tile[chn][i]; if (fpga_tile[chn][i] < fpga_pix_lim[1]) fpga_pix_lim[1] = fpga_tile[chn][i]; } System.out.println(String.format("\n// Color # %d: Pixels input range: %f ... %f", chn, fpga_pix_lim[1], fpga_pix_lim[0])); System.out.println(String.format("//%x // shift_x, %d bits",ishx[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),FPGA_SHIFT_BITS)); System.out.println(String.format("//%x // shift_y, %d bits",ishy[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),FPGA_SHIFT_BITS)); for (int row = 0; row <16; row++){ for (int col = 0; col <16; col++){ System.out.print(String.format("%4x ",(int) Math.round(id * fpga_tile[chn][row*16 + col]))); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { System.out.println("// Color="+chn+", signs table (per mode, per index - bitstring of variants, 0 - positive, 1 - negative)"); for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int d = 0; for (int b = 0; b < 4; b++){ if (fold_coeff[chn][dct_mode][i][b] < 0){ d |= (1 << b); } } System.out.print(String.format("%x ",d)); if ((i % 16) == 15){ System.out.println(); } } } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { System.out.println("// Color = "+chn+", absolute values, mode0 (CC), others are the same"); // for (int dct_mode = 0; dct_mode <4; dct_mode++) { int dct_mode = 0; for (int i = 0; i < 64; i++){ for (int b = 0; b < 4; b++){ int d = (int) Math.round(((1 << FPGA_WND_BITS) -1)* Math.abs(fold_coeff[chn][dct_mode][i][b])); System.out.print(String.format("%5x ",d & ((1 << (FPGA_WND_BITS)) - 1))); } if ((i % 4) == 3){ System.out.println(); } } System.out.println(); // } } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ if (fpga_clt_data_in[chn][dct_mode][i] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_in[chn][dct_mode][i]; if (fpga_clt_data_in[chn][dct_mode][i] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_in[chn][dct_mode][i]; } } System.out.println(String.format("// Color= %d, DTT input range: %f ... %f", chn, fpga_dtt_lim[1], fpga_dtt_lim[0])); double scale = (1 << (FPGA_DTT_IN - 9)); // -1; scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 2; // Increased twice in FPGA adding twice each number in FPGA System.out.println("Color="+chn+" fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv(..., scale="+scale); // if (chn != GREEN_CHN) scale *= 2; // adding twice each number in FPGA for R and B - done before for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int idd = (int) Math.round(scale * fpga_clt_data_in[chn][dct_mode][i]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ if (fpga_clt_data_out[chn][dct_mode][i] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_out[chn][dct_mode][i]; if (fpga_clt_data_out[chn][dct_mode][i] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_out[chn][dct_mode][i]; } } System.out.println(String.format("// Color = %d: DTT output range: %f ... %f", chn, fpga_dtt_lim[1], fpga_dtt_lim[0])); // scale = (1 << (FPGA_DTT_IN - 9)); // -1; // double scale = (1 << (FPGA_DTT_IN - 8)); // increased twice double scale = (1 << (FPGA_DTT_IN - 9)); // Do not increase - lead to overflow ! scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); System.out.println("// Color = "+chn+" Testing symmetry of checkerboard patterns"); for (int dct_mode = 0; dct_mode < 2; dct_mode++) { for (int i = 0; i < 64; i++){ if ((i % 8) == 0) System.out.print("// "); int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); int idd1 = (int) Math.round(scale * fpga_clt_data_out[chn][3-dct_mode][63-i]); System.out.print(String.format("%7x ", (idd-idd1) & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); System.out.println("// Color = "+chn+" Testing antisymmetry of checkerboard patterns"); for (int dct_mode = 0; dct_mode < 2; dct_mode++) { for (int i = 0; i < 64; i++){ if ((i % 8) == 0) System.out.print("// "); int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); int idd1 = (int) Math.round(scale * fpga_clt_data_out[chn][3-dct_mode][63-i]); System.out.print(String.format("%7x ", (idd+idd1) & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { // double scale = (1 << (FPGA_DTT_IN - 9)); // -1; // double scale = (1 << (FPGA_DTT_IN - 8)); // double scale = (1 << (FPGA_DTT_IN - 9)); // Do not increase - lead to overflow ! // compensate for DTT scale scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); // compensate for rotator scale: scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int j = 0; j < 64; j++){ if (fpga_clt_data_rot[chn][dct_mode][j] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_rot[chn][dct_mode][j]; if (fpga_clt_data_rot[chn][dct_mode][j] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_rot[chn][dct_mode][j]; } } System.out.println(String.format("// Color = %d: DTT rotated, shift_x=%f. shift_y = %f", chn, residual_shift[chn][0],residual_shift[chn][1])); System.out.println(String.format("// DTT rotated range: %f ... %f", fpga_dtt_lim[1], fpga_dtt_lim[0])); // scale = (1 << (FPGA_DTT_IN - 9)); // -1; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int j = 0; j < 64; j++){ int idd = (int) Math.round(scale * fpga_clt_data_rot[chn][dct_mode][j]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((j % 8) == 7) System.out.println(); } System.out.println(); } } } public double [][][][][][] clt_aberrations_quad_corr( Loading Loading @@ -1194,6 +1537,7 @@ public class ImageDtt { final Matrix [] corr_rots = geometryCorrection.getCorrVector().getRotMatrices(); // get array of per-sensor rotation matrices for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -1301,7 +1645,29 @@ public class ImageDtt { } } } // if (macro_mode) ... else if (FPGA_COMPARE_DATA && (globalDebugLevel > 0) && (tileX == debug_tileX) && (tileY == debug_tileY)) { final int fpga_cam = 0; double [][] manual_offsets={ // { 1.3, -2.7}, // {-1.3, 2.7}, // { 0.0, 0.0}}; { 2.3, -2.7}, {-0.3, 2.7}, { 0.0, 0.0}}; double [][] colorCentersXY = { {centersXY[fpga_cam][0] + manual_offsets[0][0], centersXY[fpga_cam][1] + manual_offsets[0][1]}, // add manual offsets here {centersXY[fpga_cam][0] + manual_offsets[1][0], centersXY[fpga_cam][1] + manual_offsets[1][1]}, {centersXY[fpga_cam][0] + manual_offsets[2][0], centersXY[fpga_cam][1] + manual_offsets[2][1]} }; generateFPGACompareData( image_data[fpga_cam], // final double [][] image_data, // for selected subcamera colorCentersXY, // final double [][] colorCentersXY, // pixel centers per color (2 - green) transform_size, // final int transform_size, width, // final int width dtt ); } for (int chn = 0; chn <numcol; chn++) { boolean debug_for_fpga = FPGA_COMPARE_DATA && (globalDebugLevel > 0) && (tileX == debug_tileX) && (tileY == debug_tileY) && (chn == 2); Loading Loading @@ -1476,6 +1842,8 @@ public class ImageDtt { } } // calculate overexposed fraction if (saturation_imp != null) { disparity_map[OVEREXPOSED][nTile] = (1.0 * overexp_all[0]) / overexp_all[1]; Loading Loading @@ -2585,6 +2953,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -2684,6 +3053,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -2799,6 +3169,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; int n2 = transform_size * 2; Loading Loading @@ -2931,6 +3302,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3006,6 +3378,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3125,6 +3498,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3159,6 +3533,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); int tileY,tileX; Loading Loading @@ -3194,6 +3569,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; double scale = 0.25; Loading Loading @@ -3315,6 +3691,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3372,6 +3749,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3472,6 +3850,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3661,6 +4040,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX,chn; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -4091,11 +4471,7 @@ public class ImageDtt { } } System.out.println(String.format("// DTT input range: %f ... %f", fpga_dtt_lim[1], fpga_dtt_lim[0])); // double scale = (1 << (FPGA_DTT_IN - 10)) -1; /// double scale = (1 << (FPGA_DTT_IN - 8)) -1; double scale = (1 << (FPGA_DTT_IN - 9)); // -1; /// scale /= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); /// scale /= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); for (int dct_mode = 0; dct_mode <4; dct_mode++) { Loading @@ -4109,6 +4485,7 @@ public class ImageDtt { System.out.println(); for (int dct_mode = 0; dct_mode <4; dct_mode++) { System.out.println("Color= 2? clt_tile[dct_mode] = dtt.dttt_iv(..., scale=" +scale); clt_tile[dct_mode] = dtt.dttt_iv (clt_tile[dct_mode], dct_mode, transform_size, scale, ((1 << 25) -1)); // debug level } fpga_dtt_lim[0] = 0.0; Loading Loading @@ -4390,6 +4767,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -4457,6 +4835,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; double [] dct1 = new double [dct_size*dct_size]; Loading Loading
src/main/java/ImageDtt.java +921 −542 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ ** */ import java.util.concurrent.atomic.AtomicInteger; import Jama.Matrix; import ij.ImageStack; Loading Loading @@ -193,6 +194,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -426,6 +428,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -505,6 +508,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -619,6 +623,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -688,6 +693,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -750,6 +756,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -860,6 +867,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -971,9 +979,344 @@ public class ImageDtt { return clt_data; } /* * */ public void generateFPGACompareData( final double [][] image_data, // for selected subcamera final double [][] colorCentersXY, // pixel centers per color (2 - green) final int transform_size, final int width, DttRad2 dtt ){ int height = image_data[0].length/width; double [][][] fpga_clt_data_in = new double [3][4][]; double [][][] fpga_clt_data_out = new double [3][4][]; double [][][] fpga_clt_data_rot = new double [3][4][]; // double [][] fpga_fract_shiftsXY = new double[3][]; double [][] fpga_centersXY = new double [3][2]; // int [][] color_int_shifts = new int [3][2]; double [][][][] fold_coeff = new double[3][][][]; int [] ctile_left = new int [3]; int [] ctile_top = new int [3]; double [][] residual_shift = new double[3][2]; int [] ishx = new int[3]; int [] ishy = new int[3]; double [][] fpga_full_tile = new double [3][FPGA_TILE_SIZE * FPGA_TILE_SIZE]; double [][] fpga_tile = new double [3][4*transform_size*transform_size]; for (int chn = 0; chn<3; chn++) for (int j = 0; j < 2; j++) { fpga_centersXY[chn][j] = colorCentersXY[chn][j]; // Round to FPGA precision fpga_centersXY[chn][j] = Math.round(128*fpga_centersXY[chn][j])/128.0; } for (int chn = 0; chn<3; chn++) { double px = fpga_centersXY[chn][0] - transform_size; double py = fpga_centersXY[chn][1] - transform_size; // Was wrong rounding, fractional part gets to +0.5 ctile_left[chn] = (int) -Math.round(-px); ctile_top[chn] = (int) -Math.round(-py); residual_shift[chn][0] = -(px - ctile_left[chn]); residual_shift[chn][1] = -(py - ctile_top[chn]); } int lt = (FPGA_TILE_SIZE - 2 * transform_size)/2; for (int chn = 0; chn < 3; chn++){ for (int i = 0; i < FPGA_TILE_SIZE; i++){ System.arraycopy( image_data[chn], ((ctile_top[GREEN_CHN] - lt) + i) * width + (ctile_left[GREEN_CHN] - lt), fpga_full_tile[chn], FPGA_TILE_SIZE * i, FPGA_TILE_SIZE); } } for (int chn = 0; chn < 3; chn++){ if ((ctile_left[chn] >= 0) && (ctile_left[chn] < (width - transform_size * 2)) && (ctile_top[chn] >= 0) && (ctile_top[chn] < (height - transform_size * 2))) { for (int i = 0; i < transform_size * 2; i++){ System.arraycopy(image_data[chn], (ctile_top[chn] + i) * width + ctile_left[chn], fpga_tile[chn], transform_size * 2 * i, transform_size* 2); } } else { // copy by 1 for (int i = 0; i < transform_size* 2; i++){ int pi = ctile_top[chn] + i; if (pi < 0) pi &= 1; else if (pi >= height) pi = height - 2 + (pi & 1); for (int j = 0; j < transform_size* 2; j++){ int pj = ctile_left[chn] + j; if (pj < 0) pj &= 1; else if (pj >= width) pj = width - 2 + (pj & 1); fpga_tile[chn][transform_size * 2 * i + j] = image_data[chn][pi * width + pj]; } } } } // Fold and transform for (int chn = 0; chn < 3; chn++){ fold_coeff[chn] = dtt.get_shifted_fold_2d ( // get_shifted_fold_2d( transform_size, residual_shift[chn][0], residual_shift[chn][1], 0); // debug level } for (int chn = 0; chn < 3; chn++){ for (int dct_mode = 0; dct_mode <4; dct_mode++) { // fpga_clt_data_in[chn][dct_mode] = dtt.fold_tile_debug (fpga_tile[chn], transform_size, dct_mode, fold_coeff[chn]); // DCCT, DSCT, DCST, DSST fpga_clt_data_in[chn][dct_mode] = dtt.fold_tile (fpga_tile[chn], transform_size, dct_mode, fold_coeff[chn]); // DCCT, DSCT, DCST, DSST } } for (int chn = 0; chn < 3; chn++) if (chn != GREEN_CHN) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ fpga_clt_data_in[chn][dct_mode][i] *= 2.0; //adding twice each number in FPGA for R and B } } } for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { fpga_clt_data_out[chn][dct_mode] = fpga_clt_data_in[chn][dct_mode].clone(); } } double scale1 = (1 << (FPGA_DTT_IN - 9)); // -1; scale1 *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale1 *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); // scale1 *= 2.0; System.out.println("scale1="+scale1); for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { System.out.println("Color="+chn+" fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv(..., scale1="+scale1); fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv (fpga_clt_data_out[chn][dct_mode], dct_mode, transform_size, scale1, ((1 << 25) -1)); // debug level // fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv (fpga_clt_data_out[chn][dct_mode], dct_mode, transform_size); } } for (int chn = 0; chn < 3; chn++) { for (int dct_mode = 0; dct_mode <4; dct_mode++) { fpga_clt_data_rot[chn][dct_mode] = fpga_clt_data_out[chn][dct_mode].clone(); } } // Rotate for fractional shift: for (int chn = 0; chn < 3; chn++) { fract_shift( // fractional shift in transform domain. Currently uses sin/cos - change to tables with 2? rotations fpga_clt_data_rot[chn], // double [][] clt_tile, transform_size, residual_shift[chn][0], // double shiftX, residual_shift[chn][1], // double shiftY, true); // debug } // int byr_shift = ((ctile_top[GREEN_CHN] & 1) <<1) | (ctile_left[GREEN_CHN] & 1); //GREEN_CHN // Printout System.out.println("// Debugging FPGA implementation"); for (int chn = 0; chn<3; chn++) { System.out.println("// residual_shift["+chn+"][0]="+residual_shift[chn][0]+", residual_shift["+chn+"][1]="+residual_shift[chn][1]); ishx[chn] = (int) Math.round((1 << (FPGA_SHIFT_BITS)) * residual_shift[chn][0]); ishy[chn] = (int) Math.round((1 << (FPGA_SHIFT_BITS)) * residual_shift[chn][1]); if (ishx[chn] >= (1 << (FPGA_SHIFT_BITS-1))) ishx[chn] = (1 << (FPGA_SHIFT_BITS-1)) - 1; if (ishy[chn] >= (1 << (FPGA_SHIFT_BITS-1))) ishy[chn] = (1 << (FPGA_SHIFT_BITS-1)) - 1; if (ishx[chn] < -(1 << (FPGA_SHIFT_BITS-1))) ishx[chn] = -(1 << (FPGA_SHIFT_BITS-1)); if (ishy[chn] < -(1 << (FPGA_SHIFT_BITS-1))) ishy[chn] = -(1 << (FPGA_SHIFT_BITS-1)); residual_shift[chn][0] = ishx[chn] * (1.0/(1 << (FPGA_SHIFT_BITS))); residual_shift[chn][1] = ishy[chn] * (1.0/(1 << (FPGA_SHIFT_BITS))); System.out.println(String.format("%4x // color %d shift_x, %d bits", ishx[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),chn,FPGA_SHIFT_BITS)); System.out.println(String.format("%4x // color %d shift_y, %d bits", ishy[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),chn,FPGA_SHIFT_BITS)); System.out.println(String.format("%4x // color %d ctile_left", ctile_left[chn],chn)); System.out.println(String.format("%4x // color %d ctile_top", ctile_top[chn], chn)); } System.out.println("\n// Full Bayer fpga tile data"); int id = (1 << (FPGA_PIXEL_BITS - 9)); // 8 for (int i = 0; i < FPGA_TILE_SIZE*FPGA_TILE_SIZE; i++) { double d = 0.0; for (int fpga_chn = 0; fpga_chn < 3; fpga_chn++){ d += fpga_full_tile[fpga_chn][i]; } System.out.print(String.format("%4x ",(int) Math.round(id * d))); if (((i+1) %FPGA_TILE_SIZE) == 0) { System.out.println(); } } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_pix_lim = {0.0,0.0}; for (int i = 0; i < 256; i++) if (fpga_tile[chn][i] != 0){ if (fpga_tile[chn][i] > fpga_pix_lim[0]) fpga_pix_lim[0] = fpga_tile[chn][i]; if (fpga_tile[chn][i] < fpga_pix_lim[1]) fpga_pix_lim[1] = fpga_tile[chn][i]; } System.out.println(String.format("\n// Color # %d: Pixels input range: %f ... %f", chn, fpga_pix_lim[1], fpga_pix_lim[0])); System.out.println(String.format("//%x // shift_x, %d bits",ishx[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),FPGA_SHIFT_BITS)); System.out.println(String.format("//%x // shift_y, %d bits",ishy[chn] & ((1 << (FPGA_SHIFT_BITS)) - 1),FPGA_SHIFT_BITS)); for (int row = 0; row <16; row++){ for (int col = 0; col <16; col++){ System.out.print(String.format("%4x ",(int) Math.round(id * fpga_tile[chn][row*16 + col]))); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { System.out.println("// Color="+chn+", signs table (per mode, per index - bitstring of variants, 0 - positive, 1 - negative)"); for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int d = 0; for (int b = 0; b < 4; b++){ if (fold_coeff[chn][dct_mode][i][b] < 0){ d |= (1 << b); } } System.out.print(String.format("%x ",d)); if ((i % 16) == 15){ System.out.println(); } } } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { System.out.println("// Color = "+chn+", absolute values, mode0 (CC), others are the same"); // for (int dct_mode = 0; dct_mode <4; dct_mode++) { int dct_mode = 0; for (int i = 0; i < 64; i++){ for (int b = 0; b < 4; b++){ int d = (int) Math.round(((1 << FPGA_WND_BITS) -1)* Math.abs(fold_coeff[chn][dct_mode][i][b])); System.out.print(String.format("%5x ",d & ((1 << (FPGA_WND_BITS)) - 1))); } if ((i % 4) == 3){ System.out.println(); } } System.out.println(); // } } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ if (fpga_clt_data_in[chn][dct_mode][i] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_in[chn][dct_mode][i]; if (fpga_clt_data_in[chn][dct_mode][i] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_in[chn][dct_mode][i]; } } System.out.println(String.format("// Color= %d, DTT input range: %f ... %f", chn, fpga_dtt_lim[1], fpga_dtt_lim[0])); double scale = (1 << (FPGA_DTT_IN - 9)); // -1; scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 2; // Increased twice in FPGA adding twice each number in FPGA System.out.println("Color="+chn+" fpga_clt_data_out[chn][dct_mode] = dtt.dttt_iv(..., scale="+scale); // if (chn != GREEN_CHN) scale *= 2; // adding twice each number in FPGA for R and B - done before for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int idd = (int) Math.round(scale * fpga_clt_data_in[chn][dct_mode][i]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ if (fpga_clt_data_out[chn][dct_mode][i] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_out[chn][dct_mode][i]; if (fpga_clt_data_out[chn][dct_mode][i] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_out[chn][dct_mode][i]; } } System.out.println(String.format("// Color = %d: DTT output range: %f ... %f", chn, fpga_dtt_lim[1], fpga_dtt_lim[0])); // scale = (1 << (FPGA_DTT_IN - 9)); // -1; // double scale = (1 << (FPGA_DTT_IN - 8)); // increased twice double scale = (1 << (FPGA_DTT_IN - 9)); // Do not increase - lead to overflow ! scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int i = 0; i < 64; i++){ int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); System.out.println("// Color = "+chn+" Testing symmetry of checkerboard patterns"); for (int dct_mode = 0; dct_mode < 2; dct_mode++) { for (int i = 0; i < 64; i++){ if ((i % 8) == 0) System.out.print("// "); int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); int idd1 = (int) Math.round(scale * fpga_clt_data_out[chn][3-dct_mode][63-i]); System.out.print(String.format("%7x ", (idd-idd1) & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); System.out.println("// Color = "+chn+" Testing antisymmetry of checkerboard patterns"); for (int dct_mode = 0; dct_mode < 2; dct_mode++) { for (int i = 0; i < 64; i++){ if ((i % 8) == 0) System.out.print("// "); int idd = (int) Math.round(scale * fpga_clt_data_out[chn][dct_mode][i]); int idd1 = (int) Math.round(scale * fpga_clt_data_out[chn][3-dct_mode][63-i]); System.out.print(String.format("%7x ", (idd+idd1) & ((1 << 25) -1))); if ((i % 8) == 7) System.out.println(); } System.out.println(); } System.out.println(); } System.out.println(); for (int chn = 0; chn<3; chn++) { // double scale = (1 << (FPGA_DTT_IN - 9)); // -1; // double scale = (1 << (FPGA_DTT_IN - 8)); // double scale = (1 << (FPGA_DTT_IN - 9)); // Do not increase - lead to overflow ! // compensate for DTT scale scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); // compensate for rotator scale: scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); double [] fpga_dtt_lim = {0.0,0.0}; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int j = 0; j < 64; j++){ if (fpga_clt_data_rot[chn][dct_mode][j] > fpga_dtt_lim[0]) fpga_dtt_lim[0] = fpga_clt_data_rot[chn][dct_mode][j]; if (fpga_clt_data_rot[chn][dct_mode][j] < fpga_dtt_lim[1]) fpga_dtt_lim[1] = fpga_clt_data_rot[chn][dct_mode][j]; } } System.out.println(String.format("// Color = %d: DTT rotated, shift_x=%f. shift_y = %f", chn, residual_shift[chn][0],residual_shift[chn][1])); System.out.println(String.format("// DTT rotated range: %f ... %f", fpga_dtt_lim[1], fpga_dtt_lim[0])); // scale = (1 << (FPGA_DTT_IN - 9)); // -1; for (int dct_mode = 0; dct_mode <4; dct_mode++) { for (int j = 0; j < 64; j++){ int idd = (int) Math.round(scale * fpga_clt_data_rot[chn][dct_mode][j]); System.out.print(String.format("%7x ", idd & ((1 << 25) -1))); if ((j % 8) == 7) System.out.println(); } System.out.println(); } } } public double [][][][][][] clt_aberrations_quad_corr( Loading Loading @@ -1194,6 +1537,7 @@ public class ImageDtt { final Matrix [] corr_rots = geometryCorrection.getCorrVector().getRotMatrices(); // get array of per-sensor rotation matrices for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(transform_size); dtt.set_window(window_type); Loading Loading @@ -1301,7 +1645,29 @@ public class ImageDtt { } } } // if (macro_mode) ... else if (FPGA_COMPARE_DATA && (globalDebugLevel > 0) && (tileX == debug_tileX) && (tileY == debug_tileY)) { final int fpga_cam = 0; double [][] manual_offsets={ // { 1.3, -2.7}, // {-1.3, 2.7}, // { 0.0, 0.0}}; { 2.3, -2.7}, {-0.3, 2.7}, { 0.0, 0.0}}; double [][] colorCentersXY = { {centersXY[fpga_cam][0] + manual_offsets[0][0], centersXY[fpga_cam][1] + manual_offsets[0][1]}, // add manual offsets here {centersXY[fpga_cam][0] + manual_offsets[1][0], centersXY[fpga_cam][1] + manual_offsets[1][1]}, {centersXY[fpga_cam][0] + manual_offsets[2][0], centersXY[fpga_cam][1] + manual_offsets[2][1]} }; generateFPGACompareData( image_data[fpga_cam], // final double [][] image_data, // for selected subcamera colorCentersXY, // final double [][] colorCentersXY, // pixel centers per color (2 - green) transform_size, // final int transform_size, width, // final int width dtt ); } for (int chn = 0; chn <numcol; chn++) { boolean debug_for_fpga = FPGA_COMPARE_DATA && (globalDebugLevel > 0) && (tileX == debug_tileX) && (tileY == debug_tileY) && (chn == 2); Loading Loading @@ -1476,6 +1842,8 @@ public class ImageDtt { } } // calculate overexposed fraction if (saturation_imp != null) { disparity_map[OVEREXPOSED][nTile] = (1.0 * overexp_all[0]) / overexp_all[1]; Loading Loading @@ -2585,6 +2953,7 @@ public class ImageDtt { } for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -2684,6 +3053,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -2799,6 +3169,7 @@ public class ImageDtt { ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; int n2 = transform_size * 2; Loading Loading @@ -2931,6 +3302,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3006,6 +3378,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3125,6 +3498,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3159,6 +3533,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); int tileY,tileX; Loading Loading @@ -3194,6 +3569,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; double scale = 0.25; Loading Loading @@ -3315,6 +3691,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3372,6 +3749,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3472,6 +3850,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -3661,6 +4040,7 @@ public class ImageDtt { final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX,chn; for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { Loading Loading @@ -4091,11 +4471,7 @@ public class ImageDtt { } } System.out.println(String.format("// DTT input range: %f ... %f", fpga_dtt_lim[1], fpga_dtt_lim[0])); // double scale = (1 << (FPGA_DTT_IN - 10)) -1; /// double scale = (1 << (FPGA_DTT_IN - 8)) -1; double scale = (1 << (FPGA_DTT_IN - 9)); // -1; /// scale /= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); /// scale /= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); scale *= 1.0 *((1 << FPGA_WND_BITS) -1) / (1 << FPGA_WND_BITS); for (int dct_mode = 0; dct_mode <4; dct_mode++) { Loading @@ -4109,6 +4485,7 @@ public class ImageDtt { System.out.println(); for (int dct_mode = 0; dct_mode <4; dct_mode++) { System.out.println("Color= 2? clt_tile[dct_mode] = dtt.dttt_iv(..., scale=" +scale); clt_tile[dct_mode] = dtt.dttt_iv (clt_tile[dct_mode], dct_mode, transform_size, scale, ((1 << 25) -1)); // debug level } fpga_dtt_lim[0] = 0.0; Loading Loading @@ -4390,6 +4767,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { DttRad2 dtt = new DttRad2(dct_size); dtt.set_window(window_type); Loading Loading @@ -4457,6 +4835,7 @@ public class ImageDtt { for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { @Override public void run() { int tileY,tileX; double [] dct1 = new double [dct_size*dct_size]; Loading