Mercurial > libavutil.hg
annotate lfg.c @ 989:732bb5b10aec libavutil
pixdesc: add missing includes
author | mru |
---|---|
date | Sat, 10 Jul 2010 00:40:53 +0000 |
parents | 4d9ad0ed07d0 |
children | 3d83c38f150e |
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" | |
873
4d9ad0ed07d0
Replace many includes of libavutil/common.h with what is actually needed
mru
parents:
798
diff
changeset
|
26 #include "attributes.h" |
533 | 27 |
28 void av_cold av_lfg_init(AVLFG *c, unsigned int seed){ | |
29 uint8_t tmp[16]={0}; | |
30 int i; | |
31 | |
32 for(i=8; i<64; i+=4){ | |
33 AV_WL32(tmp, seed); tmp[4]=i; | |
34 av_md5_sum(tmp, tmp, 16); | |
35 c->state[i ]= AV_RL32(tmp); | |
36 c->state[i+1]= AV_RL32(tmp+4); | |
37 c->state[i+2]= AV_RL32(tmp+8); | |
38 c->state[i+3]= AV_RL32(tmp+12); | |
39 } | |
40 c->index=0; | |
41 } | |
42 | |
798
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
43 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
|
44 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
45 double x1, x2, w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
46 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
47 do { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
48 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
|
49 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
|
50 w = x1*x1 + x2*x2; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
51 } while (w >= 1.0); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
52 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
53 w = sqrt((-2.0 * log(w)) / w); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
54 out[0] = x1 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
55 out[1] = x2 * w; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
56 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
57 |
533 | 58 #ifdef TEST |
59 #include "log.h" | |
873
4d9ad0ed07d0
Replace many includes of libavutil/common.h with what is actually needed
mru
parents:
798
diff
changeset
|
60 #include "timer.h" |
533 | 61 |
62 int main(void) | |
63 { | |
64 int x=0; | |
65 int i, j; | |
66 AVLFG state; | |
67 | |
68 av_lfg_init(&state, 0xdeadbeef); | |
69 for (j = 0; j < 10000; j++) { | |
70 START_TIMER | |
71 for (i = 0; i < 624; i++) { | |
72 // av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); | |
73 x+=av_lfg_get(&state); | |
74 } | |
702
ef2c3d23d344
Fix reference to av_random where av_lfg_get was meant.
diego
parents:
533
diff
changeset
|
75 STOP_TIMER("624 calls of av_lfg_get"); |
533 | 76 } |
77 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
|
78 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
79 /* BMG usage example */ |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
80 { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
81 double mean = 1000; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
82 double stddev = 53; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
83 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
84 av_lfg_init(&state, 42); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
85 |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
86 for (i = 0; i < 1000; i += 2) { |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
87 double bmg_out[2]; |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
88 av_bmg_get(&state, bmg_out); |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
89 av_log(NULL, AV_LOG_INFO, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
90 "%f\n%f\n", |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
91 bmg_out[0] * stddev + mean, |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
92 bmg_out[1] * stddev + mean); |
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 } |
41da9d9d39b7
Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents:
702
diff
changeset
|
95 |
533 | 96 return 0; |
97 } | |
98 #endif |