Search code examples
fpgaxilinxconvolutiontime-frequency

Convolution by Dirac Delta on Xlinx FPGA


I am trying to convolve a 16-bit input data stream with a Dirac Delta on a Xilinx Virtex 7.

More specifically, instead of multiplying my input stream by a cosine in the time domain, I would like to convolve it with the following expression in the frequency domain: F(f) = 0.5 * (delta(f - f0) + delta(f + f0))

Does anybody have any idea about how to implement that ? Indeed, the only possibly interesting Xilinx IP core for my problem is the FIR Complier but I don't know how to represent my function F(f) as the 'coefficient' input of this IP core.

EDIT: mathematically, since the target convolution involves only Dirac Deltas, there may exist a shorter way to avoid the convolution by simply evaluating the input function at the point f0. But I have no idea about how to implement that neither ..

Thank you in advance


Solution

  • Xilinx has an IP to perform Fast Fourier Transform on the FPGA. Once in frequency domain, you are somewhat on your own to perform your operations. You could use the FIR ip core, but since your function is quite simple it would waste a lot of resources compared to a custom implementation. Finally, the Xilinx's core can do inverse FFT to go back to time-domain.

    AFAIK, there is no core to help perform convolution in frequency domain. So don't forget to overlap-add your transforms to do the proper calculation. Matlab will be your friend there!

    Finally, you may be interested in Number Theoretic Transform (NTT). The algorithm is more efficient than FFT for FPGA and can be used to perform convolution. The drawback is that there are limitations to the length of the transform you can have and that the "frequency-domain coefficient" are totally unrelated to frequency (they are somewhat random). If all you want if fast-convolution, NTT is for you, if you're looking for other uses for these fourier-coefficient, it's not. However, the NTT expression of the cosine would be much more complicated and would defeat the purpose of your work, but I thought you may be interested on an academic standpoint. As I stated in my comment, multiplying with a cosine is simpler in time-domain after all.