Mercurial > libavutil.hg
annotate lfg.c @ 862:434a611c1e54 libavutil
Add lots of missing includes
author | mru |
---|---|
date | Mon, 08 Mar 2010 18:43:52 +0000 |
parents | 41da9d9d39b7 |
children | 4d9ad0ed07d0 |
rev | line source |
---|---|
533 | 1 /* |
2 * Lagged Fibonacci PRNG | |
3 * Copyright (c) 2008 Michael Niedermayer | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include <inttypes.h> | |
23 #include "lfg.h" | |
24 #include "md5.h" | |
25 #include "intreadwrite.h" | |
26 | |
27 void av_cold av_lfg_init(AVLFG *c, unsigned int seed){ | |
28 uint8_t tmp[16]={0}; | |
29 int i; | |
30 | |
31 for(i=8; i<64; i+=4){ | |
32 AV_WL32(tmp, seed); tmp[4]=i; | |
33 av_md5_sum(tmp, tmp, 16); | |
34 c->state[i ]= AV_RL32(tmp); | |
35 c->state[i+1]= AV_RL32(tmp+4); | |
36 c->state[i+2]= AV_RL32(tmp+8); | |
37 c->state[i+3]= AV_RL32(tmp+12); | |
38 } | |
39 c->index=0; | |
40 } | |
41 | |
798
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
42 void av_bmg_get(AVLFG *lfg, double out[2]) |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
43 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
44 double x1, x2, w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
45 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
46 do { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
47 x1 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
48 x2 = 2.0/UINT_MAX*av_lfg_get(lfg) - 1.0; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
49 w = x1*x1 + x2*x2; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
50 } while (w >= 1.0); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
51 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
52 w = sqrt((-2.0 * log(w)) / w); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
53 out[0] = x1 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
54 out[1] = x2 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
55 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
56 |
533 | 57 #ifdef TEST |
58 #include "log.h" | |
59 #include "common.h" | |
60 | |
61 int main(void) | |
62 { | |
63 int x=0; | |
64 int i, j; | |
65 AVLFG state; | |
66 | |
67 av_lfg_init(&state, 0xdeadbeef); | |
68 for (j = 0; j < 10000; j++) { | |
69 START_TIMER | |
70 for (i = 0; i < 624; i++) { | |
71 // av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); | |
72 x+=av_lfg_get(&state); | |
73 } | |
702
ef2c3d23d344
Fix reference to av_random where av_lfg_get was meant.
diego
parents:
533
diff
changeset
|
74 STOP_TIMER("624 calls of av_lfg_get"); |
533 | 75 } |
76 av_log(NULL, AV_LOG_ERROR, "final value:%X\n", x); | |
798
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
77 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
78 /* BMG usage example */ |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
79 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
80 double mean = 1000; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
81 double stddev = 53; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
82 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
83 av_lfg_init(&state, 42); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
84 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
85 for (i = 0; i < 1000; i += 2) { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
86 double bmg_out[2]; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
87 av_bmg_get(&state, bmg_out); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
88 av_log(NULL, AV_LOG_INFO, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
89 "%f\n%f\n", |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
90 bmg_out[0] * stddev + mean, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
91 bmg_out[1] * stddev + mean); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
92 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
93 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
94 |
533 | 95 return 0; |
96 } | |
97 #endif |