Reply by Mark Borgerding●November 27, 20072007-11-27
4N wrote:
> I solved the problem myself, but to think that I had to apply a convolution
> just to normalize the values...
I'm not sure why you would need "convolution just to normalize the
values". From what I can tell, your problem was simply scaling. Many
FFT libraries have a non-unity gain when doing ifft( fft(x) ).
Did you read the README file? I know some people are morally opposed to
reading documentation, but it is barely 100 lines long. It has a
whopping two FAQs. The second one would've solved your problem:
" Q: Why don't I get the output I expect?
A: The two most common causes of this are
1) scaling : is there a constant multiplier between
what you got and what you want?
2) mixed build environment -- all code must be compiled
with same preprocessor definitions for FIXED_POINT and kiss_fft_scalar
However ... with that said, one of these days I will probably make
kiss_fft do round-trip scaling. I get the scaling question often enough
to make me realize that the library is not as fool-proof as it could be.
-- Mark
Reply by 4N●November 24, 20072007-11-24
I solved the problem myself, but to think that I had to apply a convolution
just to normalize the values...
"4N" <xxxx@yyyy.zzz> ha scritto nel messaggio
news:47455386$0$36447$4fafbaef@reader5.news.tin.it...
> Hi,
> I'm trying to convert an image to frequency domain and back using kiss
> FFT.
> The problem is that when I ONLY apply the forward transform than (just
> after that) the inverse transform I obtain a brightened image.
> I'm using complex numbers this way:
>
> const int dims[2] = {h,w}; // dimensions of fft ( height, width)
> const int ndims = 2; // number of dimensions. here 2 (2D)
> kiss_fftnd_cfg stf = kiss_fftnd_alloc(dims, ndims, 0, 0, 0), // forward
> 2d fft configure
> sti = kiss_fftnd_alloc(dims, ndims, 1, 0, 0); // inverse 2d fft configure
> kiss_fft_cpx *buf = new kiss_fft_cpx[w * h],
> *out = new kiss_fft_cpx[w * h];
>
> get Luminance from image and put it inside the array buf like follows:
>
> for(every pixel at location x)
> {
> // for simplicity here I don't center the spectrum
> buf[x].r = Luminance[x];
> buf[x].i = 0.0;
> }
>
>
> // forward fft
> kiss_fftnd(stf, buf, out);
> // inverse fft
> kiss_fftnd(sti, out, buf);
>
> for(every pixel at location x)
> // I use just the real part
> Luminance[x] = buf[x].r ( clipped in the range [0,255] );
>
> set luminance back inside the image
>
> free allocated data;
>
> This is a very simple code but it doesn't work like it's supposed to.
> I hope someone can help me.
>
> Thanks in advance.
>
>
Reply by 4N●November 22, 20072007-11-22
Hi,
I'm trying to convert an image to frequency domain and back using kiss FFT.
The problem is that when I ONLY apply the forward transform than (just after
that) the inverse transform I obtain a brightened image.
I'm using complex numbers this way:
const int dims[2] = {h,w}; // dimensions of fft ( height, width)
const int ndims = 2; // number of dimensions. here 2 (2D)
kiss_fftnd_cfg stf = kiss_fftnd_alloc(dims, ndims, 0, 0, 0), // forward 2d
fft configure
sti = kiss_fftnd_alloc(dims, ndims, 1, 0, 0); // inverse 2d fft configure
kiss_fft_cpx *buf = new kiss_fft_cpx[w * h],
*out = new kiss_fft_cpx[w * h];
get Luminance from image and put it inside the array buf like follows:
for(every pixel at location x)
{
// for simplicity here I don't center the spectrum
buf[x].r = Luminance[x];
buf[x].i = 0.0;
}
// forward fft
kiss_fftnd(stf, buf, out);
// inverse fft
kiss_fftnd(sti, out, buf);
for(every pixel at location x)
// I use just the real part
Luminance[x] = buf[x].r ( clipped in the range [0,255] );
set luminance back inside the image
free allocated data;
This is a very simple code but it doesn't work like it's supposed to.
I hope someone can help me.
Thanks in advance.