def propagate_1D_fraunhofer(wavefront, propagation_distance=0.0, shift_half_pixel=1): """ 1D Fraunhofer propagator using convolution via Fourier transform :param wavefront: :param propagation_distance: propagation distance. If set to zero, the abscissas of the returned wavefront are in angle (rad) :return: a new 1D wavefront object with propagated wavefront """ fft = numpy.fft.fft(wavefront.get_complex_amplitude()) fft2 = numpy.fft.fftshift(fft) # frequency for axis 1 freq_nyquist = 0.5/wavefront.delta() freq_n = numpy.linspace(-1.0,1.0,wavefront.size()) freq_x = freq_n * freq_nyquist freq_x *= wavefront.get_wavelength() if shift_half_pixel: freq_x = freq_x - 0.5 * numpy.abs(freq_x[1] - freq_x[0]) if propagation_distance == 0: wf = Wavefront1D.initialize_wavefront_from_arrays(freq_x,fft2,wavelength=wavefront.get_wavelength()) return wf else: wf = Wavefront1D.initialize_wavefront_from_arrays(freq_x*propagation_distance,fft2,wavelength=wavefront.get_wavelength()) return wf
def test_initializers(self,do_plot=do_plot): print("# ") print("# Tests for initializars (1D) ") print("# ") x = numpy.linspace(-100,100,50) y = numpy.abs(x)**1.5 + 1j*numpy.abs(x)**1.8 wf0 = Wavefront1D.initialize_wavefront_from_steps(x[0],numpy.abs(x[1]-x[0]),y.size) wf0.set_complex_amplitude(y) wf1 = Wavefront1D.initialize_wavefront_from_range(x[0],x[-1],y.size) wf1.set_complex_amplitude(y) wf2 = Wavefront1D.initialize_wavefront_from_arrays(x,y) print("wavefront sizes: ",wf1.size(),wf1.size(),wf2.size()) if do_plot: from srxraylib.plot.gol import plot plot(wf0.get_abscissas(),wf0.get_intensity(), title="initialize_wavefront_from_steps",show=0) plot(wf1.get_abscissas(),wf1.get_intensity(), title="initialize_wavefront_from_range",show=0) plot(wf2.get_abscissas(),wf2.get_intensity(), title="initialize_wavefront_from_arrays",show=1) numpy.testing.assert_almost_equal(wf0.get_intensity(),numpy.abs(y)**2,5) numpy.testing.assert_almost_equal(wf1.get_intensity(),numpy.abs(y)**2,5) numpy.testing.assert_almost_equal(x,wf1.get_abscissas(),11) numpy.testing.assert_almost_equal(x,wf2.get_abscissas(),11)
def propagate_1D_fraunhofer( wavefront, propagation_distance=0.0, shift_half_pixel=0): # todo: modificato da giovanni """ 1D Fraunhofer propagator using convolution via Fourier transform :param shift_half_pixel: :param shift_half_pixel: :param wavefront: :param propagation_distance: propagation distance. If set to zero, the abscissas of the returned wavefront are in angle (rad) :return: a new 1D wavefront object with propagated wavefront """ shape = wavefront.size() delta = wavefront.delta() wavenumber = wavefront.get_wavenumber() wavelength = wavefront.get_wavelength() fft_scale = numpy.fft.fftfreq(shape, d=delta) fft_scale = numpy.fft.fftshift(fft_scale) x2 = fft_scale * propagation_distance * wavelength # freq_nyquist = 0.5 / delta # freq_n = numpy.linspace(-1.0, 1.0, shape) # freq_x = freq_n * freq_nyquist # freq_x *= wavelength * propagation_distance # x2 = freq_x P1 = numpy.exp(1.0j * wavenumber * propagation_distance) P2 = numpy.exp(1.0j * wavenumber / (2 * propagation_distance) * x2**2) P3 = 1.0j * wavelength * propagation_distance fft = numpy.fft.fft(wavefront.get_complex_amplitude()) fft *= P1 fft *= P2 fft /= P3 # fft *= P4 fft2 = numpy.fft.fftshift(fft) if shift_half_pixel: x2 = x2 - 0.5 * numpy.abs(x2[1] - x2[0]) return Wavefront1D.initialize_wavefront_from_arrays( x2, fft2, wavelength=wavefront.get_wavelength())
def test_initializers(self, do_plot=do_plot): print("# ") print("# Tests for initializars (1D) ") print("# ") x = numpy.linspace(-100, 100, 50) y = numpy.abs(x)**1.5 + 1j * numpy.abs(x)**1.8 wf0 = Wavefront1D.initialize_wavefront_from_steps( x[0], numpy.abs(x[1] - x[0]), y.size) wf0.set_complex_amplitude(y) wf1 = Wavefront1D.initialize_wavefront_from_range(x[0], x[-1], y.size) wf1.set_complex_amplitude(y) wf2 = Wavefront1D.initialize_wavefront_from_arrays(x, y) print("wavefront sizes: ", wf1.size(), wf1.size(), wf2.size()) if do_plot: from srxraylib.plot.gol import plot plot(wf0.get_abscissas(), wf0.get_intensity(), title="initialize_wavefront_from_steps", show=0) plot(wf1.get_abscissas(), wf1.get_intensity(), title="initialize_wavefront_from_range", show=0) plot(wf2.get_abscissas(), wf2.get_intensity(), title="initialize_wavefront_from_arrays", show=1) numpy.testing.assert_almost_equal(wf0.get_intensity(), numpy.abs(y)**2, 5) numpy.testing.assert_almost_equal(wf1.get_intensity(), numpy.abs(y)**2, 5) numpy.testing.assert_almost_equal(x, wf1.get_abscissas(), 11) numpy.testing.assert_almost_equal(x, wf2.get_abscissas(), 11)