[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Octave-bug-tracker] [bug #49026] function fft return wrong result or cr
From: |
Rik |
Subject: |
[Octave-bug-tracker] [bug #49026] function fft return wrong result or crash if n=1 and dim>2 |
Date: |
Fri, 21 Oct 2016 19:11:24 +0000 (UTC) |
User-agent: |
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 |
Update of bug #49026 (project octave):
Status: Confirmed => Patch Submitted
_______________________________________________________
Follow-up Comment #2:
The problem seems to be in do_fft in libinterp/corefcn/fft.cc. I quote the
code, along for the first case for real FFT of single matrices.
if (n_points < 0)
n_points = dims(dim);
else
dims(dim) = n_points;
if (dims.any_zero () || n_points == 0)
{
if (arg.is_single_type ())
return octave_value (FloatNDArray (dims));
else
return octave_value (NDArray (dims));
}
if (arg.is_single_type ())
{
if (arg.is_real_type ())
{
FloatNDArray nda = arg.float_array_value ();
nda.resize (dims, 0.0);
retval = (type != 0 ? nda.ifourier (dim) : nda.fourier (dim));
}
The original array was a 4-D array (2x4x2x2). The call to fft
fft (x,1,4)
has asked to use just a single point along the fourth (last) dimension. In
the C++ code,
dims(dim) = n_points;
the final dimension is set to 1 so the new dimensions are 2x4x2x1.
Eventually, nda.resize is called, and Octave knows to trim singleton
dimensions, so the matrix becomes a 3-D matrix 2x4x2. You can check and find
that fft works correctly when the dimension is not the trailing dimension.
That's the problem. I can see a few solutions. First, from someone who
understands the FFT well, if I take an FFT with a single point, is the result
really just an indexing operation? In this example
fft (x,1,4) === x(:,:,:,1) ???
If that is the case, then maybe we can implement that equivalent index
operation on an octave_value in C++ only when n_points == 1. This wouldn't be
too much of a hassle because there is already a special case for n_points ==
0.
Second, maybe there is a way to resize an array and avoid trimming singleton
dimensions.
Third, and least interesting, each fourier and ifourier routine in liboctave
needs to be updated to handle this special case.
I'm attaching a patch that works for me. Mike, can you test it?
Since this is a crash I would apply it to the stable branch if it passes QC.
(file #38789)
_______________________________________________________
Additional Item Attachment:
File name: fft.cset Size:4 KB
_______________________________________________________
Reply to this item at:
<http://savannah.gnu.org/bugs/?49026>
_______________________________________________
Message sent via/by Savannah
http://savannah.gnu.org/
- [Octave-bug-tracker] [bug #49026] function fft return wrong result or crash if n=1 and dim>2,
Rik <=