There are different real FFT blocks because since the basic unit is
the biplex core, it can be set up to handle real signals in different
ways optimally, and these ways are different enough that a single
block doesn't make sense. The wideband_real block needs at least 2^2
simultaneous inputs since the biplex core can handle 4 real numbers at
a time. Adding higher power of two number of inputs increases the
number of biplex cores used.
You can also do two sets of 2 real inputs at a time (biplex_2x block)
and finally, you can do 4 sets of single sample at a time real inputs
with the biplex 4x block. Each block has a different output data
configuration, hence different blocks.

For your particular use case Louis, you should set the length of the
FFT to 2^11 (the number of channels you want) and the size of the
PFB_FIR to 2^12 (the number of real samples in each FFT frame). This
is what I was getting at when I mentioned this block is a bit
confusing. Also, it looks like this block has been updated
considerably since the version I use, so some parameters may have
changed. In particular, the version I use is fixed at 2 streams of 2
samples per clock. It sounds like the new block may be better
optimized for your use case, and you could do 4 streams of 2 samples
per clock with one FFT block.

Also note that the output order of the block is different than
wideband_real (which simply puts out the frequencies in increasing
order). biplex_2x puts them out in "classic computer FFT order" I.e.
0, 1, 2, ... N/2, -N/2, -N/2+1, ... -2, -1

Glenn






