annotate lfg.c @ 822:a1680eca3e52 libavutil

DECLARE_ALIGNED macro for TMS470 compiler This compiler supports gcc-style alignment attributes for struct, but not for global variables. For the latter, alignment can be specified with a pragma, which does not work for struct members or local variables. By using both pragma and attribute, one or the other will always take effect. Unfortunately, no means exists for aligning stack variables.
author mru
date Fri, 22 Jan 2010 03:25:25 +0000
parents 41da9d9d39b7
children 4d9ad0ed07d0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
1 /*
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
2 * Lagged Fibonacci PRNG
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
3 * Copyright (c) 2008 Michael Niedermayer
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
4 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
6 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
11 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
16 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
20 */
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
21
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
22 #include <inttypes.h>
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
23 #include "lfg.h"
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
24 #include "md5.h"
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
25 #include "intreadwrite.h"
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
26
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
27 void av_cold av_lfg_init(AVLFG *c, unsigned int seed){
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
28 uint8_t tmp[16]={0};
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
29 int i;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
30
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
31 for(i=8; i<64; i+=4){
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
32 AV_WL32(tmp, seed); tmp[4]=i;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
33 av_md5_sum(tmp, tmp, 16);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
34 c->state[i ]= AV_RL32(tmp);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
35 c->state[i+1]= AV_RL32(tmp+4);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
36 c->state[i+2]= AV_RL32(tmp+8);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
37 c->state[i+3]= AV_RL32(tmp+12);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
38 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
39 c->index=0;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
40 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
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
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
57 #ifdef TEST
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
58 #include "log.h"
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
59 #include "common.h"
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
60
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
61 int main(void)
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
62 {
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
63 int x=0;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
64 int i, j;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
65 AVLFG state;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
66
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
67 av_lfg_init(&state, 0xdeadbeef);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
68 for (j = 0; j < 10000; j++) {
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
69 START_TIMER
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
70 for (i = 0; i < 624; i++) {
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
71 // av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state));
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
72 x+=av_lfg_get(&state);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
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
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
75 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
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
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
95 return 0;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
96 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
97 #endif