fftr now working, but very slowly

[email protected] Wed, 6 Aug 2003 15:38:47 -0300
Newsgroups gmane.comp.gnu.octave.sources
Message-ID <[email protected]>
Hi.

I made it work now, but it's very slow.

I want  to  modify  octave  to  make  it  use the fftw3 library, and I'm
starting with separate functions first. I expected that this real-signal
function  would work faster than octave's fft function, but of course, I
was  wrong. It's slow yet. Could it be because it's all in a dynamically
linked library, and not yet inside octave?

I never worked modifying a program's code and submitting patches, are
there any rules I should follow to contribute to octave?


bye



On Wed, Aug 06, 2003 at 11:49:13AM -0300, [email protected] wrote:
> Here is the source code of the funtion.  I'm compiling it with
> 


-- 
Nicolau Werneck <[email protected]>         9F99 25AB E47E 8724 2F71
http://cefala.org/~nwerneck                   EA40 DC23 42CE 6B76 B07F
"The secret of genius is to carry the spirit of childhood into maturity"
-- Thomas Henry Huxley
fftr.cc (text/x-c++src, 2.3 KB)
#include "/home/nwerneck/include/octave-2.1.50/octave/oct.h"
#include "/home/nwerneck/include/octave-2.1.50/octave/oct-cmplx.h"
#include "/home/nwerneck/include/octave-2.1.50/octave/lo-mappers.h"

#include "/home/nwerneck/include/fftw3.h"


//typedef size_t = unsigned int;

DEFUN_DLD(fftr, args,, "-*- texinfo -*-\n\
@deftypefn {Loadable Function} {} fftr (@var{signal}[, @var{N}])\n\
test function for FFT of real signals using fftw3 library.
@end deftypefn")
{
// begin adapted from fft.cc 

	octave_value retval;

	int nargin = args.length();

	if (nargin < 1 || nargin > 2) {
		print_usage("fftr");
		return retval;
	}

	octave_value arg = args(0);

	int n_points = arg.rows();
	if (n_points == 1)
		n_points = arg.columns();

	if (nargin == 2) {
		double dval = args(1).double_value();
		if (xisnan(dval))
			error("fft: NaN is invalid as the N_POINTS");
		else
			n_points = NINT(dval);
	}
	if (error_state)
		return retval;

	if (n_points < 0) {
		error("fft: number of points must be greater than zero");
		return retval;
	}
	int arg_is_empty = empty_arg("fft", arg.rows(), arg.columns());

	if (arg_is_empty < 0)
		return retval;
	else if (arg_is_empty || n_points == 0)
		return octave_value(Matrix());
	if (arg.is_real_type()) {
		Matrix m = arg.matrix_value();

		if (!error_state) {
			if (m.rows() == 1)
				m.resize(1, n_points, 0.0);
			else {
				m.resize(n_points, m.columns(), 0.0);

//                      retval = m.fourier();

// begin adapted from oct-fftw.cc

				ComplexMatrix sai(m.rows() / 2 + 1, m.columns());

				double *in(m.fortran_vec());
				Complex *out(sai.fortran_vec());

				for (int i = 0; i < m.columns(); i++) {
//                                      OCTAVE_QUIT;
//                                      octave_fftw::fft(&in[npts * i],
//                                                       &out[npts * i],
//                                                       npts);

					fftw_plan ftp;
					ftp = fftw_plan_dft_r2c_1d(n_points, &in[n_points * i], reinterpret_cast < fftw_complex * >(&out[(n_points/2+1) * i]), FFTW_ESTIMATE);
					fftw_execute(ftp);
					fftw_destroy_plan(ftp);
				}

				retval = sai;
		// end adapted from oct-fftw.cc
			}

		}
	}
//  else if (arg.is_complex_type ())
//  ...
	else {
		gripe_wrong_type_arg("fft", arg);
	}
	return retval;



}