comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/transform/FastCosineTransformer.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> package org.apache.commons.math.transform;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import org.apache.commons.math.FunctionEvaluationException;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.analysis.UnivariateRealFunction;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.complex.Complex;<a name="line.22"></a>
26 <FONT color="green">023</FONT> <a name="line.23"></a>
27 <FONT color="green">024</FONT> /**<a name="line.24"></a>
28 <FONT color="green">025</FONT> * Implements the &lt;a href="http://documents.wolfram.com/v5/Add-onsLinks/<a name="line.25"></a>
29 <FONT color="green">026</FONT> * StandardPackages/LinearAlgebra/FourierTrig.html"&gt;Fast Cosine Transform&lt;/a&gt;<a name="line.26"></a>
30 <FONT color="green">027</FONT> * for transformation of one-dimensional data sets. For reference, see<a name="line.27"></a>
31 <FONT color="green">028</FONT> * &lt;b&gt;Fast Fourier Transforms&lt;/b&gt;, ISBN 0849371635, chapter 3.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * FCT is its own inverse, up to a multiplier depending on conventions.<a name="line.30"></a>
34 <FONT color="green">031</FONT> * The equations are listed in the comments of the corresponding methods.&lt;/p&gt;<a name="line.31"></a>
35 <FONT color="green">032</FONT> * &lt;p&gt;<a name="line.32"></a>
36 <FONT color="green">033</FONT> * Different from FFT and FST, FCT requires the length of data set to be<a name="line.33"></a>
37 <FONT color="green">034</FONT> * power of 2 plus one. Users should especially pay attention to the<a name="line.34"></a>
38 <FONT color="green">035</FONT> * function transformation on how this affects the sampling.&lt;/p&gt;<a name="line.35"></a>
39 <FONT color="green">036</FONT> * &lt;p&gt;As of version 2.0 this no longer implements Serializable&lt;/p&gt;<a name="line.36"></a>
40 <FONT color="green">037</FONT> *<a name="line.37"></a>
41 <FONT color="green">038</FONT> * @version $Revision:670469 $ $Date:2008-06-23 10:01:38 +0200 (lun., 23 juin 2008) $<a name="line.38"></a>
42 <FONT color="green">039</FONT> * @since 1.2<a name="line.39"></a>
43 <FONT color="green">040</FONT> */<a name="line.40"></a>
44 <FONT color="green">041</FONT> public class FastCosineTransformer implements RealTransformer {<a name="line.41"></a>
45 <FONT color="green">042</FONT> <a name="line.42"></a>
46 <FONT color="green">043</FONT> /**<a name="line.43"></a>
47 <FONT color="green">044</FONT> * Construct a default transformer.<a name="line.44"></a>
48 <FONT color="green">045</FONT> */<a name="line.45"></a>
49 <FONT color="green">046</FONT> public FastCosineTransformer() {<a name="line.46"></a>
50 <FONT color="green">047</FONT> super();<a name="line.47"></a>
51 <FONT color="green">048</FONT> }<a name="line.48"></a>
52 <FONT color="green">049</FONT> <a name="line.49"></a>
53 <FONT color="green">050</FONT> /**<a name="line.50"></a>
54 <FONT color="green">051</FONT> * Transform the given real data set.<a name="line.51"></a>
55 <FONT color="green">052</FONT> * &lt;p&gt;<a name="line.52"></a>
56 <FONT color="green">053</FONT> * The formula is F&lt;sub&gt;n&lt;/sub&gt; = (1/2) [f&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;n&lt;/sup&gt; f&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.53"></a>
57 <FONT color="green">054</FONT> * &amp;sum;&lt;sub&gt;k=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; f&lt;sub&gt;k&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.54"></a>
58 <FONT color="green">055</FONT> * &lt;/p&gt;<a name="line.55"></a>
59 <FONT color="green">056</FONT> *<a name="line.56"></a>
60 <FONT color="green">057</FONT> * @param f the real data array to be transformed<a name="line.57"></a>
61 <FONT color="green">058</FONT> * @return the real transformed array<a name="line.58"></a>
62 <FONT color="green">059</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.59"></a>
63 <FONT color="green">060</FONT> */<a name="line.60"></a>
64 <FONT color="green">061</FONT> public double[] transform(double f[]) throws IllegalArgumentException {<a name="line.61"></a>
65 <FONT color="green">062</FONT> return fct(f);<a name="line.62"></a>
66 <FONT color="green">063</FONT> }<a name="line.63"></a>
67 <FONT color="green">064</FONT> <a name="line.64"></a>
68 <FONT color="green">065</FONT> /**<a name="line.65"></a>
69 <FONT color="green">066</FONT> * Transform the given real function, sampled on the given interval.<a name="line.66"></a>
70 <FONT color="green">067</FONT> * &lt;p&gt;<a name="line.67"></a>
71 <FONT color="green">068</FONT> * The formula is F&lt;sub&gt;n&lt;/sub&gt; = (1/2) [f&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;n&lt;/sup&gt; f&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.68"></a>
72 <FONT color="green">069</FONT> * &amp;sum;&lt;sub&gt;k=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; f&lt;sub&gt;k&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.69"></a>
73 <FONT color="green">070</FONT> * &lt;/p&gt;<a name="line.70"></a>
74 <FONT color="green">071</FONT> *<a name="line.71"></a>
75 <FONT color="green">072</FONT> * @param f the function to be sampled and transformed<a name="line.72"></a>
76 <FONT color="green">073</FONT> * @param min the lower bound for the interval<a name="line.73"></a>
77 <FONT color="green">074</FONT> * @param max the upper bound for the interval<a name="line.74"></a>
78 <FONT color="green">075</FONT> * @param n the number of sample points<a name="line.75"></a>
79 <FONT color="green">076</FONT> * @return the real transformed array<a name="line.76"></a>
80 <FONT color="green">077</FONT> * @throws FunctionEvaluationException if function cannot be evaluated<a name="line.77"></a>
81 <FONT color="green">078</FONT> * at some point<a name="line.78"></a>
82 <FONT color="green">079</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.79"></a>
83 <FONT color="green">080</FONT> */<a name="line.80"></a>
84 <FONT color="green">081</FONT> public double[] transform(UnivariateRealFunction f,<a name="line.81"></a>
85 <FONT color="green">082</FONT> double min, double max, int n)<a name="line.82"></a>
86 <FONT color="green">083</FONT> throws FunctionEvaluationException, IllegalArgumentException {<a name="line.83"></a>
87 <FONT color="green">084</FONT> double data[] = FastFourierTransformer.sample(f, min, max, n);<a name="line.84"></a>
88 <FONT color="green">085</FONT> return fct(data);<a name="line.85"></a>
89 <FONT color="green">086</FONT> }<a name="line.86"></a>
90 <FONT color="green">087</FONT> <a name="line.87"></a>
91 <FONT color="green">088</FONT> /**<a name="line.88"></a>
92 <FONT color="green">089</FONT> * Transform the given real data set.<a name="line.89"></a>
93 <FONT color="green">090</FONT> * &lt;p&gt;<a name="line.90"></a>
94 <FONT color="green">091</FONT> * The formula is F&lt;sub&gt;n&lt;/sub&gt; = &amp;radic;(1/2N) [f&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;n&lt;/sup&gt; f&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.91"></a>
95 <FONT color="green">092</FONT> * &amp;radic;(2/N) &amp;sum;&lt;sub&gt;k=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; f&lt;sub&gt;k&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.92"></a>
96 <FONT color="green">093</FONT> * &lt;/p&gt;<a name="line.93"></a>
97 <FONT color="green">094</FONT> *<a name="line.94"></a>
98 <FONT color="green">095</FONT> * @param f the real data array to be transformed<a name="line.95"></a>
99 <FONT color="green">096</FONT> * @return the real transformed array<a name="line.96"></a>
100 <FONT color="green">097</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.97"></a>
101 <FONT color="green">098</FONT> */<a name="line.98"></a>
102 <FONT color="green">099</FONT> public double[] transform2(double f[]) throws IllegalArgumentException {<a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> double scaling_coefficient = Math.sqrt(2.0 / (f.length-1));<a name="line.101"></a>
105 <FONT color="green">102</FONT> return FastFourierTransformer.scaleArray(fct(f), scaling_coefficient);<a name="line.102"></a>
106 <FONT color="green">103</FONT> }<a name="line.103"></a>
107 <FONT color="green">104</FONT> <a name="line.104"></a>
108 <FONT color="green">105</FONT> /**<a name="line.105"></a>
109 <FONT color="green">106</FONT> * Transform the given real function, sampled on the given interval.<a name="line.106"></a>
110 <FONT color="green">107</FONT> * &lt;p&gt;<a name="line.107"></a>
111 <FONT color="green">108</FONT> * The formula is F&lt;sub&gt;n&lt;/sub&gt; = &amp;radic;(1/2N) [f&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;n&lt;/sup&gt; f&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.108"></a>
112 <FONT color="green">109</FONT> * &amp;radic;(2/N) &amp;sum;&lt;sub&gt;k=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; f&lt;sub&gt;k&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.109"></a>
113 <FONT color="green">110</FONT> *<a name="line.110"></a>
114 <FONT color="green">111</FONT> * &lt;/p&gt;<a name="line.111"></a>
115 <FONT color="green">112</FONT> *<a name="line.112"></a>
116 <FONT color="green">113</FONT> * @param f the function to be sampled and transformed<a name="line.113"></a>
117 <FONT color="green">114</FONT> * @param min the lower bound for the interval<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @param max the upper bound for the interval<a name="line.115"></a>
119 <FONT color="green">116</FONT> * @param n the number of sample points<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @return the real transformed array<a name="line.117"></a>
121 <FONT color="green">118</FONT> * @throws FunctionEvaluationException if function cannot be evaluated<a name="line.118"></a>
122 <FONT color="green">119</FONT> * at some point<a name="line.119"></a>
123 <FONT color="green">120</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.120"></a>
124 <FONT color="green">121</FONT> */<a name="line.121"></a>
125 <FONT color="green">122</FONT> public double[] transform2(UnivariateRealFunction f,<a name="line.122"></a>
126 <FONT color="green">123</FONT> double min, double max, int n)<a name="line.123"></a>
127 <FONT color="green">124</FONT> throws FunctionEvaluationException, IllegalArgumentException {<a name="line.124"></a>
128 <FONT color="green">125</FONT> <a name="line.125"></a>
129 <FONT color="green">126</FONT> double data[] = FastFourierTransformer.sample(f, min, max, n);<a name="line.126"></a>
130 <FONT color="green">127</FONT> double scaling_coefficient = Math.sqrt(2.0 / (n-1));<a name="line.127"></a>
131 <FONT color="green">128</FONT> return FastFourierTransformer.scaleArray(fct(data), scaling_coefficient);<a name="line.128"></a>
132 <FONT color="green">129</FONT> }<a name="line.129"></a>
133 <FONT color="green">130</FONT> <a name="line.130"></a>
134 <FONT color="green">131</FONT> /**<a name="line.131"></a>
135 <FONT color="green">132</FONT> * Inversely transform the given real data set.<a name="line.132"></a>
136 <FONT color="green">133</FONT> * &lt;p&gt;<a name="line.133"></a>
137 <FONT color="green">134</FONT> * The formula is f&lt;sub&gt;k&lt;/sub&gt; = (1/N) [F&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;k&lt;/sup&gt; F&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.134"></a>
138 <FONT color="green">135</FONT> * (2/N) &amp;sum;&lt;sub&gt;n=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; F&lt;sub&gt;n&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.135"></a>
139 <FONT color="green">136</FONT> * &lt;/p&gt;<a name="line.136"></a>
140 <FONT color="green">137</FONT> *<a name="line.137"></a>
141 <FONT color="green">138</FONT> * @param f the real data array to be inversely transformed<a name="line.138"></a>
142 <FONT color="green">139</FONT> * @return the real inversely transformed array<a name="line.139"></a>
143 <FONT color="green">140</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.140"></a>
144 <FONT color="green">141</FONT> */<a name="line.141"></a>
145 <FONT color="green">142</FONT> public double[] inversetransform(double f[]) throws IllegalArgumentException {<a name="line.142"></a>
146 <FONT color="green">143</FONT> <a name="line.143"></a>
147 <FONT color="green">144</FONT> double scaling_coefficient = 2.0 / (f.length - 1);<a name="line.144"></a>
148 <FONT color="green">145</FONT> return FastFourierTransformer.scaleArray(fct(f), scaling_coefficient);<a name="line.145"></a>
149 <FONT color="green">146</FONT> }<a name="line.146"></a>
150 <FONT color="green">147</FONT> <a name="line.147"></a>
151 <FONT color="green">148</FONT> /**<a name="line.148"></a>
152 <FONT color="green">149</FONT> * Inversely transform the given real function, sampled on the given interval.<a name="line.149"></a>
153 <FONT color="green">150</FONT> * &lt;p&gt;<a name="line.150"></a>
154 <FONT color="green">151</FONT> * The formula is f&lt;sub&gt;k&lt;/sub&gt; = (1/N) [F&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;k&lt;/sup&gt; F&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.151"></a>
155 <FONT color="green">152</FONT> * (2/N) &amp;sum;&lt;sub&gt;n=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; F&lt;sub&gt;n&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.152"></a>
156 <FONT color="green">153</FONT> * &lt;/p&gt;<a name="line.153"></a>
157 <FONT color="green">154</FONT> *<a name="line.154"></a>
158 <FONT color="green">155</FONT> * @param f the function to be sampled and inversely transformed<a name="line.155"></a>
159 <FONT color="green">156</FONT> * @param min the lower bound for the interval<a name="line.156"></a>
160 <FONT color="green">157</FONT> * @param max the upper bound for the interval<a name="line.157"></a>
161 <FONT color="green">158</FONT> * @param n the number of sample points<a name="line.158"></a>
162 <FONT color="green">159</FONT> * @return the real inversely transformed array<a name="line.159"></a>
163 <FONT color="green">160</FONT> * @throws FunctionEvaluationException if function cannot be evaluated<a name="line.160"></a>
164 <FONT color="green">161</FONT> * at some point<a name="line.161"></a>
165 <FONT color="green">162</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.162"></a>
166 <FONT color="green">163</FONT> */<a name="line.163"></a>
167 <FONT color="green">164</FONT> public double[] inversetransform(UnivariateRealFunction f,<a name="line.164"></a>
168 <FONT color="green">165</FONT> double min, double max, int n)<a name="line.165"></a>
169 <FONT color="green">166</FONT> throws FunctionEvaluationException, IllegalArgumentException {<a name="line.166"></a>
170 <FONT color="green">167</FONT> <a name="line.167"></a>
171 <FONT color="green">168</FONT> double data[] = FastFourierTransformer.sample(f, min, max, n);<a name="line.168"></a>
172 <FONT color="green">169</FONT> double scaling_coefficient = 2.0 / (n - 1);<a name="line.169"></a>
173 <FONT color="green">170</FONT> return FastFourierTransformer.scaleArray(fct(data), scaling_coefficient);<a name="line.170"></a>
174 <FONT color="green">171</FONT> }<a name="line.171"></a>
175 <FONT color="green">172</FONT> <a name="line.172"></a>
176 <FONT color="green">173</FONT> /**<a name="line.173"></a>
177 <FONT color="green">174</FONT> * Inversely transform the given real data set.<a name="line.174"></a>
178 <FONT color="green">175</FONT> * &lt;p&gt;<a name="line.175"></a>
179 <FONT color="green">176</FONT> * The formula is f&lt;sub&gt;k&lt;/sub&gt; = &amp;radic;(1/2N) [F&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;k&lt;/sup&gt; F&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.176"></a>
180 <FONT color="green">177</FONT> * &amp;radic;(2/N) &amp;sum;&lt;sub&gt;n=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; F&lt;sub&gt;n&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.177"></a>
181 <FONT color="green">178</FONT> * &lt;/p&gt;<a name="line.178"></a>
182 <FONT color="green">179</FONT> *<a name="line.179"></a>
183 <FONT color="green">180</FONT> * @param f the real data array to be inversely transformed<a name="line.180"></a>
184 <FONT color="green">181</FONT> * @return the real inversely transformed array<a name="line.181"></a>
185 <FONT color="green">182</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.182"></a>
186 <FONT color="green">183</FONT> */<a name="line.183"></a>
187 <FONT color="green">184</FONT> public double[] inversetransform2(double f[]) throws IllegalArgumentException {<a name="line.184"></a>
188 <FONT color="green">185</FONT> return transform2(f);<a name="line.185"></a>
189 <FONT color="green">186</FONT> }<a name="line.186"></a>
190 <FONT color="green">187</FONT> <a name="line.187"></a>
191 <FONT color="green">188</FONT> /**<a name="line.188"></a>
192 <FONT color="green">189</FONT> * Inversely transform the given real function, sampled on the given interval.<a name="line.189"></a>
193 <FONT color="green">190</FONT> * &lt;p&gt;<a name="line.190"></a>
194 <FONT color="green">191</FONT> * The formula is f&lt;sub&gt;k&lt;/sub&gt; = &amp;radic;(1/2N) [F&lt;sub&gt;0&lt;/sub&gt; + (-1)&lt;sup&gt;k&lt;/sup&gt; F&lt;sub&gt;N&lt;/sub&gt;] +<a name="line.191"></a>
195 <FONT color="green">192</FONT> * &amp;radic;(2/N) &amp;sum;&lt;sub&gt;n=1&lt;/sub&gt;&lt;sup&gt;N-1&lt;/sup&gt; F&lt;sub&gt;n&lt;/sub&gt; cos(&amp;pi; nk/N)<a name="line.192"></a>
196 <FONT color="green">193</FONT> * &lt;/p&gt;<a name="line.193"></a>
197 <FONT color="green">194</FONT> *<a name="line.194"></a>
198 <FONT color="green">195</FONT> * @param f the function to be sampled and inversely transformed<a name="line.195"></a>
199 <FONT color="green">196</FONT> * @param min the lower bound for the interval<a name="line.196"></a>
200 <FONT color="green">197</FONT> * @param max the upper bound for the interval<a name="line.197"></a>
201 <FONT color="green">198</FONT> * @param n the number of sample points<a name="line.198"></a>
202 <FONT color="green">199</FONT> * @return the real inversely transformed array<a name="line.199"></a>
203 <FONT color="green">200</FONT> * @throws FunctionEvaluationException if function cannot be evaluated<a name="line.200"></a>
204 <FONT color="green">201</FONT> * at some point<a name="line.201"></a>
205 <FONT color="green">202</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.202"></a>
206 <FONT color="green">203</FONT> */<a name="line.203"></a>
207 <FONT color="green">204</FONT> public double[] inversetransform2(UnivariateRealFunction f,<a name="line.204"></a>
208 <FONT color="green">205</FONT> double min, double max, int n)<a name="line.205"></a>
209 <FONT color="green">206</FONT> throws FunctionEvaluationException, IllegalArgumentException {<a name="line.206"></a>
210 <FONT color="green">207</FONT> <a name="line.207"></a>
211 <FONT color="green">208</FONT> return transform2(f, min, max, n);<a name="line.208"></a>
212 <FONT color="green">209</FONT> }<a name="line.209"></a>
213 <FONT color="green">210</FONT> <a name="line.210"></a>
214 <FONT color="green">211</FONT> /**<a name="line.211"></a>
215 <FONT color="green">212</FONT> * Perform the FCT algorithm (including inverse).<a name="line.212"></a>
216 <FONT color="green">213</FONT> *<a name="line.213"></a>
217 <FONT color="green">214</FONT> * @param f the real data array to be transformed<a name="line.214"></a>
218 <FONT color="green">215</FONT> * @return the real transformed array<a name="line.215"></a>
219 <FONT color="green">216</FONT> * @throws IllegalArgumentException if any parameters are invalid<a name="line.216"></a>
220 <FONT color="green">217</FONT> */<a name="line.217"></a>
221 <FONT color="green">218</FONT> protected double[] fct(double f[])<a name="line.218"></a>
222 <FONT color="green">219</FONT> throws IllegalArgumentException {<a name="line.219"></a>
223 <FONT color="green">220</FONT> <a name="line.220"></a>
224 <FONT color="green">221</FONT> final double transformed[] = new double[f.length];<a name="line.221"></a>
225 <FONT color="green">222</FONT> <a name="line.222"></a>
226 <FONT color="green">223</FONT> final int n = f.length - 1;<a name="line.223"></a>
227 <FONT color="green">224</FONT> if (!FastFourierTransformer.isPowerOf2(n)) {<a name="line.224"></a>
228 <FONT color="green">225</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.225"></a>
229 <FONT color="green">226</FONT> "{0} is not a power of 2 plus one",<a name="line.226"></a>
230 <FONT color="green">227</FONT> f.length);<a name="line.227"></a>
231 <FONT color="green">228</FONT> }<a name="line.228"></a>
232 <FONT color="green">229</FONT> if (n == 1) { // trivial case<a name="line.229"></a>
233 <FONT color="green">230</FONT> transformed[0] = 0.5 * (f[0] + f[1]);<a name="line.230"></a>
234 <FONT color="green">231</FONT> transformed[1] = 0.5 * (f[0] - f[1]);<a name="line.231"></a>
235 <FONT color="green">232</FONT> return transformed;<a name="line.232"></a>
236 <FONT color="green">233</FONT> }<a name="line.233"></a>
237 <FONT color="green">234</FONT> <a name="line.234"></a>
238 <FONT color="green">235</FONT> // construct a new array and perform FFT on it<a name="line.235"></a>
239 <FONT color="green">236</FONT> final double[] x = new double[n];<a name="line.236"></a>
240 <FONT color="green">237</FONT> x[0] = 0.5 * (f[0] + f[n]);<a name="line.237"></a>
241 <FONT color="green">238</FONT> x[n &gt;&gt; 1] = f[n &gt;&gt; 1];<a name="line.238"></a>
242 <FONT color="green">239</FONT> double t1 = 0.5 * (f[0] - f[n]); // temporary variable for transformed[1]<a name="line.239"></a>
243 <FONT color="green">240</FONT> for (int i = 1; i &lt; (n &gt;&gt; 1); i++) {<a name="line.240"></a>
244 <FONT color="green">241</FONT> final double a = 0.5 * (f[i] + f[n-i]);<a name="line.241"></a>
245 <FONT color="green">242</FONT> final double b = Math.sin(i * Math.PI / n) * (f[i] - f[n-i]);<a name="line.242"></a>
246 <FONT color="green">243</FONT> final double c = Math.cos(i * Math.PI / n) * (f[i] - f[n-i]);<a name="line.243"></a>
247 <FONT color="green">244</FONT> x[i] = a - b;<a name="line.244"></a>
248 <FONT color="green">245</FONT> x[n-i] = a + b;<a name="line.245"></a>
249 <FONT color="green">246</FONT> t1 += c;<a name="line.246"></a>
250 <FONT color="green">247</FONT> }<a name="line.247"></a>
251 <FONT color="green">248</FONT> FastFourierTransformer transformer = new FastFourierTransformer();<a name="line.248"></a>
252 <FONT color="green">249</FONT> Complex y[] = transformer.transform(x);<a name="line.249"></a>
253 <FONT color="green">250</FONT> <a name="line.250"></a>
254 <FONT color="green">251</FONT> // reconstruct the FCT result for the original array<a name="line.251"></a>
255 <FONT color="green">252</FONT> transformed[0] = y[0].getReal();<a name="line.252"></a>
256 <FONT color="green">253</FONT> transformed[1] = t1;<a name="line.253"></a>
257 <FONT color="green">254</FONT> for (int i = 1; i &lt; (n &gt;&gt; 1); i++) {<a name="line.254"></a>
258 <FONT color="green">255</FONT> transformed[2 * i] = y[i].getReal();<a name="line.255"></a>
259 <FONT color="green">256</FONT> transformed[2 * i + 1] = transformed[2 * i - 1] - y[i].getImaginary();<a name="line.256"></a>
260 <FONT color="green">257</FONT> }<a name="line.257"></a>
261 <FONT color="green">258</FONT> transformed[n] = y[n &gt;&gt; 1].getReal();<a name="line.258"></a>
262 <FONT color="green">259</FONT> <a name="line.259"></a>
263 <FONT color="green">260</FONT> return transformed;<a name="line.260"></a>
264 <FONT color="green">261</FONT> }<a name="line.261"></a>
265 <FONT color="green">262</FONT> }<a name="line.262"></a>
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326 </PRE>
327 </BODY>
328 </HTML>