I'm planning to build a data acquisition system for a software-defined radio receiver. Basically, it just uses an ADC which samples an analog signal and send the signal to a processor. And then a stream of samples would be fed into a host computer with Software-Defined Radio software packages for signal processing. And since the frequency I'm working on is fairly low, I want to simply run the ADC at twice the Nyquist frequency without having separate I/Q channels, and also, I plan to use Zero-IF.
Most SDR programs designed to natively work with analytic signals, not real signals, so converting the real samples of the signal to I/Q components inside the hardware on the fly before it reaches the host computer is desirable. However, I don't have any prior knowledge on signal processing, and I'm struggling to come up with a solution, but after reading everything I can find on the web, there are basically two options (as mentioned, I don't have any DSP knowledge, it's possible that I'm misguided.).
Digital Downconversion: Multiply the signal with sin(ωt) and cos(ωt) independently for I and Q. It's basically recreates an I/Q mixer digitally, and common in Low-IF radio receivers.
- To me, this concept appears easy to understand, and its implementation is straightforward, just multiply. Although it would mean the frequency of my analytic signal must be shifted, but I don't think it's a big deal, I may as well upconvert the signal a little bit or switch to Low-IF, if DDC is easier overall.
Hilbert Transform: Compute the Discrete Hilbert Transform on the real samples to obtain the analytic signal.
To me, I have no idea on how to implement it. It seems to be a lot of different approaches of doing it.
(1) Calculate the Hilbert Transform via direct convolution. This method seems to suffer from a number of limitations. André Bergner said "a direct convolution is very slow opposed to a FFT based [...] Secondly, the HT kernel has a singularity at zero and the numerical computation of the convolution integral is ill-posed".
(2) Calculate the FFT. Deleting the negative frequencies. Applying the inverse FFT.
(3) Model the transform as a time-invariant filter and implement it as such.
Initially, I thought using digital downconvertion would be convenient because... First, I don't know what I'm supposed to do to implement a Hilbert Transform, especially when using it on incoming samples on the fly, digital downconvertion seems to be easier to implement. Also, a Hilbert Transform looks like a "lossy" process, and some information would be lost due window size of the FFT/filter, but DDC is "lossless". Also, DDC looks much faster as only multiplication is used.
But at a closer look, it isn't really the case. In DDC, both the I and Q channel needs to be filtered afterwards as well, by definition all practical digital filters are approximations, it's incorrect to say DDC is less "lossy" than DHT. Also, the requirement of using two filters rather than modeling the DHT in a single digital filter, means that DDC potentially is slower the DHT. There are also various concerns about the numerically-controller oscillators in DDC.
My questions are,
If the objective is only for creating a naive implementation for obtaining I/Q components from a stream of samples for a real signal on the fly, which method is better in terms of simplicity and ease of understanding?
If the objective is for creating an output of the best "quality", which method is preferable?
If the objective is for creating an efficient program on a signal processor with limited computing power, which method is better in terms of performance?
If a Hilbert Transformer is desirable, what would be an appropriate method to implement it? Are there any reference implementation? What should I start from? In particular, the
hilbert()
function is most scientific computing software packages seems only designed to work on an existing array of data, but not a continuous stream of data, an implementation with demonstration of using windowing is appreciated.Overall, which method is appropriate for my application?