31#pragma omp declare simd
37 uint64_t result = (seed ^ (seed >> 33)) * 0x62a9d9ed799705f5ul;
38 result = (result ^ (result >> 28)) * 0xcb24d0a5c88c35b3ul;
39 return (uint32_t)(result >> 32);
44#pragma omp declare simd uniform(k)
46static inline uint32_t
rol32(
const uint32_t x,
const int k)
48 return (x << k) | (x >> (32 - k));
53#pragma omp declare simd aligned(state:64)
59 const unsigned int result = state[0] + state[3];
60 const unsigned int t = state[1] << 9;
68 state[3] =
rol32(state[3], 11);
70 return (
float)(result >> 8) * 0x1.0p-24f;
75#pragma omp declare simd uniform(sigma) aligned(state:64)
77static inline float uniform_noise(
const float mu,
const float sigma, uint32_t state[4])
84#pragma omp declare simd uniform(sigma) aligned(state:64)
86static inline float gaussian_noise(
const float mu,
const float sigma,
const int flip, uint32_t state[4])
95 const float noise = (
flip) ? sqrtf(-2.0f * logf(u1)) * cosf(2.f *
M_PI * u2) :
96 sqrtf(-2.0f * logf(u1)) * sinf(2.f *
M_PI * u2);
97 return noise * sigma + mu;
102#pragma omp declare simd uniform(sigma) aligned(state:64)
104static inline float poisson_noise(
const float mu,
const float sigma,
const int flip, uint32_t state[4])
109 const float noise = (
flip) ? sqrtf(-2.0f * logf(u1)) * cosf(2.f *
M_PI * u2) :
110 sqrtf(-2.0f * logf(u1)) * sinf(2.f *
M_PI * u2);
111 const float r = noise * sigma + 2.0f * sqrtf(fmaxf(mu + 3.f / 8.f, 0.0f));
112 return (r * r - sigma * sigma) / 4.f - 3.f / 8.f;
117#pragma omp declare simd uniform(distribution, param) aligned(state:64)
120 const float mu,
const float param,
const int flip, uint32_t state[4])
139#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, out:16)
142 uint32_t state[4], dt_aligned_pixel_t out)
147 out[c] = mu[c] + 2.0f * (noise[c] - 0.5f) * sigma[c];
152#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, flip, out:16)
155 const int flip[4], uint32_t state[4], dt_aligned_pixel_t out)
162 dt_aligned_pixel_t u1 = { 0.f };
163 dt_aligned_pixel_t u2 = { 0.f };
166 for(
size_t c = 0; c < 3; c++)
170 for(
size_t c = 0; c < 3; c++)
173 dt_aligned_pixel_t noise = { 0.f };
177 noise[c] = (
flip[c]) ? sqrtf(-2.0f * logf(u1[c])) * cosf(2.f *
M_PI * u2[c]) :
178 sqrtf(-2.0f * logf(u1[c])) * sinf(2.f *
M_PI * u2[c]);
182 out[c] = noise[c] * sigma[c] + mu[c];
187#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, flip, out:16)
190 uint32_t state[4], dt_aligned_pixel_t out)
193 dt_aligned_pixel_t u1 = { 0.f };
194 dt_aligned_pixel_t u2 = { 0.f };
197 for(
size_t c = 0; c < 3; c++)
203 dt_aligned_pixel_t noise = { 0.f };
207 noise[c] = (
flip[c]) ? sqrtf(-2.0f * logf(u1[c])) * cosf(2.f *
M_PI * u2[c]) :
208 sqrtf(-2.0f * logf(u1[c])) * sinf(2.f *
M_PI * u2[c]);
212 dt_aligned_pixel_t r = { 0.f };
217 r[c] = noise[c] * sigma[c] + 2.0f * sqrtf(fmaxf(mu[c] + 3.f / 8.f, 0.0f));
218 out[c] = (r[c] * r[c] - sigma[c] * sigma[c]) / 4.f - 3.f / 8.f;
224#pragma omp declare simd uniform(distribution, param) aligned(state:64) aligned(mu, param, flip, out:16)
227 const dt_aligned_pixel_t mu,
const dt_aligned_pixel_t param,
228 const int flip[4], uint32_t state[4], dt_aligned_pixel_t out)
#define for_each_channel(_var,...)
Definition darktable.h:411
dt_noise_distribution_t
Definition data/kernels/noise_generator.h:23
static void flip(float *x, float *y)
Definition lightroom.c:1035
#define M_PI
Definition math.h:37
dt_noise_distribution_t
Definition src/develop/noise_generator.h:23
@ DT_NOISE_GAUSSIAN
Definition src/develop/noise_generator.h:25
@ DT_NOISE_POISSONIAN
Definition src/develop/noise_generator.h:26
@ DT_NOISE_UNIFORM
Definition src/develop/noise_generator.h:24
static void gaussian_noise_simd(const dt_aligned_pixel_t mu, const dt_aligned_pixel_t sigma, const int flip[4], uint32_t state[4], dt_aligned_pixel_t out)
Definition src/develop/noise_generator.h:154
static float dt_noise_generator(const dt_noise_distribution_t distribution, const float mu, const float param, const int flip, uint32_t state[4])
Definition src/develop/noise_generator.h:119
static float poisson_noise(const float mu, const float sigma, const int flip, uint32_t state[4])
Definition src/develop/noise_generator.h:104
static void dt_noise_generator_simd(const dt_noise_distribution_t distribution, const dt_aligned_pixel_t mu, const dt_aligned_pixel_t param, const int flip[4], uint32_t state[4], dt_aligned_pixel_t out)
Definition src/develop/noise_generator.h:226
static float uniform_noise(const float mu, const float sigma, uint32_t state[4])
Definition src/develop/noise_generator.h:77
static void poisson_noise_simd(const dt_aligned_pixel_t mu, const dt_aligned_pixel_t sigma, const int flip[4], uint32_t state[4], dt_aligned_pixel_t out)
Definition src/develop/noise_generator.h:189
static float gaussian_noise(const float mu, const float sigma, const int flip, uint32_t state[4])
Definition src/develop/noise_generator.h:86
static uint32_t rol32(const uint32_t x, const int k)
Definition src/develop/noise_generator.h:46
static float xoshiro128plus(uint32_t state[4])
Definition src/develop/noise_generator.h:55
static void uniform_noise_simd(const dt_aligned_pixel_t mu, const dt_aligned_pixel_t sigma, uint32_t state[4], dt_aligned_pixel_t out)
Definition src/develop/noise_generator.h:141
static uint32_t splitmix32(const uint64_t seed)
Definition src/develop/noise_generator.h:33
unsigned __int64 uint64_t
Definition strptime.c:71