10-30-2013 04:30 PM
Hello,
I am currently using the 2013 version of labview FPGA to implement a 8192 point Fourier Transform within a single cycle time loop.
Unfortunately, I am running into issues where the last 2 data streams from my FFT are not output from the FFT block. Essentially, if I request that 32768 data points (4 data streams) be processed I only get out 16384 (2 data streams). The 2 missing data streams is consistent no matter the number of inputs I request (I request 2500, I get 2498, I request 1000000, I get 999998).
I have monitored the data on both the Host and the FPGA side and I send the correct number of points into the FFT; however I am missing 16384 points (2 data streams) out of the FFT.
There is a host side solution to request 2 extra data streams; however, this is less than elegant and is not ideal for my practices.
I have seen some discussion that the data valid function essentially acts as a clock enable and when data valid is false, the FFT block stops operating. And in fact with a latency of 21000 pts, I can see some logic behind this argument; however, I have been unable to locate a solution to this problem. Any suggestions would be appreciated.
Thanks for your help,
Scott
My implementation of the FFT is attached as well as the configuration for the FFT node.
10-30-2013 11:50 PM
Hi spmattison,
Just out of curiousity:
You could try to refer to the example "FFT with Handshaking" and see if you can try using it for your code. It's the way how you can use the handshaking functions of the FFT. Open your LabVIEW >> Help >> Find Examples... >> click on the Search tab >> enter keyword: FFT >> select FFT with Handshaking - R series.lvproj
Warmest regards,
Lennard.C
10-31-2013 11:09 AM
Hi Lennard.C,
Thanks for your reply. Raw data is a target scoped FIFO collecting data from my digitizer. The target scoped FIFO is 10000 point and the toHost FIFO is 32768 point along with a large host side buffer. I monitor the overflow state on both FIFOs and never receive an error.
I had previously read the four wire handshaking example, and while helpful it did not solve the problem I was experiencing.
I believe the difference between the two is that the FFT in that example is receiving a steady data stream whereas my data stream is continually interrupted. Essentially, I am triggering reading a trigger from my digitizer and only collecting 256 data points per trigger. For my application triggers come at either 50 or 100kHz so I essentially have 500 - 1300 data points of no data input for every 256 I collect.
I belive I have found a work around for my particular application by adding a boolean that determines when I have completed sending data into the FFT. At that point, I then enter a flush state which stops reading from the FIFO and sets the input valid of the FFT to true until I have collected the same output from the FFT that I input. This ensures that I receive all the data I expected to receive, and I have verified that it is the data I was expecting, so in essence, the code is now working. I am currently building in a reset function so the code may be called repeatedly from the host. It's not pretty, but it seems to be functioning.
If anyone has a suggestion for a cleaner way of doing this, I would appreciate it.
Thanks,
Scott