While we're on this fun topic...

The biplex FFT which Dave mentions does all the 2 x real = 1 x complex
tricks. However, in the fft_wideband_real block, this is followed by a
parallel FFT direct block which doesn't have any of these optimizations,
and is thus ~2x bigger than it needs to be.
This probably wasn't a big concern when the block was designed, and the
fastest sample rates were ~4x the FPGA clock rate, so the direct FFT inside
the fft_wideband_real was a relatively small contribution to resource use.
Looking ahead to 10+ GHz ADCs this might cease to be the case - it's
probably worth building some of the real-input optimizations into this
block as well. I believe Ryan Monroe's version of the FFT (
https://www.worldscientific.com/doi/abs/10.1142/S2251171716410026?journalCode=jai)
might do this (as well as a whole bunch of other tricks).

It would be great for someone to look at this further and maybe (cough)
work some optimizations into a new non-simulink-based FFT library.... :)

Jack

On Tue, 14 Aug 2018 at 22:15 David MacMahon <[email protected]> wrote:

> Hi, Jonathan,
>
> The biplex FFT has two complex inputs and two complex outputs.  The two
> input signals are presented "in parallel" (i.e. simultaneously) one sample
> per input per FPGA cycle, but the output spectra appear serially (i.e. one
> signal's spectrum followed by the other signal's spectrum) two frequency
> channels per FPGA cycle.  This block and its various sub-blocks comprise
> the basic FFT functionality of the CASPER library.  All the other FFT
> blocks exist to perform various "tricks" to perform FFTs on other types of
> input data (e.g. real and/or "wideband"), but the underlying core is the
> biplex FFT.
>
> One of the tricks is to combine two real inputs into a single complex
> input.  The positive (non-redundant) frequency channels of each real input
> can be recovered from the complex output spectrum by adding/subtracting
> channel X with channel -X.  I am not aware of any CASPER FFT that processes
> a real input as a complex input with the imaginary component set to 0.
>
> Getting back to Alex's question, I think Jack is on the right track that
> performing inverse FFTs of two N point complex spectra of real inputs can
> probably be accomplished by creating a 2N point complex spectra that is not
> symmetric (via linear combinations of the two input spectra) and then
> inverse FFTing and taking the real and imaginary outputs as the time
> series.  I would recommend working this out analytically first (to ensure
> this is in fact a valid option), then experimenting with MATLAB to ensure
> that the mechanics are understood, then implement in simulink and simulate
> to ensure that the implementation is correct.  There will be some details
> about fft_shift that might be hard to solve if the signals have different
> power levels or spectral shapes.
>
> HTH,
> Dave
>
>
> On Aug 14, 2018, at 13:35, Jonathan Weintroub <[email protected]>
> wrote:
>
> Thanks for the response, Jack.   Hope you are properly caffeinated today ;)
>
> I thought Alex put our application question really clearly, and he’s
> building some very nice bitcodes to see how the various processes work.
> I’d like to ask you, and the community, some simpler meta questions which
> came up for me as we dug into the CASPER blocks.   Personnel changes have
> caused some loss of institutional memory, which is the context.
>
> Jack you said: "you should be able to do FFTs of two streams, A, B, in
> parallel.”  I was under the impression CASPER streaming FFTs are very
> efficient, so that if a real FFT is needed, they are indeed done this way,
> in pairs and stuffed into the real and imaginary part of a complex-in
> complex-out FFT.   Alex is using two CASPER blocks, one called simply “fft”
> which is complex-in complex-out and works as expected. The other called
> “wideband_fft_real”.  What is curious to me about the latter block is that
> it takes a real input stream, and produces half the number of complex
> points at the output (which is the same amount of data, of course).
>
> There is, of course, a redundant copy of the spectrum produced by
> wideband_fft_real too, but that data seems to be stubbed out in the inner
> workings.  What worries me about this is that it seems to be working by
> effectively setting the imaginary part of the inner complex FFT to zero,
> zeroing the redundant hermitian conjugate, and in so doing, is apparently
> doing a factor of two more computation than it needs to in principal.  I
> feel I must be mistaken in this, since I really thought CASPER FFTs would
> not waste computation in this way.
>
> Can someone help guide me to the source of my assumed misunderstanding?
> It may be helpful to know something of the history of wideband_fft_real,
> and it’s relationship to “fft” and any other blocks which might be useful.
>
> As a sidelight, I’ve been trying to find a venerable paper I recall Aaron
> Parsons et al. wrote on the CASPER Biplex FFT.  I can’t seem to find the
> one I recall, this is the closest I have come, but doesn’t have the
> singular focus on the FFT I recall in another useful reference.
>
> https://arxiv.org/pdf/0809.2266.pdf
>
> Can someone point me in the right direction.
>
>
>
> On Aug 14, 2018, at 2:27 AM, Jack Hickish <[email protected]> wrote:
>
> Hi Alex,
>
> I don't know if there's a way to avoid generating the full spectra prior
> to taking the fft (I suspect if there is, it just pushes the buffering
> somewhere else), but it certainly seems like you should be able to do FFTs
> of two streams, A, B, in parallel. I would think this would work by (after
> generating the full spectra) computing FFT(A+iB) such that FFT(A) emerges
> in the real part of the output, and FFT(B) in the imag.
> If you don't need to FFT two independent streams you can probably do
> something smart (like the wideband real fft) to leverage the above to do
> the multiple serial FFTs on a wideland input.
>
> I think? I haven't had coffee yet.
>
> Jack
>
> On Mon, 13 Aug 2018, 11:36 pm Alexander Raymond, <
> [email protected]> wrote:
>
>> Dear CASPER List,
>>
>> I am a postdoc working with Jonathan Weintroub and am new to CASPER.
>>
>> We are working on bitcode for ROACH2 to reformat the data product at the
>> Submillimeter Array in real time so that it can be used directly in VLBI
>> observations as part of the Event Horizon Telescope.  As part of that
>> reformatting, we wish to convert the demultiplexed frequency domain streams
>> of the SWARM F-engine (https://arxiv.org/abs/1611.02596) to time domain
>> streams.  In other words, we want to take the inverse FFT of demultiplexed
>> frequency-domain samples.
>>
>> Ordinarily, we would would achieve the inverse fft using the CASPER
>> complex_conj and fft blocks in series; however, the SWARM frequency domain
>> output comes from an fft_wideband_real block, which discards the negative
>> frequencies, so direct application of complex_conj+fft will not work.  One
>> approach to inverting the data would be to buffer and copy the positive
>> (complex) frequencies emitted by fft_wideband_real, assemble a stream of
>> positive and (mirrored) negative frequencies, then feed the complete
>> spectrum into complex_conj+fft blocks.
>>
>> Jonathan suggested I check with the CASPER community to see, is there a
>> more efficient way of performing our inverse FFT?  Is there a way to take
>> advantage of the knowledge that the output from our iFFT block should be
>> real-valued?
>>
>> We appreciate any guidance the mailing list can provide.
>>
>> Sincerely,
>>
>> Alex Raymond
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "[email protected]" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>>
>
>
> --
> You received this message because you are subscribed to the Google Groups "
> [email protected]" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"[email protected]" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to