Teensy Convolution SDR (Software Defined Radio)

Frank

I've been digging into Hilbert filters for IQ receivers using the Oak Hills software. One of the things I notice is that the typically used designs that have about 100 taps start to fall apart below about 800 Hz with resulting loss of sideband suppression close to carrier. Do you have any data about what the sideband suppression below 1Khz is with your convolutional approach?

Joe
W3JDR
 
DD4WH, Frank_B, and Team, I need some ideas and pointers to get my SDR working fully on WFM. I built the Jori's front-end and previously posted a picture of my setup, which works fine on all bands but FM. I'm not sure what else to do or check. When I switch to FM, I don't get the spectrum grid displayed and the S meter doesn't move no matter where I tune. All I get on FM is noise or static which changes as I tune around. I've been pulling my hair out to fix this but to no avail. I even setup another Arduino IDE on win10 to eliminate possible wrong libraries I had around on my MAC but no improvement. On all other bands, it's working really fine, very strong signal levels and clear reception. Any pointers or hints would be much appreciated...
Thanks in advance, Les
 
Hi,

Msi001 board finally aseembled and tested!

https://twitter.com/ea7gib/status/1278419763287461898?s=20

https://twitter.com/ea7gib/status/1278419552792195072?s=20

EbyLfEcXYAARRnX.jpg

Frank, boards will be posted soon to you qth.

Regards.
 
Hi,

Msi001 board finally aseembled and tested!

https://twitter.com/ea7gib/status/1278419763287461898?s=20

https://twitter.com/ea7gib/status/1278419552792195072?s=20

View attachment 20831

Frank, boards will be posted soon to you qth.

Regards.

Hi gmtii,
it looks great. Did you have time to take a look in to the files I shared with the corrected functions for the Msi001 frequency and gain settings?
It will be great to compare a bit the designs, can you share what is the noise figure for different frequencies of your design.
I plan for the weekend to build a test setup to estimate the actual dynamic range on my design.
 
Last edited:
Frank

I've been digging into Hilbert filters for IQ receivers using the Oak Hills software. One of the things I notice is that the typically used designs that have about 100 taps start to fall apart below about 800 Hz with resulting loss of sideband suppression close to carrier. Do you have any data about what the sideband suppression below 1Khz is with your convolutional approach?

Joe
W3JDR

Hi Joe,
there are several aspects with this according to my experience:
* convolution filtering is computationally less intense if you substitute FIR filters from about 60 taps onwards, so even with such a low no. of taps (100) in your Hilbert Filter it would be worth using convolution filtering --> Borgerding has some figures about that in his papers (link in my github WIKI)
* Teensy Convolution SDR uses a 512-point FFT, so this is equivalent to 256 tap FIR filtering (with 50% overlap). Now: we do a decimation step with a decimation-by-4, that means that the filter skirts are even 4 times steeper (with 4 times lower internal sample rate), so that the convolution filtering is equivalent to a FIR filter with 1024 taps --> 10 times higher than the filter you designed in IOWA HILLS filter designer
* the Hilbert filter in the Teensy Convolution SDR is not easy to see: it is hidden inside the calculation of the complex FIR filtering coefficients --> look at the code function which is called something like "calc_cplx_coeffs"
* sideband suppression in the Teensy Convolution SDR is something like 55-65dB. It is dependent on switching ON the I/Q correction routine by Moseley & Slump --> user option in the menu --> default is ON
* maybe you can achieve some dB better by manual IQ amplitude and phase correction, but this has to be done for every band. My tests revealed that it is not necessary to use manual correction, because the automatic correction is at least of equal quality than manual tweaking

Performance of Hilbert filter at low frequencies:
* we use an IF frequency of IF == sample rate / 4
* That means the Hilbert filter is not stressed too much in the low frequency range where opposite sideband rejection could be worse (however, we have 1024 taps!), but it is supposed to have good rejection at the frequencies at -samplerate / 4

I have written up some lines for the mcHF WIKI concerning the thematic of sideband suppression and Hilbert filters at low frequencies, maybe that is of interest:

https://github.com/df8oe/UHSDR/wiki/IQ---correction-and-mirror-frequencies

And also something about sideband suppression which adresses exactly your question:

https://github.com/df8oe/UHSDR/wiki/How-does-your-UHSDR-software-DSP-work

If you have further questions, dont hesitate to ask.
But it would be good if you could be a little bit more specific with your observations/questions. E.g.
* what exactly means "designs start to fall apart" -> what did you test? what were the results of these tests? Could you provide any figures?

Have fun with the Teensy Convolution SDR,
Frank DD4WH
 
DD4WH, Frank_B, and Team, I need some ideas and pointers to get my SDR working fully on WFM. I built the Jori's front-end and previously posted a picture of my setup, which works fine on all bands but FM. I'm not sure what else to do or check. When I switch to FM, I don't get the spectrum grid displayed and the S meter doesn't move no matter where I tune. All I get on FM is noise or static which changes as I tune around. I've been pulling my hair out to fix this but to no avail. I even setup another Arduino IDE on win10 to eliminate possible wrong libraries I had around on my MAC but no improvement. On all other bands, it's working really fine, very strong signal levels and clear reception. Any pointers or hints would be much appreciated...
Thanks in advance, Les

