00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <stdio.h>
00028 #include <math.h>
00029 #include "pink.h"
00030
00031
00032
00033 static unsigned long generate_random_number( void )
00034 {
00035 static unsigned long rand_seed = 22222;
00036 rand_seed = (rand_seed * 196314165) + 907633515;
00037 return rand_seed;
00038 }
00039
00040
00041 void initialize_pink_noise( pink_noise_t *pink, int num_rows )
00042 {
00043 int i;
00044 long pmax;
00045 pink->pink_index = 0;
00046 pink->pink_index_mask = (1<<num_rows) - 1;
00047
00048 pmax = (num_rows + 1) * (1<<(PINK_RANDOM_BITS-1));
00049 pink->pink_scalar = 1.0f / pmax;
00050
00051 for( i=0; i<num_rows; i++ ) pink->pink_rows[i] = 0;
00052 pink->pink_running_sum = 0;
00053 }
00054
00055
00056 float generate_pink_noise_sample( pink_noise_t *pink )
00057 {
00058 long new_random;
00059 long sum;
00060 float output;
00061
00062
00063 pink->pink_index = (pink->pink_index + 1) & pink->pink_index_mask;
00064
00065
00066 if( pink->pink_index != 0 )
00067 {
00068
00069
00070 int num_zeros = 0;
00071 int n = pink->pink_index;
00072 while( (n & 1) == 0 )
00073 {
00074 n = n >> 1;
00075 num_zeros++;
00076 }
00077
00078
00079
00080
00081
00082 pink->pink_running_sum -= pink->pink_rows[num_zeros];
00083 new_random = ((long)generate_random_number()) >> PINK_RANDOM_SHIFT;
00084 pink->pink_running_sum += new_random;
00085 pink->pink_rows[num_zeros] = new_random;
00086 }
00087
00088
00089 new_random = ((long)generate_random_number()) >> PINK_RANDOM_SHIFT;
00090 sum = pink->pink_running_sum + new_random;
00091
00092
00093 output = pink->pink_scalar * sum;
00094
00095 return output;
00096 }