tomwalters@0
|
1
|
tomwalters@0
|
2 function generate_kurtosis_noise(sig,kurtois
|
tomwalters@0
|
3
|
tomwalters@0
|
4 v=get(glob.f);
|
tomwalters@0
|
5 % variance_wanted=get(params,'Variance');
|
tomwalters@0
|
6 % skwednes=get(params,'Skewedness');
|
tomwalters@0
|
7
|
tomwalters@0
|
8
|
tomwalters@0
|
9
|
tomwalters@0
|
10
|
tomwalters@0
|
11 % change the kurtosis input to something meaningful
|
tomwalters@0
|
12 % these values are measured for different inputs of x
|
tomwalters@0
|
13 % if raw value for "Kurtosis" is inputted as:
|
tomwalters@0
|
14 input_kurt=[1 0.95 0.9 0.85 .8 .7 .6 .5 .4 .3 .25 .2 .15 .125 0.1 ];
|
tomwalters@0
|
15 % then the Kurtosis will be:
|
tomwalters@0
|
16 output_kurt=[-.05 0.04 0.13 0.26 .4 .7 1.12 1.72 2.58 4 5.11 6.87 9.6 11.8 15];
|
tomwalters@0
|
17
|
tomwalters@0
|
18 % to input the real Kurtosis, we need to turn these values around:
|
tomwalters@0
|
19 % and find the "input" value for a given Kurtosis:
|
tomwalters@0
|
20 kurtosis=interp1(output_kurt,input_kurt,kurtosis_wanted);
|
tomwalters@0
|
21
|
tomwalters@0
|
22 % % and the same for the variance. changing the variance does not change the
|
tomwalters@0
|
23 % % kurtosis
|
tomwalters@0
|
24 % input_var=0:15;
|
tomwalters@0
|
25 % output_var=[0.97 .68 .53 .43 .35 .3 .27 .24 .22 .2 .18 .17 .15 .14 .13 .12];
|
tomwalters@0
|
26 % variance=interp1(output_var,input_var,variance_wanted);
|
tomwalters@0
|
27
|
tomwalters@0
|
28 variance=1;
|
tomwalters@0
|
29
|
tomwalters@0
|
30 grafix=0;
|
tomwalters@0
|
31
|
tomwalters@0
|
32 if grafix
|
tomwalters@0
|
33 figure(3)
|
tomwalters@0
|
34 clf
|
tomwalters@0
|
35 hold on
|
tomwalters@0
|
36 end
|
tomwalters@0
|
37
|
tomwalters@0
|
38 nr_points=2000;
|
tomwalters@0
|
39
|
tomwalters@0
|
40 stepx=10/nr_points;
|
tomwalters@0
|
41 % generate the pdf
|
tomwalters@0
|
42 x=-5:stepx:5;
|
tomwalters@0
|
43
|
tomwalters@0
|
44 p_pdf=pdf('Normal',x,0,1);
|
tomwalters@0
|
45 p_pdf=p_pdf/max(p_pdf);
|
tomwalters@0
|
46
|
tomwalters@0
|
47 % p_cdf=cumsum(p_pdf);
|
tomwalters@0
|
48 % p_cdf=p_cdf/max(p_cdf);
|
tomwalters@0
|
49 % if grafix
|
tomwalters@0
|
50 % plot(x,p_pdf,'b.');hold on
|
tomwalters@0
|
51 % end
|
tomwalters@0
|
52
|
tomwalters@0
|
53 % scale along x to change the variance:
|
tomwalters@0
|
54 y=p_pdf;
|
tomwalters@0
|
55
|
tomwalters@0
|
56
|
tomwalters@0
|
57 new_x=x*variance;
|
tomwalters@0
|
58 ny=interp1(new_x,y,x);
|
tomwalters@0
|
59 ny(isnan(ny))=0;
|
tomwalters@0
|
60
|
tomwalters@0
|
61 glob.pdf_x=x; % save for plotting
|
tomwalters@0
|
62 glob.pdf_y=ny;
|
tomwalters@0
|
63
|
tomwalters@0
|
64 % % and the change in y to modify the Kurtosis
|
tomwalters@0
|
65 %
|
tomwalters@0
|
66 % generate random numbers by reversing the cdf
|
tomwalters@0
|
67 new_cdf=cumsum(ny); %calculate the pdf:
|
tomwalters@0
|
68 new_cdf=new_cdf/max(new_cdf); % and normalise
|
tomwalters@0
|
69
|
tomwalters@0
|
70 for i=1:nr_points/2-1
|
tomwalters@0
|
71 % dx=abs(x(nr_points/2-i));
|
tomwalters@0
|
72 dy=abs(0.5-new_cdf(i));
|
tomwalters@0
|
73 ndy=power((2*dy),kurtosis);
|
tomwalters@0
|
74 new_cdf(i)=0.5-ndy/2;
|
tomwalters@0
|
75 new_cdf(nr_points-i)=0.5+ndy/2;
|
tomwalters@0
|
76 end
|
tomwalters@0
|
77
|
tomwalters@0
|
78
|
tomwalters@0
|
79 if grafix
|
tomwalters@0
|
80
|
tomwalters@0
|
81 old_cdf=cumsum(y);
|
tomwalters@0
|
82 old_cdf=old_cdf/max(old_cdf); % and normalise
|
tomwalters@0
|
83
|
tomwalters@0
|
84 plot(x,old_cdf,'-b.');
|
tomwalters@0
|
85 plot(x,new_cdf,'-r.'); hold on
|
tomwalters@0
|
86 legend({'cumulative normal distribution';'modfied cdf'},2);
|
tomwalters@0
|
87 end
|
tomwalters@0
|
88
|
tomwalters@0
|
89
|
tomwalters@0
|
90 serachy=1/nr_points:1/nr_points:1;
|
tomwalters@0
|
91 rev_cdf=zeros(1,nr_points-1);
|
tomwalters@0
|
92
|
tomwalters@0
|
93
|
tomwalters@0
|
94
|
tomwalters@0
|
95 for i=1:nr_points-1
|
tomwalters@0
|
96 rev_cdf(i)=find(new_cdf>serachy(i),1,'first');
|
tomwalters@0
|
97 end
|
tomwalters@0
|
98
|
tomwalters@0
|
99 % clf
|
tomwalters@0
|
100 % plot(rev_cdf,'r.');
|
tomwalters@0
|
101
|
tomwalters@0
|
102 r=round(rand(length(v),1)*(nr_points-1)+0.5);
|
tomwalters@0
|
103
|
tomwalters@0
|
104 rev_p=rev_cdf(r);
|
tomwalters@0
|
105
|
tomwalters@0
|
106 % clf
|
tomwalters@0
|
107 % hist(rev_p,100)
|
tomwalters@0
|
108
|
tomwalters@0
|
109
|
tomwalters@0
|
110 % and normalise to the right output range
|
tomwalters@0
|
111 rev_p=(rev_p-nr_points/2)/nr_points*10;
|
tomwalters@0
|
112
|
tomwalters@0
|
113 % return
|
tomwalters@0
|
114 % v=random('norm',0,sqrt(variance),length(v),1);
|
tomwalters@0
|
115
|
tomwalters@0
|
116
|
tomwalters@0
|
117 glob.f=set(glob.f,rev_p');
|
tomwalters@0
|
118 glob.f=scaletorms(glob.f,sqrt(get(params,('rms-value'))));
|
tomwalters@0
|
119
|
tomwalters@0
|
120 assignin('base','f',glob.f);
|
tomwalters@0
|
121
|
tomwalters@0
|
122 % f=scaletomaxvalue(f,1);
|