Hi Les,

* in WFM, the default is NO spectrum display (because of the high processor load at 256ksps sample rate), so this is intended behaviour
* without a spectrum FFT being performed, there is also NO dBm-display. It is simply not yet implemented in WFM :). So this is intended behaviour
* so, probably, you did not do anything wrong!
* Karlchen also gave some hints in message #456 on modifying the QSD frontend, so that the Tayloe mixer gets a wider bandwidth in order to pass 250 kHz of bandwidth
* please also not that in ALL cases, WFM is much less sensitive as the other modes, because we use the trick of undersampling (3rd harmonic), which makes it possible to receive frequencies even if the LO cannot tune high enough. But it also has the disadvantage of (at least) 10dB loss of sensitivity!
* the SDR was not intended to have WFM reception, it was just an experimental feature. If you want to build a really good and ultrasensitive VHF receiver, you would probably have to build a new frontend specifically designed for VHF
* I have very strong FM transmitters (6 x 100kWatts) about 3km away from me, so it is no surprise that my SDR receives WFM in Stereo even without an antenna ;-)
 
Hi guys,
before going to the noise measurements few words about the test setup I used to calibrate the receiver, as a source I used a Stanford Research DS345 signal generator and a 40dB attenuator, and each band was calibrated at S9 (-73dBm or 50µV rms). Generator was set to -33dBm and the 40dB attenuator was added on the output.

I kept fixed the receiver settings for each band:
- Premplifier on the main board "ON"
- Premplifier on the BPF board "OFF"
- Msi001 attenuation 40 dB
- RF gain (menu) 0 dB
- Filter bandwidth 5400 Hz

hi Tisho,

very nice you got your SDR to work!!!

I am also very impressed about the noise floor figures.

When comparing with Sherwoods figures, here: http://www.sherweng.com/table.html

-125dBm of noise in 5400Hz BW corresponds to about -135dBm of noise in 500Hz BW, which is the standard in the Sherwood table!

I think the Msi001 is very good!
 

Hi Esteban,
while looking at your video, I realized the rather high temperature of the T4 processor, if I read correctly it is 58 degrees C in the enclosure.

That seems to me rather high/critical (could lead to reboot/freezing of the processor), maybe in closed enclosures it would be good to have a heat sink glued to the processor. personally I use a large copper heat sink glued with thermal glue (I used this for overclocking experiments). It significantly lowers the temperature.
Also, reducing the processor speed in the menu can give significantly lower supply current and lower processor temperature! In most cases, 300MHz is more than enough ;-).

All the best, Frank DD4WH
 
Hi Les,

you must change C13 and C15 from 3.3nF to 47...68pF at the OP amplifier also. They build a LPF in combination with R10 and R11/P1!
 
Hi Frank,
How to connect LP Filters Band to a Teensy 4.0 board?
I see only how to connect to the Teensy 3.6 board.
 
To use the full range of the ADCs and prevent clipping on the other hand. The INAs are low noise.

Have you made any progress on the variable gain op-amp idea Frank? I have been thinking about it. As you say, keeping the level into the ADC high but not overloading is important for the dynamic range of the receiver. Also, I have been using a magnetic loop antenna which typically has better signal to noise ratio than a dipole, but the RF signal level is much lower. 40dB of gain has proven to be way too low for my setup. Youngblood had a switch in his SDR-1000 to change the gain of the instrumentation amps from 20 dB to 40 dB as needed. But he also had up to 60 dB of audio gain in the sound card he was using.
 
@Karlchen: did you test one of the 2xfo-setups you posted in #403 in a real SDR frontend? I would be very interested in your experiences and the performance differences compared to a 4xfo setup!
I am asking because I wonder what could be the reason that up to now, many of the QSD frontends do not use 2xfo, but 4xfo setup, although the 2xfo setup does not require any more parts and has the advantage of doubling the theoretical receive frequency?

@DD4WH
The reason for using the 4xfo is this: Crystal oscillators begin with a sine wave. A crystal is a very narrow filter - in frequency terms, an FFT with one bin turned on and the rest off -- so only one frequency (so a sine wave). Converting a sine wave into a perfect square wave is nearly impossible. You can get the frequency perfect but the duty cycle will be off. If the sine wave is centered at 1 Volt, you need a comparator that switches at exactly one Volt - if it is off even a tiny bit, your duty cycle will be off. This is why digital circuits typically either use the rising edge or the falling edge of the clock signal (rarely both).
If you need a signal with a perfect 50% duty cycle, the only practical way of doing it is to have a clock at 2X frequency and divide it by 2. The flip-flop will trigger on and off with every rising clock edge so you get a perfect 50% duty cycle.
For the QSD we need clocks exactly 90 degrees out of phase. A 2xfo setup uses a divide by 2 on the rising edge of the input clock to generate the I clock and a divide by 2 on the falling edge of the input clock to generate the Q clock (bad!). So the frequency of the I and Q clocks are correct, but the phase between them is not.
The spec sheet for the Si5351 states the duty cycle is between 45% and 55% < 160 MHz and between 40% and 60% > 160 MHz. So with a 2xfo setup with an input clock of 40% duty cycle, your I and Q will be 72 degrees apart (360 degrees * 40% /2). This is an 18 degree phase error! Very bad.
The 4xfo creates an exact 90% phase offset because only the rising edges (or only the falling edges) of the input clock is used for both the I clock and the Q clock. The duty cycle of the input clock can be 2% and it will still work fine.
I hope this made sense.
 