On Sun, Nov 3, 2013 at 2:47 PM, David MacMahon
<dav...@astro.berkeley.edu> wrote:
> Hi, Louis,
>
> I'm not very familiar with the fft_biplex_2x block.  One other thing to keep 
> in mind is that the FFT blocks all use a "biplex" FFT block underneath.  The 
> biplex FFT block processes two complex streams simultaneously, which allows 
> for 100% utilization of the underlying multipliers.  I don't know off hand 
> why the fft_wideband_real block would complain about the parameters you gave 
> it.  Maybe I am mistaken about "Number of Simultaneous Inputs" being log2 of 
> the demux factor?
>
> Dave
>
> On Nov 3, 2013, at 11:36 AM, Louis Dartez wrote:
>
>> Hello David,
>>
>>       Thank you for this clarification on the “Bach-and-Rock” algorithm. The 
>> deeper I delved into the FFT block the more confused I was getting because 
>> it was difficult where the samples ended. This ri-to-c trick makes a lot 
>> more sense to me now. Originally, I was planning to use the wideband_real 
>> fft block with 2^1 simultaneous inputs. The entire reason I began looking 
>> into the fft_biplex_2x block at all was because when I set N=1 for two 
>> simultaneous inputs per stream I get the following error the moment I hit 
>> “apply”:
>>
>> <Screen Shot 2013-11-03 at 11.35.26 AM.png>
>>
>> This means that N is restricted to N=>2. Is there a way around this or is 
>> the biplex_2x what I want?
>>
>> L
>> On Nov 3, 2013, at 11:25 AM, David MacMahon <dav...@astro.berkeley.edu> 
>> wrote:
>>
>>> Hi, Louis,
>>>
>>> The plethora of FFT choices can be overwhelming.  It would be nice if there 
>>> were a "CASPER FFT Selection Guide" or flow-chart that would make things 
>>> clearer, but I am not aware of any.  I think if you want to use an ADC 
>>> whose sample rate is greater than the FPGA fabric rate, then you will need 
>>> to use the "fft_wideband_real".  The "wideband" part of the name is 
>>> intended to imply that is has a "demux" factor.  For example, if your ADC 
>>> samples at 500 Msps and presents two samples per 250 MHz FPGA clock cycle, 
>>> the "demux factor" is 2.  The dialog for the fft_wideband_real block has a 
>>> field labeled "Number of simultaneous inputs (2^N)" into which you would 
>>> place the log2 of the demux factor.  In the example above, you would enter 
>>> 1 in that field (demux factor 2 == 2^1).
>>>
>>> Another thing to be aware of is that most high level FFT blocks deal with 
>>> real inputs since they are most often getting real samples from an ADC.  
>>> The fundamental FFT implementation is complex-in/complex-out, so the 
>>> trivial implementation would be to add a constant 0 imaginary component to 
>>> the real ADC sample to make it complex.  Though trivial, it is also very 
>>> wasteful.  The CASPER real-input FFTs do a "trick" where they combine two 
>>> real streams into one complex stream by assigning one real input to the 
>>> real component and the other real input to the imaginary component.  The 
>>> independent FFTs of the independent inputs can be recovered from the FFT of 
>>> the complex signal by adding or subtracting opposite signed bins of the 
>>> complex FFT.  For real signals A and B, it works out to something like this:
>>>
>>> Z = A + Bi
>>> FFT_A(w) = FFT_Z(w) + FFT_Z(-w)
>>> FFT_B(w) = FFT_Z(w) - FFT_Z(-w)
>>>
>>> This is sometimes called "Bach-and-Rock" because one could put Bach music 
>>> on one channel and Rock music on the other channel and they would remain 
>>> independent.
>>>
>>> Real FFT blocks only output half the spectrum (the other half is redundant 
>>> as it is just the conjugate of the first), so they usually have half as 
>>> many outputs as inputs.  Because of this, each output will either multiplex 
>>> the spectra of two inputs or have half the demux factor of the input(s), 
>>> depending on which real FFT block you're using.
>>>
>>> Hope this helps,
>>> Dave
>>>
>>> On Nov 3, 2013, at 10:37 AM, Louis Dartez wrote:
>>>
>>>> Hello Glenn,
>>>>
>>>>     Thanks for this; I think I’m getting closer to understanding. I’m 
>>>> shooting for an FFT implementation that gives me 2^11 FFT bins/channels 
>>>> for each polarization (FFT size = 2^12).
>>>>
>>>> I’ve written my replies below:
>>>>
>>>> On Nov 3, 2013, at 4:48 AM, G Jones <glenn.calt...@gmail.com> wrote:
>>>>> Hi Louis,
>>>>> Replying to the list for the benefit of others.
>>>>>
>>>>> You have the right idea. The biplex real 2x block uses the basic biplex 
>>>>> core to process two real signal streams or polzns simultaneously with two 
>>>>> samples per stream per clock. In theory the top two inputs are for one 
>>>>> stream and the result comes out the top output.
>>>>>
>>>>>
>>>> Something that’s confused me is that there is no way to explicitly tell 
>>>> the fft_biplex_2x block how many individual “streams/polarizations” I want 
>>>> to process like there is in the fft_wideband_real block.
>>>> <fft_wideband_pars.png>
>>>> <fft_2x_pars.png>
>>>>> Two important notes:
>>>>> For a long time, there was an error in this block, which may likely still 
>>>>> be there where the inputs are mislabeled and a bit scrambled. This may 
>>>>> have been fixed, but to be sure, look under the block. The two samples 
>>>>> from a stream should be joined in an ri_to_c block. The error was that 
>>>>> the streams were crossed so that one sample from each stream was 
>>>>> incorrectly combined in the ri_to_c block. I am using this broken version 
>>>>> just by ignoring the port labels and connecting the streams based on what 
>>>>> the ri_to_c blocks are connected to. Hope that makes sense.
>>>>>
>>>>>
>>>> Yes, I think I get this; it may have since been fixed. I’ve attached an 
>>>> image of the internals of the FFT block along with a possible 
>>>> implementation scheme below:
>>>> <fft_biplex_2x_attempt.png>
>>>> <fft_2x_under_mask.png>
>>>> It would seem from the block internals that the samples that belong to the 
>>>> two individual polarizations are (pol0_in, pol1_in) and (pol2_in,pol3_in), 
>>>> respectively. Should I ignore the output port names (pol02_out and 
>>>> pol13_out) and assume that the first (pol02_out) one is fft_0 (serving bin 
>>>> 0, then bin 1, then  bin 2…up to bin 2047) and the second fft_1?
>>>>
>>>>> Secondly, I've gotten confused by the number of stages/ length of fft 
>>>>> setting for this block a few times. The length is the number of stages 
>>>>> and the number of output frequency channels, but the length of the fft 
>>>>> (needed by the pfb_fir block, for example) is twice this (the number of 
>>>>> real samples in each fft).
>>>>>
>>>>>
>>>>
>>>> In the parameters for this block (image attached below) I set the size of 
>>>> the FFT to be 2^12 (4096) because I want 2^11 (2048) actual FFT bins 
>>>> across the spectrum. In the version that I have there is no input for 
>>>> telling the FFT block how many stages there should be (opening it up I saw 
>>>> 12 individual “fft_stage” blocks).
>>>> <fft_2x_pars.png>
>>>> From the CASPER wiki:
>>>> <Screen Shot 2013-11-03 at 10.26.55 AM.png>
>>>>
>>>>
>>>> My design will sport two dual input ADCs that output 2 real samples per 
>>>> SMA input each FPGA clock; this a total of 8 real sampled values each 
>>>> clock / 4 polarizations. In your opinion would it be better to simply 
>>>> change the Number of simultaneous inputs parameter to 4*2 (instead of 4*1) 
>>>> to accommodate for the extra two polarizations or should I just use 
>>>> another block entirely?
>>>> <fft_biplex_2x_8inputs.png>
>>>>
>>>> Thanks for all the help!
>>>> Louis
>>>>> Hope this clarifies things,
>>>>> Glenn
>>>>>
>>>>> On Nov 2, 2013 11:49 PM, "Louis Dartez" <louisdar...@gmail.com> wrote:
>>>>> Hello Glenn,
>>>>>
>>>>>    Thanks for the quick reply! I’m a bit confused as how this block 
>>>>> works. I’m not quite sure what to make of the following statement from 
>>>>> the casper wiki: Real inputs 0 and 2 share one output port (with the data 
>>>>> for 0 coming first, then the data for 2), likewise for inputs 1 and 3, 
>>>>> and so on.
>>>>>
>>>>> Which inputs/outputs correspond to which “stream” or “polarization”? Is 
>>>>> the implementation in my attached image close?
>>>>>
>>>>> Thanks,
>>>>> L
>>>>> On Nov 2, 2013, at 8:06 PM, G Jones <glenn.calt...@gmail.com> wrote:
>>>>>
>>>>>> The biplex_real_2x is what you want, and it will do two 'polarizations' 
>>>>>> at a time.
>>>>>>
>>>>>> On Nov 2, 2013 10:56 PM, "Louis Dartez" <louisdar...@gmail.com> wrote:
>>>>>> Hello Mark, Glenn, et al.,
>>>>>>
>>>>>>
>>>>>>   Does anyone know of any CASPER FFT block that will take as inputs two 
>>>>>> real sampled values (per ADC input) and output a single complex-valued 
>>>>>> frequency bin per FPGA clock? The three FFT blocks that I’ve found on 
>>>>>> the CASPER block documentation and the latest mlib library (wideband 
>>>>>> real, biplex real 4x, and the biplex real 2x)  all accept real sampled 
>>>>>> values but require a minimum of 4 simultaneous values per FPGA clock per 
>>>>>> ADC input. I could really use an FFT block (and a corresponding 
>>>>>> polyphase FIR block) that will accept only two real sampled values for 
>>>>>> each of a total of four ADC inputs and spit out a single complex FFT bin 
>>>>>> (per stream) per FPGA clock.
>>>>>>
>>>>>> Can someone point me in the right direction here?
>>>>>>
>>>>>> Thanks!
>>>>>>
>>>>>> L
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Louis P. Dartez
>>>>>>> Graduate Student
>>>>>>> Center for Advanced Radio Astronomy
>>>>>>> University of Texas @ Brownsville
>>>>>>
>>>>> <fft_biplex_2x_attempt.png>
>>>>>> Louis P. Dartez
>>>>>> Graduate Student
>>>>>> Center for Advanced Radio Astronomy
>>>>>> University of Texas @ Brownsville
>>>>>
>>>>
>>>>> Louis P. Dartez
>>>>> Graduate Student
>>>>> Center for Advanced Radio Astronomy
>>>>> University of Texas @ Brownsville
>>>>
>>>
>>
>>> Louis P. Dartez
>>> Graduate Student
>>> Center for Advanced Radio Astronomy
>>> University of Texas @ Brownsville
>>
>

Reply via email to