Ifft-base.java
package bladejapan.com;
public abstract class ifftBase {
abstract public double[][] ifft_cal(final double a_basic_frq, final double[][] a_x);
abstract public double[][] get_result();
abstract public double get_basic_frq();
abstract public double get_sampling();
}
ifft.java
package bladejapan.com;
public class ifft extends ifftBase {
private int m_dnum;
private int[] m_br;
private int m_step;
private double m_sampling;
private double m_basic_frq;
private double[][] m_datum;
public ifft(){
}
public double[][] get_result(){
return m_datum;
}
public double get_basic_frq(){
return m_basic_frq;
}
public double get_sampling(){
return m_sampling;
}
private void bitTraversal(){
int loop;
m_step = (int) (Math.log(m_dnum) / Math.log(2.0));
loop = 1;
for (int i = 0; i <= m_step - 1; i++){
for(int j = 0; j <= loop - 1; j++){
m_br[loop + j] = m_br[j] + m_dnum / (2 * loop);
}
loop *= 2;
}
}
public double[][] ifft_cal(final double a_basic_frq, final double[][] a_x){
m_dnum = a_x.length;
m_datum = new double[m_dnum][2];
m_br = new int [m_dnum];
m_basic_frq = a_basic_frq;
m_sampling = 1 / (m_dnum * m_basic_frq);
bitTraversal();
for(int i = 0; i < m_dnum; i++){
m_datum[m_br[i]][0] = a_x[i][0];
m_datum[m_br[i]][1] = a_x[i][1];
}
cal_ifft();
return m_datum;
}
public void cal_ifft() {
double omega;
double []cos = new double[m_dnum];
double []sin = new double[m_dnum];
omega = 2.0 * Math.PI / m_dnum;
long start = System.currentTimeMillis();
for(int i = 0; i < m_dnum; i++){
cos[i] = Math.cos(omega * i);
sin[i] = -Math.sin(omega * i);
}
long end = System.currentTimeMillis();
System.out.println("need time = " + (end - start) + "msec");
int loop = 1;
for (int i = 0; i < m_step; i++){
int loop2 = m_dnum / (2 * loop);
for (int j = 0; j <= loop2 - 1; j++){
for(int k = 0; k <= loop - 1 ; k++){
int l = 2 * loop * j + k;
int m = loop * (2 * j + 1) + k;
int p = loop2 * k;
int q = m_dnum / 2 + loop2 * k;
double cspr = m_datum[m][0] * cos[p] + m_datum[m][1] * sin[p];
double cspi = m_datum[m][1] * cos[p] - m_datum[m][0] * sin[p];
double csqr = m_datum[m][0] * cos[q] + m_datum[m][1] * sin[q];
double csqi = m_datum[m][1] * cos[q] - m_datum[m][0] * sin[q];
m_datum[m][0] = m_datum[l][0] + csqr;
m_datum[m][1] = m_datum[l][1] + csqi;
m_datum[l][0] += cspr;
m_datum[l][1] += cspi;
}
}
loop *= 2;
}
for(int i = 0; i < m_dnum; i++){
m_datum[i][0] /= m_dnum;
m_datum[i][1] /= m_dnum;
}
}
}
ifft-test.java
package bladejapan.com;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.lang.*;
public class ifftTest{
static public void main(String args[]) throws IOException {
double [][]datum = null;
double [][]ans;
try{
FileReader fl_rdr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fl_rdr);
String line = null;
int i = 0;
int num = 0;
boolean flg = false;
String regex = "^# rows: (.+)";
Pattern p = Pattern.compile(regex);
while (flg != true){
line = br.readLine();
Matcher m = p.matcher(line);
if (m.find()){
num = Integer.valueOf(m.group(1)).intValue();
// num = 8;
datum = new double[num][2];
flg = true;
}
}
flg = false;
regex = "((.+?),(.+?))";
Pattern p2 = Pattern.compile(regex);
while (flg != true){
line = br.readLine();
Matcher m2 = p2.matcher(line);
if (m2.find()){
flg = true;
}
}
do {
String[] arry;
arry = new String[2];
regex = "\\((.+?),(.+?)\\)";
Pattern p3 = Pattern.compile(regex);
Matcher m3 = p3.matcher(line);
if (m3.find()){
datum[i][0] = Double.valueOf(m3.group(1)).doubleValue();
arry = m3.group(2).split("i");
datum[i][1] = Double.valueOf(arry[0]).doubleValue();
}
i = i + 1;
} while(i <= num - 1 && (line = br.readLine()) != null);
/* datum[0][0] = 8.98235;
datum[0][1] = 0;
datum[1][0] = 1.56829;
datum[1][1] =0;
datum[2][0] = 6.04447;
datum[2][1] =0;
datum[3][0] = 2.10219;
datum[3][1] =0;
datum[4][0] = 7.17132;
datum[4][1] =0;
datum[5][0] = 4.51922;
datum[5][1] =0;
datum[6][0] = 3.34982;
datum[6][1] =0;
datum[7][0] = 4.32947;
datum[7][1] =0;
*/
}catch(FileNotFoundException e){
System.out.println(e);
}
long start = System.currentTimeMillis();
ifft ifft = new ifft();
ans = ifft.ifft_cal(250, datum);
long stop = System.currentTimeMillis();
System.out.println("need time " + (stop - start) + "msec");
System.out.println("t [sec],fr,fi");
File file = new File("ifft_ans");
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
for(int i = 0; i < ans.length; i++){
pw.println(ifft.get_basic_frq() * i + ", " + ans[i][0] +"," + ans[i][1] );
}
pw.flush();
pw.close();
}
}