http://imagej.273.s1.nabble.com/FFT-along-line-in-image-tp3698130p3698132.html
> Jon Harman wrote:
>> Hi,
>>
>> Is there a plugin to ImageJ that can calculate the FFT along a line
>> in the image and display the result (say for instance plot the power
>> spectrum)?
>>
>> Jon
>>
>> .
>>
>
>
> Hi Jon,
>
> Just for fun,
> here is an infamous SlowFT macro, not even well tested.
> A better idea would be to use an external FFT lib, like
> jnt.fft or others you could use for 1D transform.
>
http://math.nist.gov/~BMiller/java/>
http://www.google.com/codesearch?hl=en&lr=&q=fft+lang%3Ajava+&btnG=Search>
> and last but not least
>
http://rsb.info.nih.gov/ij/developer/source/ij/process/FHT.java.html> :-)
>
> seb
>
>
>
> SlowFT.txt
> -----------------------------------------------------
> //"Brute Force" Fourier Transform
> //very naive implementation of usual DFTs
> //the slowest DFT you can find
> //neither symmetry/parity/memoize nor "butterfly" trick
> //just raw and slow Discrete Fourier Transform
> //unusable with large arrays!
>
> //actually, large is quite small :-)
> //direct+inverse transform took 13 sec for 800 pixels
> //on a (old) Pentium4 1.6Ghz
>
> var PI=3.1415926536;
>
>
> macro "LineFTTest"
> {
> if (selectionType != 5)
> exit("Line selection required!");
>
> x=getProfile();
> n=x.length;
> setBatchMode(true);
> T0=getTime();
> F=slowRFT1D(x);
> ift=slowIFT1D(F);
> T1=getTime();
> setBatchMode(false);
> name = "[SlowFT]";
> run("New... ", "name="+name+" type=Table");
> f = name;
>
> print(f,"\\Headings:x\tReF=Re(FT(x))\tImF=Im(FT(x))\tRe(IFT(F))\tIm(IFT(F)");
>
> for(i=0;i<n;i++)
> {
> print(f,x[i]+"\t"+F[i]+"\t"+F[n+i]+"\t"+ift[i]+"\t"+ift[i+n]);
> }
> print("direct and inverse transform of "+n+" values took "+(T1-T0)+
> "ms");
> }
> I
>
>
> //direct real FT
> function slowRFT1D(real_in)
> {
> N=real_in.length;
> S=newArray(2*N);
>
> for (m=0;m<N;m++)
> {
>
> RSm=0;
> ISm=0;
> for (k=0;k<N;k++)
> {
> RSm+=real_in[k]*cos(2*PI*k*m/N);
> ISm-=real_in[k]*sin(2*PI*k*m/N);
> }
> S[m]=RSm; //real part
> S[N+m]=ISm; //imaginary part
> }
> return S;
> //S:Complex: {Re[0],..Re[N-1],Im[0]..Im[N-1]}
> }
>
> //direct complex FT
>
> function slowFT1D(z_in)
> {//z_in complex: {Re[0]..Re[N-1],Im[0]..Im[N-1]}
> N=z_in.length/2;
> S=newArray(2*N);
> for(m=0;m<N;m++)
> {
> RSm=0;
> ISm=0;
> for (k=0;k<N;k++)
> {
> c=cos(2*PI*k*m/N);
> s=-sin(2*PI*k*m/N);
> RSm+=(z_in[k]*c-s*z_in[k+N]);
> ISm+=(z_in[k]*s+c*z_in[k+N]);
> }
> S[m]=RSm;
> S[m+N]=ISm;
> }
> return S;
> // output= complex (as z_in...)
> }
> //Inverse complex FT
> function slowIFT1D(S_in)
> { //S_in complex: {Re[0]..Re[N-1],Im[0]..Im[N-1]}
> N=S_in.length/2;
> sout=newArray(2*N);
> for (k=0;k<N;k++)
> {
> Rsk=0;
> Isk=0;
> for (m=0;m<N;m++)
> {
> c=cos(2*PI*k*m/N);
> s=sin(2*PI*k*m/N);
> Rsk += (S_in[m]*c-s*S_in[m+N]);
> Isk += (S_in[m]*s+c*S_in[m+N]);
> }
> sout[k] = Rsk/N;
> sout[N+k] = Isk/N;
> }
> return sout;
> }
>