Commit 332925ad3ee1a2c21bda3f7b0630633752e47ca4
1 parent
573a6ded
added the ability to crop agilent binary files
Showing
1 changed file
with
28 additions
and
7 deletions
Show diff stats
stim/envi/agilent_binary.h
... | ... | @@ -44,6 +44,10 @@ public: |
44 | 44 | alloc(); |
45 | 45 | } |
46 | 46 | |
47 | + char* data() { | |
48 | + return (char*)ptr; | |
49 | + } | |
50 | + | |
47 | 51 | size_t dim(size_t i){ |
48 | 52 | return R[i]; |
49 | 53 | } |
... | ... | @@ -84,6 +88,11 @@ public: |
84 | 88 | return *this; //return the result |
85 | 89 | } |
86 | 90 | |
91 | + operator bool() { | |
92 | + if (R[0] == 0 || R[1] == 0 || R[2] == 0) return false; | |
93 | + else return true; | |
94 | + } | |
95 | + | |
87 | 96 | ~agilent_binary(){ |
88 | 97 | free(ptr); |
89 | 98 | } |
... | ... | @@ -189,6 +198,17 @@ public: |
189 | 198 | ptr[i] = -log10(ptr[i] / background->ptr[i]); |
190 | 199 | } |
191 | 200 | |
201 | + //crops the image down to a set number of samples | |
202 | + void crop(size_t n) { | |
203 | + if (n < R[2]) { //if the requested size is smaller than the image | |
204 | + R[2] = n; //update the number of bands | |
205 | + T* old_ptr = ptr; //store the old pointer | |
206 | + alloc(); //allocate space for the new image | |
207 | + memcpy(ptr, old_ptr, bytes()); //copy the old data to the new image | |
208 | + free(old_ptr); //free the old data | |
209 | + } | |
210 | + } | |
211 | + | |
192 | 212 | //#ifdef CUDA_FOUND |
193 | 213 | /// Perform an FFT and return a binary file with bands in the specified range |
194 | 214 | agilent_binary<T> fft(double band_min, double band_max, double ELWN = 15798, int UDR = 2){ |
... | ... | @@ -242,18 +262,19 @@ public: |
242 | 262 | HANDLE_ERROR(cudaMemcpy(cpu_fft, gpu_fft, R[0] * R[1] * (R[2]/2+1) * sizeof(cufftComplex), cudaMemcpyDeviceToHost)); //copy data from the host to the device |
243 | 263 | |
244 | 264 | //double int_delta = 0.00012656; //interferogram sample spacing in centimeters |
245 | - double int_delta = (1.0 / ELWN) * ((double)UDR / 2.0); //calculate the interferogram spacing | |
246 | - double int_length = int_delta * R[2]; //interferogram length in centimeters | |
247 | - double fft_delta = 1/int_length; //spectrum spacing (in inverse centimeters, wavenumber) | |
248 | - double fft_max = fft_delta * R[2]/2; //get the maximum wavenumber value supported by the specified number of interferogram samples | |
265 | + double int_delta = (1.0 / ELWN) * ((double)UDR / 2.0); //calculate the interferogram spacing | |
266 | + double int_length = int_delta * R[2]; //interferogram length in centimeters | |
267 | + double fft_delta = 1/int_length; //spectrum spacing (in inverse centimeters, wavenumber) | |
268 | + double fft_max = fft_delta * R[2]/2; //get the maximum wavenumber value supported by the specified number of interferogram samples | |
249 | 269 | |
250 | - if(band_max > fft_max) band_max = fft_max; //the user gave a band outside of the FFT range, reset the band to the maximum available | |
270 | + if(band_max > fft_max) band_max = fft_max; //the user gave a band outside of the FFT range, reset the band to the maximum available | |
271 | + if (band_min < 0) band_min = 0; | |
251 | 272 | |
252 | 273 | size_t start_i = (size_t)std::ceil(band_min / fft_delta); //calculate the first band to store |
253 | 274 | size_t size_i = (size_t)std::floor(band_max / fft_delta) - start_i; //calculate the number of bands to store |
254 | - size_t end_i = start_i + size_i; //last band number | |
275 | + size_t end_i = start_i + size_i; //last band number | |
255 | 276 | agilent_binary<T> result(R[0], R[1], size_i); |
256 | - result.Z[0] = start_i * fft_delta; //set the range for the FFT result | |
277 | + result.Z[0] = start_i * fft_delta; //set the range for the FFT result | |
257 | 278 | result.Z[1] = end_i * fft_delta; |
258 | 279 | |
259 | 280 | for(size_t b = start_i; b < end_i; b++){ | ... | ... |