33#pragma omp declare simd
39 uint64_t result = (seed ^ (seed >> 33)) * 0x62a9d9ed799705f5ul;
40 result = (result ^ (result >> 28)) * 0xcb24d0a5c88c35b3ul;
41 return (uint32_t)(result >> 32);
46#pragma omp declare simd uniform(k)
48static inline uint32_t
rol32(
const uint32_t
x,
const int k)
50 return (
x << k) | (
x >> (32 - k));
55#pragma omp declare simd aligned(state:64)
61 const unsigned int result = state[0] + state[3];
62 const unsigned int t = state[1] << 9;
70 state[3] =
rol32(state[3], 11);
72 return (
float)(result >> 8) * 0x1.0p-24f;
77#pragma omp declare simd uniform(sigma) aligned(state:64)
79static inline float uniform_noise(
const float mu,
const float sigma, uint32_t state[4])
86#pragma omp declare simd uniform(sigma) aligned(state:64)
88static inline float gaussian_noise(
const float mu,
const float sigma,
const int flip, uint32_t state[4])
97 const float noise = (
flip) ? sqrtf(-2.0f * logf(u1)) * cosf(2.f *
M_PI * u2) :
98 sqrtf(-2.0f * logf(u1)) * sinf(2.f *
M_PI * u2);
99 return noise * sigma + mu;
104#pragma omp declare simd uniform(sigma) aligned(state:64)
106static inline float poisson_noise(
const float mu,
const float sigma,
const int flip, uint32_t state[4])
111 const float noise = (
flip) ? sqrtf(-2.0f * logf(u1)) * cosf(2.f *
M_PI * u2) :
112 sqrtf(-2.0f * logf(u1)) * sinf(2.f *
M_PI * u2);
113 const float r = noise * sigma + 2.0f * sqrtf(fmaxf(mu + 3.f / 8.f, 0.0f));
114 return (
r *
r - sigma * sigma) / 4.f - 3.f / 8.f;
119#pragma omp declare simd uniform(distribution, param) aligned(state:64)
122 const float mu,
const float param,
const int flip, uint32_t state[4])
141#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, out:16)
144 uint32_t state[4], dt_aligned_pixel_t
out)
149 out[
c] = mu[
c] + 2.0f * (noise[
c] - 0.5f) * sigma[
c];
154#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, flip, out:16)
157 const int flip[4], uint32_t state[4], dt_aligned_pixel_t
out)
164 dt_aligned_pixel_t u1 = { 0.f };
165 dt_aligned_pixel_t u2 = { 0.f };
168 for(
size_t c = 0;
c < 3;
c++)
172 for(
size_t c = 0;
c < 3;
c++)
175 dt_aligned_pixel_t noise = { 0.f };
179 noise[
c] = (
flip[
c]) ? sqrtf(-2.0f * logf(u1[
c])) * cosf(2.f *
M_PI * u2[
c]) :
180 sqrtf(-2.0f * logf(u1[
c])) * sinf(2.f *
M_PI * u2[
c]);
184 out[
c] = noise[
c] * sigma[
c] + mu[
c];
189#pragma omp declare simd uniform(sigma) aligned(state:64) aligned(mu, sigma, flip, out:16)
192 uint32_t state[4], dt_aligned_pixel_t
out)
195 dt_aligned_pixel_t u1 = { 0.f };
196 dt_aligned_pixel_t u2 = { 0.f };
199 for(
size_t c = 0;
c < 3;
c++)
205 dt_aligned_pixel_t noise = { 0.f };
209 noise[
c] = (
flip[
c]) ? sqrtf(-2.0f * logf(u1[
c])) * cosf(2.f *
M_PI * u2[
c]) :
210 sqrtf(-2.0f * logf(u1[
c])) * sinf(2.f *
M_PI * u2[
c]);
214 dt_aligned_pixel_t
r = { 0.f };
219 r[
c] = noise[
c] * sigma[
c] + 2.0f * sqrtf(fmaxf(mu[
c] + 3.f / 8.f, 0.0f));
220 out[
c] = (
r[
c] *
r[
c] - sigma[
c] * sigma[
c]) / 4.f - 3.f / 8.f;
226#pragma omp declare simd uniform(distribution, param) aligned(state:64) aligned(mu, param, flip, out:16)
229 const dt_aligned_pixel_t mu,
const dt_aligned_pixel_t param,
230 const int flip[4], uint32_t state[4], dt_aligned_pixel_t
out)
const float c
Definition colorspaces_inline_conversions.h:1365
const float r
Definition colorspaces_inline_conversions.h:1324
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
#define for_each_channel(_var,...)
Definition darktable.h:582
dt_noise_distribution_t
Definition data/kernels/noise_generator.h:25
static const float x
Definition iop_profile.h:239
const int t
Definition iop_profile.h:227
static void flip(float *x, float *y)
Definition lightroom.c:1015
#define M_PI
Definition math.h:45
dt_noise_distribution_t
Definition src/develop/noise_generator.h:25
@ DT_NOISE_GAUSSIAN
Definition src/develop/noise_generator.h:27
@ DT_NOISE_POISSONIAN
Definition src/develop/noise_generator.h:28
@ DT_NOISE_UNIFORM
Definition src/develop/noise_generator.h:26
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:156
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:121
static float poisson_noise(const float mu, const float sigma, const int flip, uint32_t state[4])
Definition src/develop/noise_generator.h:106
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:228
static float uniform_noise(const float mu, const float sigma, uint32_t state[4])
Definition src/develop/noise_generator.h:79
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:191
static float gaussian_noise(const float mu, const float sigma, const int flip, uint32_t state[4])
Definition src/develop/noise_generator.h:88
static uint32_t rol32(const uint32_t x, const int k)
Definition src/develop/noise_generator.h:48
static float xoshiro128plus(uint32_t state[4])
Definition src/develop/noise_generator.h:57
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:143
static uint32_t splitmix32(const uint64_t seed)
Definition src/develop/noise_generator.h:35
unsigned __int64 uint64_t
Definition strptime.c:74