52 lines
1.5 KiB
C
52 lines
1.5 KiB
C
#pragma once
|
||
|
||
#include <gsl/gsl_histogram.h>
|
||
#include <gsl/gsl_vector_double.h>
|
||
|
||
/* Intensity function parameters */
|
||
struct param {
|
||
double a; // aperture radius
|
||
double k; // wavenumber
|
||
double e; // wave amplitude
|
||
double l; // screen distance
|
||
};
|
||
|
||
|
||
/* Intensity of the EM field at a large distance
|
||
* from a circular aperture diffraction of a plane
|
||
* wave.
|
||
*
|
||
* The intensity is given as a function of θ,
|
||
* the diffraction angle. All the other physical
|
||
* parameters are controlled by the structure `param`.
|
||
*
|
||
* See Fraunhöfer diffraction on "Hect - Optics" for
|
||
* a derivation of the formula.
|
||
*/
|
||
double intensity(double theta, struct param p);
|
||
|
||
|
||
/* `gaussian_kernel(bins, sigma)` generates a convolution
|
||
* kernel for the intensity histogram with `bins` bins.
|
||
*
|
||
* The kernel is a gaussian PDF with μ at the central bin
|
||
* and σ equal to `sigma`. The size is 6% of `bins` and
|
||
* the bin width is the same of the intensity histogram:
|
||
* π/2 / `bins`.
|
||
*/
|
||
gsl_histogram* gaussian_kernel(size_t bins, double sigma);
|
||
|
||
|
||
/* `gsl_vector_convolve(a, b, res)` computes the linear
|
||
* convolution of two vectors. The resulting vector
|
||
* has size `a->n + b->n - 1` and is stored in `res`.
|
||
*/
|
||
int gsl_vector_convolve(gsl_vector *a, gsl_vector *b, gsl_vector *res);
|
||
|
||
|
||
/* Convolves two histograms while keeping the
|
||
* original bin edges. This is a simple wrapper
|
||
* function around `gsl_vector_convolve`.
|
||
*/
|
||
gsl_histogram* histogram_convolve(gsl_histogram *a, gsl_histogram *b);
|