[Scilab-users] Re : fftshift and ifftshift are way too different

Samuel Gougeon sgougeon at free.fr
Wed Oct 10 10:22:14 CEST 2018


Le 10/10/2018 à 09:21, amonmayr at laas.fr a écrit :
> Le 10/10/2018 à 08:47, Samuel Gougeon a écrit :
>> Le 09/10/2018 à 21:52, antoine monmayrant a écrit :
>>> Hello Samuel,
>>>
>>> Sorry I might not have made myself clear: fft and fftshift provide 
>>> the ability to perform transform along only one of the dimensions of 
>>> a multidimensional array.
>>> Something like S(x,y,z) --[FFT along 3rd dim]--> 
>>> ffthift(ffft(S(x,y,z), -1,3),3)=Ŝ(x,y,kz).
>>> In that case, you need to perform fft and eventually fftshift along 
>>> only the dimension of the transform.
>>> ifftshift should also provide the same possibility to perform the 
>>> inverse transform: Ŝ(x,y,kz) --[IFFT along 3rd dim]--> 
>>> iffthift(ffft(Ŝ(x,y,kz), +1,3),3)=S(x,y,z).
>>>
>>> This is a basic signal processing requirement in my field.
>>
>> Hello Antoine,
>>
>> Yes, you are right: in case of directional FFT and odd number of 
>> elements along the chosen direction, ifftshift can't presently be used.
>> Could you please post the same remark on bugzilla? This bug/wish is 
>> not yet reported.
> OK, I'll put it in my TODO-list.
>>
>> IMO we may propose and include it in Scilab as soon as for Scilab 6.0.2.
>>
>> BTW, still IMO, fftshift and ifftshift should rather be merged in a 
>> single function.
>> It's the same code, except a floor<=>ceil. This should deserve just 
>> an option, not a separate dedicated function.
>> I guess that this separation likely comes from a kind of abusive 
>> Matlab-like mimicry.
> Yes, I agree.
> But I don't see how we can merge the two without increasing the huge 
> halo of confusion that blurs the help pages and use of fft-related 
> functions¹ ².

You know, the most numerous pages we have about basically the same 
feature, the more inconsistencies between them we can get.

> The first idea that came to my mind was to make one single fftshift 
> function where:
>  - if dim>0, you do direct shift (ie for a direct Fourier transform) 
> along dimension dim;
>  - if dim<0, you do inverse shift (ie for an inverse Fourier 
> transform) along dimension |dim|.

I am not too convinced using the sign of dim to set the direction of the 
shift,
because the dim sign could be used to something else more useful (and 
general)
when dealing with an hypermatrix (to be discussed elsewhere).

> But as "-1" means direct fft and "+1" inverse fft, mixing fft and 
> fftshift would be a real mess.
Yes, having chosen the sign of the exponent as a flag to set the 
direction is not very handy/clear.
But we must do with it now...

Basically, flipdim() could do the same, by implementing  new 
"fft"|"ifft" values for its blockSize option.

>
> Antoine
> ¹ One I just discovered yesterday: the help page for fft is not listed 
> in "Scilab Help >> Signal Processing > Transforms " ! Only ifft is 
> listed, cool, he? Of course, ifft points to "Scilab Help >> Signal 
> Processing > Transforms > fft". Idem  for dst, ...

It is listed, but it depends on the way you get the list:

  * Go to the Scilab help browser, and watch the list in the left margin
    : fft is listed, but not ifft
  * Now, click on the fft help directory, still on the leftside list :
    in the page pannel, you get the list of contents of the help
    directory: here, ifft is listed, but not fft

This is due to the bug 11633 
<http://bugzilla.scilab.org/show_bug.cgi?id=11633>. It occurs when a 
page has multiple <refname> (titles)

About ifft() and fft2(): to me, these both functions are completely 
useless. They do nothing more than what fft() can do.
I presume they have been introduced again to mimic Matlab. What brings 
confusion.
Formerly, there was also a mfft() in Scilab. We have removed it, since 
fft() does its job whatever is the number of dimensions of the input!
To me, we must go on and remove fft2() and ifft(), or at least 
undocument them.
This does not prevent to keep "fft2" and "ifft" tags in the fft() page, 
in order to get the fft() page when we type "help ifft" ;
or even to keep also their code (but maintaining the Matlab-to-Scilab 
converter should be a priority instead!).
But not to keep their pages. Or otherwise, to move them in the 
"Compatibility functions" module.
To me, it's their only relevant place.

> ² Oh, and this one cool too: in the fft help page:
> "incr
> a vector of positive numbers with integer values, or a vector of 
> positive integers. *See the Description part for details.*"
> but the Description never says what the heck "incr" is, does and 
> means.... Arghhh. It only appears once in an example of a "previous 
> syntax".

It is written:

      *

        /|X=fft(A,sign,dims,incr [,option])|//is a previous syntax that
        also allows to perform all direct or inverse fft of the slices
        of //|A|//along selected dimensions. /

        //

        /For example, if //|A|//is an array with //|n1*n2*n3|//elements
        //|X=fft(A,-1,n1,1)|//is equivalent to
        //|X=fft(matrix(A,[n1,n2,n3]),-1,1)|//.
        and //|X=fft(A,-1,[n1 n3],[1 n1*n2])|//is equivalent to
        //|X=fft(matrix(A,[n1,n2,n3]),-1,[1,3])|//. /

        //

    //

//
//So, it is described ;) But it is rather unclear, indeed. You are 
welcome to reformulate it :)

When 3 pages have to be written and maintained (in ideally 5 different 
languages en fr ja pt ru) instead of one, then the time and care than 
can be invested to write excellent pages is expectedly 3 times shorter 
for each one of them...

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20181010/284feafc/attachment.htm>


More information about the users mailing list