@DD4WH...
The spec sheet for the Si5351 states the duty cycle is between 45% and 55% < 160 MHz and between 40% and 60% > 160 MHz. So with a 2xfo setup with an input clock of 40% duty cycle, your I and Q will be 72 degrees apart (360 degrees * 40% /2). This is an 18 degree phase error! Very bad.
...

If the OMD will be used in the integer mode and the divisor is a power of two, so the duty cycle is 50%. Also you can use the output R diviser with a power of two, that gives a duty cycle of 50%. An other 2fo setup without a 7474 Johnson ring counter is the direct drive of the 74CBT3253 with 2fo and fo clocks from the Si5351 as the switching select signals S0 and S1.
 
If the OMD will be used in the integer mode and the divisor is a power of two, so the duty cycle is 50%. Also you can use the output R diviser with a power of two, that gives a duty cycle of 50%. An other 2fo setup without a 7474 Johnson ring counter is the direct drive of the 74CBT3253 with 2fo and fo clocks from the Si5351 as the switching select signals S0 and S1.

That makes sense. So long as there is a divide by 2 in the output register of the Si5351, the 2xfo should work fine. I also saw somewhere that two outputs of the Si5351 can be set to the same frequency but with a 90 degree phase offset. I think Hans Summers (QRP Labs) figured it out, but I don't know if anyone has tried it yet. That would allow the elimination of the ring counter and operation up to 200 MHz.
 
You are right, QRP-Labs use the 90 degree direct drive of the 74CBT3253 with the QCX tranceiver. The great disadvantage of this is the 3,5MHz low cuttoff frequency. With the 2fo/fo drive you can reach frequency lower than 3,5MHz.
 
Here are some pictures of my finished Convolution SDR.
IMG_4759.jpg
IMG_4749.jpg
IMG_4751.jpg
IMG_4753.jpg
IMG_4757.jpg
Now I need to put some filters in there.
 
My newly build receiver is off in frequency. I have the calibration constant set to 0. My crystal is 27 MHz and I'm using the DD4WH hardware setup.
I set a test oscillator up at 1 MHz and my receiver receives it at 0.978373 MHz which is 21627 Hz low. This is also 21627 ppm so not just crystal error (which is probably 20 ppm).
What is the calibration factor? I have been going through the code but still don't understand it. Do I need to adjust it? It is currently set to 1000000.
 
@WH7U: Congrats to you for your working SDR!

I would suggest to use the latest firmware version of the Teensy Convolution SDR! You seem to have an old version, where the calibration constant was in the range of 10E6, now it is 10E9. You should also use the recommended Si5351 lib version, otherwise the calibration variables do not fit the lib [https://github.com/etherkit/Si5351Arduino]! Do you have this lib installed?

After fixing that, you could do the following:

* Tune your SDR to a signal with known frequency in the lower range of the Rx range, eg. 3.5MHz
* Have a look at the menu and search for "F-calib / constant"
* adjust, until frequency display is correct
* Tune your SDR to a signal with known frequency in the upper range of the Rx range, eg. 25MHz
* in the menu, search for "F-calib / factor"
* adjust, until frequency display is correct

Then you should be done with calibration. Do not forget to save your calibration settings to the EEPROM --> use "Save to Eeprom" entry in menu1

From my experience, the calibration -once done- is quite reliable and should allow frequency display with accuracy of a few tens of Hz in the upper range (25MHz) or even better

Accuracy can be considerably improved, if you use one of these tiny SMD TCXO for 27MHz for the Si5351 instead of the simple crystal. But you already know that, because your QRP labs Si5351 breakout board has a dedicated soldering place for that TCXO.

73 de Frank DD4WH
 
Hi Frank,

Thanks! I'm excited to start experimenting.
I have the latest code and the correct Si5351 library. I think you have the calibration_constant and calibration_factor reversed. The calibration constant is 0 and the calibration factor is 1e9. I tried your calibration method but I think something is wrong. I wind up chasing my tail. I think a problem might have popped up in the code. I will try and fix it.
 
Never mind Frank. I figured it out. I was tuning into one of the harmonics near my signal generator.
After reading through the text doc in the Si5351 library... the calibration is in parts per billion. So I measured the frequency error and divided it by the frequency and multiplied it by one billion and put this into the calibration constant. It landed right on the Hertz.
I didn't need the calibration factor. Not sure what it is for.
 
Back
Top