PHP Code:
struct Complex {
re :f64,im :f64
}
fn mypi() -> f64 {
let d :f64=(0 as f64).acos();
return d+d;
}
fn myfft(s :&[Complex]) -> [Complex;8] {
let mut r :[Complex; 8] = [
Complex { re :0.0,im :0.0 },Complex { re :0.0,im :0.0 },
Complex { re :0.0,im :0.0 },Complex { re :0.0,im :0.0 },
Complex { re :0.0,im :0.0 },Complex { re :0.0,im :0.0 },
Complex { re :0.0,im :0.0 },Complex { re :0.0,im :0.0 }
];
let mut jx :usize=0;
while jx<s.len() {
r[jx].re=s[jx].re;
r[jx].im=s[jx].im;
jx=jx+1;
};
let order :usize=8;
let spectrum_len :usize=order/2;
/* Бит-реверсная сортировка */
let mut j:usize=spectrum_len;
let mut i:usize=1;
while i <=(order-2) {
if i<j {
let tmp_re:f64=r[j].re;
let tmp_im:f64=r[j].im;
r[j].re=r[i].re; r[j].im=r[i].im;
r[i].re=tmp_re; r[i].im=tmp_im;
};
let mut k :usize=spectrum_len;
loop {
if k>j { break; };
j=j-k;
k=k/2;
};
j=j+k;
i=i+1;
};
/* Цикл по уровням разложения */
let ibreak :usize=((order as f64).ln()/(2.0 as f64).ln()).trunc() as usize;
let mut level:usize=1;
while level<=ibreak {
let lvl:usize = ((2.0 as f64).powf(level as f64)).trunc() as usize;
let lvl2:usize = lvl / 2;
let tmp:f64 = mypi() / (lvl2 as f64);
let sr:f64 = tmp.cos();
let si:f64 = -tmp.sin();
let mut ur:f64 = 1.0;
let mut ui:f64 = 0.0;
/* Цикл по спектрам внутри уровня */
let mut jj:usize=1;
while jj<=lvl2 {
/* Цикл по отдельным бабочкам */
let mut i:usize = jj-1;
while i<=(order-1) {
let ip:usize=i+lvl2;
let tr:f64=r[ip].re*ur-r[ip].im*ui; /* Операция бабочка */
let ti:f64=r[ip].re*ui+r[ip].im*ur;
r[ip].re=r[i].re-tr;
r[ip].im=r[i].im-ti;
r[i].re=r[i].re+tr;
r[i].im=r[i].im+ti;
//
i=i+lvl;
};
let tr:f64 = ur;
ur = tr * sr - ui * si;
ui = tr * si + ui * sr;
jj=jj+1;
};
level=level+1;
};
return r;
}
fn main() {
println!("FFT быстрое преобразование Фурье (алгоритм Кули-Таки)");
let a :[Complex; 8 ]=[
Complex { re :0.1,im :0.0 },Complex { re :0.2,im :0.0 },Complex { re :0.3,im :0.0 },
Complex { re :0.4,im :0.0 },
Complex { re :0.5,im :0.0 },Complex { re :0.6,im :0.0 },Complex { re :0.7,im :0.0 },
Complex { re :0.8,im :0.0 }
];
let b :[Complex;8]=myfft(&a);
let mut i:usize=0;
while i<b.len() {
println!("{ } { }",&b[i].re,&b[i].im);
i=i+1;
};
}
Вот так оно даже правильно работает , но чего это стоило! ( жаркий рабочий день без кондиционера - окно открыто и в окно время от времени залетают осы )