func FFT_ct2(this *Matrix.Matrix, N, skip int, tf *[]complex128) *Matrix.Matrix { Xr := Matrix.NullMatrixP(N, this.GetNColumns()) Scratch := Matrix.NullMatrixP(N, this.GetNColumns()) var E, D, Xp, Xstart *Matrix.Matrix var evenIteration bool if N%2 == 0 { evenIteration = true } else { evenIteration = false } if N == 1 { Xr.SetRow(1, this.GetReferenceRow(1)) } E = this for n := 1; n < N; n *= 2 { if evenIteration { Xstart = Scratch } else { Xstart = Xr } skip := N / (2 * n) Xp = Xstart for k := 0; k != n; k++ { for m := 0; m != skip; m++ { D = E.MatrixWithoutFirstRows(skip) D.ScalarRow(1, (*tf)[skip*k]) sr, rr, _ := Matrix.Sum_Sustract(E.GetReferenceRow(1), D.GetReferenceRow(1)) Xp.SetRow(1, sr) Xp.SetRow(N/2+1, rr) Xp = Xp.MatrixWithoutFirstRows(1) E = E.MatrixWithoutFirstRows(1) } E = E.MatrixWithoutFirstRows(skip) } E = Xstart evenIteration = !evenIteration } return Scratch }
func FFT_aux(this, xr, RowTemp *Matrix.Matrix, N, skip int, tf *[]complex128) { if N == 1 { xr.SetRow(1, this.GetReferenceRow(1)) return } FFT_aux(this, xr, RowTemp, N/2, skip*2, tf) FFT_aux(this.MatrixWithoutFirstRows(skip), xr.MatrixWithoutFirstRows(N/2), RowTemp, N/2, skip*2, tf) for k := 0; k < N/2; k++ { xr.ScalarRowIntoRowMatrix(RowTemp, k+1+N/2, (*tf)[k*skip]) sr, rr, _ := Matrix.Sum_Sustract(xr.GetReferenceRow(k+1), RowTemp) xr.SetRow(k+1, sr) xr.SetRow(k+1+N/2, rr) } }
func FFT_ct3(this *Matrix.Matrix, N, skip int, tf *[]complex128) *Matrix.Matrix { Xr := Matrix.NullMatrixP(N, this.GetNColumns()) Scratch := Matrix.NullMatrixP(N, this.GetNColumns()) var E, D, Xp, Xstart *Matrix.Matrix var evenIteration bool if N%2 == 0 { evenIteration = true } else { evenIteration = false } if N == 1 { Xr.SetRow(1, this.GetReferenceRow(1)) } E = this for n := 1; n < N; n *= 2 { if evenIteration { Xstart = Scratch } else { Xstart = Xr } skip := N / (2 * n) Xp = Xstart for k := 0; k != n; k++ { var Aux = func(m0, m1 int, Xp, E, D *Matrix.Matrix) { println("-", m0) Xp = Xp.MatrixWithoutFirstRows(m0) E = E.MatrixWithoutFirstRows(m0) //D = E.MatrixWithoutFirstRows(skip) for m := m0; m < m1; m++ { D = E.MatrixWithoutFirstRows(skip) D.ScalarRow(1, (*tf)[skip*k]) sr, rr, _ := Matrix.Sum_Sustract(E.GetReferenceRow(1), D.GetReferenceRow(1)) Xp.SetRow(1, sr) Xp.SetRow(N/2+1, rr) Xp = Xp.MatrixWithoutFirstRows(1) println("E", E.ToString()) E = E.MatrixWithoutFirstRows(1) } } mm := skip / 2 m0 := 0 //m1 := skip go Aux(m0, mm, Xp, E, D) //println("->E", E.ToString(), ">XP", Xp.ToString()) //go Aux(mm, m1, Xp, E, D) //for m := 0; m != skip; m++ { // D = E.MatrixWithoutFirstRows(skip) // D.ScalarRow(1, (*tf)[skip*k]) // sr, rr, _ := Matrix.Sum_Sustract(E.GetReferenceRow(1), D.GetReferenceRow(1)) // Xp.SetRow(1, sr) // Xp.SetRow(N/2+1, rr) // Xp = Xp.MatrixWithoutFirstRows(1) // E = E.MatrixWithoutFirstRows(1) //} E = E.MatrixWithoutFirstRows(skip) } E = Xstart evenIteration = !evenIteration } return Scratch }