06-19-2015 08:50 AM
I would like to use the FFT v8.0 LogiCORE IP block with the following settings:
1. Fixed point
3. Rounding mode = convergent rounding
According to the documentation (DS808) the word length of the output will be:
(input width + log2(transform length) + 1)
My problem is: this is 1 more bit that I would expect.
I tried to get an input signal that would exercise the MSB bit of the output signal, but failed. I thought (naively, apparently) that the maximum output sample would result if a maximum-amplitude sinusoid was applied at the input, with a frequency in the center of any of the FFT frequency bins.
For example, if you look at the documentation of the simulation model (UG459) on page 15, Notes->"FFTs with Fixed-Point Interface"->1.b, then if C_INPUT_WIDTH = 8 and C_NFFT_MAX = 3 then the output is in the range -16.0 to +15.99. The maximum output that I could ever get from the core with this configuration is -8.0, i.e. 1 bit less that the full range. For example, when all the input samples are set to their maximum negative value.
So my question is basically: can anybody give me an example of an input signal that will exercise the MSB of the output signal, with the core configured as above?
I am at the point of simply discarding the MSB, but perhaps there is some scenario where it can be exercised which I can't think of.
06-23-2015 01:40 AM
I managed to construct an input vector that does exercise that top bit.
I generated a complex sinusoid with zero phase, and then I forced each of the samples to their maximum negative or positive values, depending on whether their original value was negative or positive. This was done to the real and imaginary component of each sample separately.
The end result is then a complex square wave with maximum amplitude and zero phase. (Zero phase so that the output signal's power is contained only in the real component, maximising the number of bits excersized in a specific sample)
The corresponding Matlab code snippet is:
input = cos(2*pi*f*t) + 1i.*sin(2*pi*f*t);
input = (real(input)>0) - (real(input)<=0) + 1i*((imag(input)>0) - (imag(input)<=0));