Sunday, 5 July 2020

Measuring SSB TX filters

I have just finished building all the blocks of my test lab (so far...). These are:

1. A Direct Conversion RX, DCRX, for the 40m band, with VFO input from an RF SIGGEN
2. An RF SIGGEN. Based on the Si5351 and covering 1-150MHz (my limits, the Si5351 can do more).
3. An AF SIGGEN. Based on the AD9833 and covering 0-100kHz (my limits, the AD9833 cam do more.
4. An RF METER which uses a -30dB TAP to allow power measurements. The TAP includes a 50R dummy load
5. A 12V/1.5A power supply to power the above
6. And finally, not yet boxed, an AF METER measuring in dBv and Vrms.
Also in the picture is the MAT-125e auto ATU.

In this project I use these along with my MacBook & software to measure the TX filter response of my ELAD FDM-DUO transceiver. This is the setup

Block diagram of the setup

The FDM-DUO transceiver has an RF output up to 5W over all bands. It has two USB inputs for digital transmissions. A "CAT" serial data port and a digital audio port "TX", which actually is an input and an output and is used with apps like WSJT for FT8 mode.
Connections on the FDM_DUO

The RF output is fed to the 30dB TAP attenuator, with a built-in 50R dummy load, and on to the RF METER which has an Arduino sketch written to display the power before the attenuator. This meter can display RF from -50 to +30dBm.

The USB CAT and TX audio inputs come from my MacBook. Where I use two applications, first a serial terminal app "iSerial" to connect to the FDM-DUO CAT port. This allows me to send PTT transmit and receive commands, "TX1;" and "RX;". The second app is Audio Hijack which is a wonderful app allowing you to make any audio connections inside the MacBook just by dragging the items to the screen. I have a USB audio ADC plugged into the USB input which is connected through to the FDM-DUO TX audio port:

The Hijack audio and iSerial terminal apps

The input to the USB ADC is from my AF SIGGEN I built a while ago (look down this blog for details, schematics and software). This SIGGEN covers the needed 50-3000Hz for filter measurements.

To receive the FDM-DUO RF signals I am using a direct conversion receiver that I designed for the Banbury Amateur Radio Society "LEARN-CODE-BUILD" project that I ran a couple of years ago. It is a 40m RX with VFO input from a matching RF SIGGEN. It was targeted at FT8 reception and performed excellently, allowing club members to become familiar with this digital mode using the WSJT app few had tried at that time. The audio output of the DCRX goes finally to my new AF METER.

To measure the filter response, set to one option of 200-2700Hz, the FDM-DUO is switched into transmit by sending a CAT command "TX1;" from the iSerial app. The AF SIGGEN output is adjusted to give 1-2W output power. The frequency is scanned in 50Hz steps over the low and high filter cut off limits and the AF signal from the DCRX is measured. This is the result

The cutoff frequencies of the FDM-DUO filter set to 200-2700Hz

As you can see the upper cut off is very sharp, which is good to avoid spill over to adjacent stations. The low cut off is a little smoother which gives fuller voice characteristic.

It is very noticeable when using an SDR waterfall on your receiver, that  you can see the spectrum of the other station. These vary a lot, showing both the Bandwidth and signal from full and solid across the frequency range. It is also very clear when the station is using audio compression.

Saturday, 27 June 2020

Digital Filter measurements for SSB generation

I have played a bit with Digital SSB generation, see June 2020 below. There are two methods

1. Phasing - where both AF and RF I & Q (90deg shift) signals are generated. The AF signal is produced using a TEENSY processor and filters defined on the Audio.h library.

2. Weaver - where two sine wave oscillators at half the audio bandwidth (e.g. 1400Hz) with a 90 deg phase shift feed two mixers and mix with the incoming audio, then it passes through two sharp low pass filters and on to the RF IQ mixers. Like this

In this case rather than the accurate +/-45 deg phase shifts produced by Hilbert filters, only LPF are needed. Hibert filters on the TEENSY 3.2 can run with up to 120-140 coefficients, and this does not give a flat phase shift across the full audio band. It drops off at low frequencies. 

The result it that the unwanted sideband is not phase cancelled at lower frequencies and a small amount of the wrong sideband is generated at low frequencies.

But with the Weaver system only LPFs are needed, which could have better characteristics on the TEENSY 3.2. When I tried this out I found that the same problem existed and that the LPFs did not have a sharp enough and a flat eoungh frequency response down the low audio frequencies. So I had the same wrong sideband breakthrough. Perhaps a more powerful processor, that can allow more coefficients to be used, may be needed, like the TEENSY 3.5/3.6 or 4.0.

I have decided to study the filter characteristics and see what can be done. For this I need an audio oscillator to feed the TEENSY and an AF meter to measure the output. I have already an AF SIGGEN  (see this blog for February 2019). Here is an AF METER, based on this circuit from the AD8307 data sheet.
Basic schematic

Display shows a bar graph, Vrms and dBv

The software code here is very similar to an RF METER that I had built previously and which runs on an Arduino UNO (or Nano). The AD8307 output goes to the UNO A0 input. The output is displayed on an OLED display.

F1 first filter, Hilbert, 70 taps
Sample rate 41117
Fc 1500
BW 2400
Taps 70
Phase +45 (shown) or -45

Teensy code for this is here

Simulated and actual measured response:

The filter has the expected shape, but it's not what we need for a Phasing SSB exciter, we need a much, much sharper response. As you see in the simulation the phase shift falls away at low frequencies from  the programmed +45. This degrades the phase balance and causes bad balance and unwanted sideband output at low frequencies.

F2 second filter, Hilbert, 100 taps

Saturday, 20 June 2020

QRP Amplifier

I am often in need of a small amplifier that can output a few watts. For example recently I put together a demo WSPR frequency generator using an Arduino and a Si5351 synthesiser. 

The output is +10dBm.

 On ebay there are ready built modules that can output up to 3W. Like this one, that works on 12V,

But I find that the gain of these amplifiers is more than I need. So I am building a small box that has in it an amplifier module to which I will add a stepped attenuator. 

I found this design on the web,

This will give me steps of 5dB from 0-35dB overall, perfect.

Friday, 12 June 2020

GPS 10MHz Frequency Standard

I followed the blog post of PA2OHH and programmed my GPS module to output a 10MHz pulses, in place of the normal 1pps.

Use the UBLOX Windows software (better you go to their web site and download the latest?), install it. 

First you must connect your GPS module to an FTDI Serial RX & TX to USB converter. Remember TX <-> RX and RX <-> TX.

As an alternative PA2OHM uses a programmed Nano to make a UART, and you could too using the sketch SERIAL+UART here. But using a low cost FTDI converter is much simpler.

Now open the UBOX software. First you must connect to your GPS module by selecting the correct COM port. Go to the menu Receiver > Port and select it (mine was COM10). Immediately the software will wake up an start to display graphics GPS data. Now chose View > Configuration View and you will get this window

Change the parameters like this,

Now hit the Send button lower left to program the GPS. The GPS PPS output will immediately to output a 10MHz signal. I checked this on my ELAD FDM-DUO SDR, which turned out to be 6Hz low!

In CW mode with 500Hz bandwidth

My SDR is 6Hz low!

Monday, 8 June 2020

GPS for QSOs

There is a useful Amateur Radio application for your GPS, here it is. This time the latitude and longitude display is replaced by your Maidenhead Locator! This sketch GPS_QSO is here. The schematic and build are in a previous blog post below.

And this is the display at my location,

Remember: the time is in GMT

This should make field day QSOs a little easier, everything you need for your log at 13:27

"Thanks Mike, you are 59033 in India Oscar 92 Hotel Foxtrot" reports.

Sunday, 7 June 2020

GPS module - sentence and lat/lon date/time display

I have had a GPS module lying around for more than a year, but never wired it up to see if it works. When they are working they squirt out lines of text, called sentences, with starting prefixes $GPxxx which give a lot of data.

I have connected up my GPS module with another module which is a serial (RX/TX) data to/from USB converter.

 You can see the four connecting wires, Vcc-5V, Gnd-GND and Rx - TXD, Tx - RXD.

Next I connected the module to a USB port on my MacBook and ran a Serial Terminal app called "iSerialTerm" (excellent reliable app by the way). I set the terminal to the baud rate of the GPS module, 9600baud, chose the Serial terminal module USB address (which turned out to be "usbserial-00000000") and connected. Immediately I saw the GPS had acquired the satellites and was displaying received sentences.

Serial Terminal display

Coding of one sentence, RMC

And taking this a step further how about displaying the latitude, longitude, date and time. I wired up on my table top an Arduino Uno like this

The GPS is connected to Uno A0 and A1 as the RX & TX serial data lines. The OLED is connected to A4 and A5 as the I2C SDA and SCL lines. The other connections are power and ground (the GPS is connected to 3V3 as this is a spare pin, it works on either 3V3 or 5V). This is what it looks like

Now I have just to write some code... There is a useful library on the web called TinyGPS, it's documentation is here. I just needed two functions, one to pull down the latitude and longitude, the other to extract the date and time. These versions are,

      gps.f_get_position(&lat, &lon); // as floats
      gps.get_datetime(&date, &time, &fix_age); // as unsigned longs

Now to display them on the OLED. The lat and lon are floating point numbers and can be simply displayed using the functions

     dispNum(X, Y, lat, 2);
     dispNum(X, Y, lon, 2);

from my Oled.h header of functions using the u8g2 library behind it.

The date and time have to be sorted out. They are retrieved as "unsigned long" looking like this

Date  80620 = 8 Jun 2020
Time 9190200 = 9:19:02

If you are happy to read them like this then just display them, again using again the dispNum(...) function. 

8 Jun 2020 and 9:21:55

But if you want them as a "proper" Date (day, date, month, year "Mon 8 Jun 2020") then you have to do some extraction and use two of my Oled.h header functions

     dispDate(20, 40, dw, dy, mo, yr); // use dw = NULL
     dispTime(20, 55, hrs, mns, sec);

To avoid for now working out the day of the week (Mon, Tues...) I send a NULL which tells the function not to display any day, maybe I will add this later. Sorting out the "dy, mo, yr" and "hrs, mns, sec" is done in a couple of functions like this

// extract bytes dy, mo, yr from 80620 = 8 jun 2020
void calcDMY() {
  dy = (byte)(date / 10000);
  mo = (byte)(date / 100 - dy * 100);
  yr = (byte)(date - dy * 10000 - mo * 100 );

// extract bytes hrs, mns, sec from 9215500 = 9:21:55
void calcSMH() {
  unsigned long t;

  t = time / 100;
  hrs = (byte)(t / 10000);
  mns = (byte)(t / 100 - hrs * 100);
  sec = (byte)(t - hrs * 10000 - mns * 100);

You can then get this display

Remember: the time is in GMT

The sketch for this is GPS_DISPLAY here.

Coding & the working system

Saturday, 6 June 2020

Update on Digital SSB

I had been keen to implement a better drive AF amplifier between the Teensy output (designed to drive 10k) and the balanced mixer inputs (120R).

I have three choices, a small module using a TDA2822 stereo audio amplifier, an emitter follower or a couple of LM386 amplifiers. I wired up the TDA2822 first, then powered it up - making a grand mistake using a 12V supply, when the TDA2822 is rated at 5V. It blew up.

So now I have used a couple of LM386s which give x20 gain and use a 12V supply. The output of the Teensy Audio Adapter is max 1.2Vp-p, this is the digital limit, no wy togo higher, with an overhead margin a working outputis around 0.2Vp-p. This would give an output of 4Vp-p from the LM386. Too high. So I have included a couple of 10k trim pot volume controls. This has the added advantage of being able to balance the AF L & R channels and minimise the unwanted sideband. This is now the circuit

New circuit

And the board and system look like this



LSB output

The rebuild has reduced the carrier break though and it is now 40dB below peak signal. There is still the issue of USB break though as I have seen before. Here is the breakthru by frequency, equals the USB dB  down level,

70 taps USB down in dB

But this is due to weakness in the FIR Hilbert filters in the Teensy, Above is the filters using 70 coefficients or taps. With 100 taps and a slightly narrower BW, the USB breakthru is improved

100Taps, narrower BW, USB down in dB

And this is the Bandwidth using white noise as a source, the SDR is set to 3KHz

SDR at thing 3kHz with white noise input

Now I will try something else. The Audio Adapter chip can pre-process audio before passing to the I2S converter and on to the Teensy. I have enabled this and also a Auto Volume Control. The result is a more "punchy" modulation and it is more difficult to over modulate.

I still have the USB breakthru. I have tried a larger Hilbert filter (ideal would be at least 200 taps), but the Teensy cannot handle above 100 taps in two filters. 

The sketch TEENSY_TX_100_BOOST is here.

Thursday, 4 June 2020

Let's play WSPR

A couple of years ago I wrote an Arduino sketch to generate WSPR on 7040.1kHz. This could be loaded on my general purpose Si5351 signal generator (see this blog, 2018 August) which has three outputs (only one CLK0 is used), a rotary encoder for frequency and/or any other functions, and an OLED display. The design is straightforward,

It also includes a Real Time Clock DS3231 chip on the I2C bus to give the accurate timing required by WSPR and here is the DATE_TIME_SET sketch to set the date/time.

To drive the display I use the superb library u8g2 and an Oled header I wrote which defines some functions like 'display message' or 'number' in different sizes, or draw a 'bar graph', etc Using this header gives all my projects a uniform display GUI. The frequency can be adjusted over the narrow 40m WSPR band, initially it is set to mid-band at 7040.1kHz. The WSPR signals are encoded using a WsprMessage class library.

Back to the WSPR hardware.
The SIGGEN output is quite low, around +7dBm (5mW, 0.5Vrms) or so and not enough, unless you have a superb antenna system, to transmit WSPR. At least +25dBm (3-400mW, 4-5Vrms) is needed. Come-in the two stage amplifier I described below. This has a gain of +40dB so needs an input of around 10-20mV for full output of around 375mW.

So I have used a small attenuator to bring the SIGGEN output down to the amplifier input level.

The Si5351 SIGGEN produces a square wave output with strong harmonics, so a good Low Pass Filter is needed to feed the antenna and not radiate interference. The set up then becomes,

I checked this out by receiving the signals on my ELAD SDR tuned to 7038.6kHz USB with the audio fed to the WSJT software, which decoded it very well. (I can run this either using the SDR software FDM-SW2 -> VAC -> WSJT under Windows using Parallels on the Mac or directly using WSJT on MacOS with data outputs from the ELAD SDR, which has a built-in soundcard).

The set up, SIGGEN and +40dB amp.

After a 12 hours running these were my 'spots' using my (fairly useless) small 60cm loop antenna on an indoor windowsill...

Spots on 7038.6kHz

Best so far 989km
3km / mW!!!

Why don't you try it to see where your antenna system propagates to?

Wednesday, 27 May 2020

+40db small signal amplifier

I have been looking into small signal amplifiers, aiming to design one to have about +40dB gain and a few 100 mW output, this is the result

For both stages the DC bias is for about 1.1V on the emitters, and currents of around 10 & 50mA. Each emitter has a feedback resistor to stabilise the stage gain. The overall gain is +40dB with a 50R source and load.

In my tests I have an input of 20mVrms giving an output of 4.3Vrms, or 380mW. Here's the breadboard

+40dB amp, input at left, +12V bottom, output right
Transistors 2N3804 & 2N5109

Monday, 25 May 2020

More.. Digital SSB

I have found a solution for the USB breakthru which is to increase the number of taps (coefficients) used by the Hilbert Filters, which pushes the accurate +/-45 degrees of phase shift to a lower frequency.

I increased the number of TAPS to 100 coefficients. To do this you must run the Windows Hilbert Filter design program, output 100 +45 and 100 -45 coefficients, convert them to "short" values again  and paste them into the TEENSY_TX sketch. I tightened the original bandwidth to Fc 1.1kHz BW 3.1kHz, giving this filter shape, you can see here also the phase (-45 deg) and how is falls off at lower  audio frequencies, causing the USB breakthru as the phasing is not correct.

FIR filter Fc 1.1kHz BW 3.1kHz

This was the result, the LSB signal is fairly tight within the RX 3kHz BW, but there is a bit of splatter outside the range,

LSB output, 3kHz BW RX

RX on DSB 6kHz, showing TX switch USB/LSB
The other signals at the left are genuine stations

I am still thinking about how to reduce the bandwidth to be clearly between 300 & 3kHz as signals are spilling out to nearly 3.5kHz at the moment. I would also like to put in some audio limiting/compression to "tighten up" the audio and prevent over modulation and splatter. I also need to cancel out the remaining carrier signal...

Thursday, 16 April 2020

Digital SSB

There are some updates to this design above.

A current slide presentation of this project is here (PDF).

Previously (March 2019 down this blog) I built a traditional SSB generator using a fixed frequency balanced mixer and xtal filter to pass only one sideband. Then mixed this again to the final output frequency of 7MHz.

The objective of this development is to make an SSB exciter which generates directly the SSB digitally using a pair of mixers.

This is a development following the "Phasing Method" of SSB generation, which has been around for many years, but has been made easier by the introduction of RF synthesisers and audio signal DSP.

Phasing system SSB generation, AF & RF 0/90degree signals

This method of SSB generation has two parts, the first is to find a way to provide audio signals with a 0/90 degree phase shifts and then two signals at the RF output frequency with 0/90 degree shifts.The challenge is to generate these two pairs of signals AF & RF. 

The RF side has traditionally been generated in many SDR designs by using a digital synthesiser (Si570 or Si5351) running a x4 the output frequency, followed by a /4 Johnson counter to generate the in-phase I and quadrature  Q signals for the mixers. But with clever programming the Si5351 can generate two output signals, CLK0 & CLK1 with a 0/90 degree relationship.

The 0/90 degree audio is more of a challenge, that cannot be done well, without a lot of op-amps and high tolerance capacitors and resistors, across the full audio range of 300-3kHz, This has been solved with Digital Signal Processing techniques. Converting the audio to digital I2S then processing it mathematically, using what are known as Hilbert Transforms, and then converting back to analog.

First a VFO which outputs two signals "I" and "Q" which are always 90 degree shifted from one another, using an Si5351 synthesiser. The Arduino code for this is here (either FREQ_0_90_7100 for a fixed 7.1MHz output or VFO_SDR0_90 for a variable VFO) which has been implemented on a Nano driving a Si5351 over an I2C bus. Here's the result:

Si5351 outputs CKL0 & CLK1 drive in to 56R

Tuning, Step change

An active mixer can be built using 2 x SA612. Like this

Levels: L & R input 30mV max, use 8k2/560R attenuator from Teensy

The breadboard looks like this

Top: Si5351 driven by an Arduino Nano
Centre: the two SA612 mixers
FT37-43 "combiner" transformer 10+10t

This is the test 0/90 audio input from MacOS "osilloppoi" app.

Audio L & R inputs at 0/90 deg 1000Hz

This mixer has a reasonable carrier rejection of around 30dB.  

SDR RX tuned to 7100kHz, 1000Hz modulation USB

The SA612
- I & Q inputs are 240mVrms (about +1dBm)
- L & R audio is 30mVrms
- RF output into 56R is 100mV p-p (approx -15dBm). 

The SA612 has an input impedance of 1k5. The Teensy Audio Adapter has been set for unity gain (MIC gain "0", LINE output setting "25"), and a maximum MIC input is 500mV. The output uses a 8k2/560R attenuator to feed the L&R signals to the SA612s. The Adapter LINE output levels will be adjusted on test for best opposite sideband suppression.

The FDM_DUO SDR,  iMac running Windows 10 and with FDM-SW2 SDR software, looks like this

I have been investigating and alternative to the SA612s mixer. This is a passive design using two of the SBL-1 Mini-Circuits mixers. The choice of which to use depends on the input and output impedances,

This is the SBL-1 mixer, which is deceptively simple,

2 x SBL-1 mixers

The Teensy Audio Adapter LINE out is  specified with a load of 10k, up to 3.18Vp-p, 1.14Vrms

The SBL-1s work at 50R impedance in and out, but the "IF" AF input is very low impedance, I use a series resistor of 120R but it cannot be driven directly by the Audio Adapter. So two buffer +10dB amps are needed,

1 x MCP6002 op amp, +10dB gain

The microcomputers are,

-  the Nano and Si5351 synthesiser, this is very simple with just four connections to the Si5351
Nano and Si5351 synthesiser

- the Teensy & Audio Adapter, also very simple with the Teensy mounted on top of the adapter board

Teensy mounted on top of Audio Adapter
with USB/LSB switch (volume control connections to A1)

The software is the key thing! The sketch for the Nano FREQ_0_90_7100 is here, and for the Teensy TEENSY_TX here. Download also the libraries from here. In particular you will need the Audio library for the audio processing and the oled header for the OLED display formatting together with the u8g2 display library. 

I will generate some audio I/Q signals with 0/90phase difference using DSP techniques running on a Teensy 3.2 board with its associated audio board (rev C) designed by PRJC, available from HobbyTronics.
Teensy 3.2
Teensy Audio Adapter Rev C

The Teensy has a number of connections on the back side as well as the 28 pins along the sides and 5 on the end. It has its own DAC input, but no ADC outputs, so you have to use the stereo I/O Audio Adapter.

These are the pinouts and signals of the Teensy,

Bottom view

Top view - pin functions

The connections to the audio shield are

Bottom view
WARNING: the HP ground (VGND) is not the shield ground (GND),
do not connect them together!
Do not use the HP  output to drive the mixers!
This will destroy the device (I know, I did it)

LINE IN and LINE OUT L & R at the top, microphone direct input is on the right along with the 3.5mm Headphone jack at the bottom on the other side. The pins connect directly to the Teensy 3.2 as follows

Top view

The unused analog and digital pins of the Teensy may be used in your application.  The Teensy Audio Adapter has an output of up to 500mVrms, and uses an attenuator of 8k2/560R to drive the mixer L&R inputs at 30mVrms.

The DSP needs to produce the 0/90deg phase shifted audio signals. It is done like this,

Block diagram

Instead of a single 90deg Hilbert Phase Transform two are used with +45 & -45deg phase shifts (two are used rather than a single 90deg to maintain the same time delay through both I and Q paths). The Out I is non-inverted for LSB output or inverted for USB output by the mixer. An alternative would be simply to changeover the +45 for the -45 transforms (in software, of course).

A design tool from PRJC, the Audio System Design Tool, is used to generate the Teensy code objects and interconnections ("patchchords") for the application, this designed using a graphic interface to draw the configuration,

The simple configuration

Each block is dragged from the left side menu. The stand alone block sgtl5000_1 is the board itself and must be present to allow software instructions to configure the input & output codecs. The other blocks are ones that are interconnected. The design tool is used to export auto-generated code, which defines a series of libraries objects with generated names to be configured later in the code, and interconnections,

Auto generated header code for the configuration above

This code can then be used directly in the application. If you look at the TEENSY_TX sketch you will see this basic outline. In addition in the sketch you can see the setup code of the blocks and the sgtl5000 itself.

The Hilbert Transform coefficients, 16bit signed integers are needed, are generated using the Windows program Iowa Hills Hilbert Filter Designer

Calculated HT filter response

The for a 300Hz to 3kHz BW (-3dB), wide enough for FT8, parameters are set as follows,

1. Menu > Passband > Phase Added
2. Frequency 44117 (audio sample frequency of the Audio Codec)
3. Fc = 1.65kHz (0.0747)
    BW = 3.0kHz (0.1360)
    TAPS = 70
4. Two versions will be generated for +45deg and -45deg phase 
5. Chose Kaiser window
6. For both +45 & -45, File > Save Coefficients in temporary files (I saved these coefficients as text files 45p.txt and 45m.txt)

The generated coefficient ".txt" files can be eventually be used as arrays in the TEENSY_TX sketch code. 

BUT FIRST they must be converted to the right format. The Teensy code FIR filters need a pointer to an array of "short"  values (Teensy is a 32bit processor, so a short is a 16bit signed integer). The output of the IOWA HT app is a list of "float" 18 point decimal numbers. Which have been saved to temporary files (45m.txt and 45p.txt). Like this

Hilbert Transform coefficient IOWA program output values

The first thing to do is import these text files  (one by one) into a spreadsheet, then export them as two CSV (Comma Separated Variable) files. Next paste them into the sketch called  Convert_45 here and use it to convert them to 16bit "short" arrays needed for use in the Teensy sketch. These are output on the Arduino IDE Monitor Screen.

The output is two (plus & minus 45 degrees) completely formatted arrays.

The two HILBERT_COEFFS (70) coefficients converted to "short" value arrays

These two complete arrays are then copy & pasted directly into the actual TEENSY_TX sketch

On the bench this is it,

Left: Nano
Middle: Si5351, SBL-1 mixer and audio buffer amps
Right: Teensy and Audio Adapter

The Arduino Nano is programmed to drive the Si5351 over an I2C bus (SCL/A5, SDA/A4). The output drive is set at 2mA giving about 0dBm on the SBL-1 inputs. The SBL-1 outputs are combined with a BN43-2402 combiner. The Teensy has a mono microphone inputs and two line outputs -45/+45 deg phase shifter, and is filtered to 300Hz-3kHz. A x3 (+10dB) AF amplifier increases the Audio Adapter output drive to the mixers.

These are screen shots from my SDR receiver. 3kHz filter bandwidth, 7.1MHz. Using a fixed 7.1MHz frequency VFO sketch FREQ_0_90_7100 here.

1.5kHz tone input, 
USB breakthrough -40dB

Calling CQ with MIC input
DSP filter could be narrower

The RF output from the mixer is about -20dBm (10-30mV). 

I have tested the SSB exciter on 40m through 10m and it seems to work well. It does not work so well on 80m as the RF 0/90 output from the Si5351 is not accurate and there are both sidebands on the output.

A couple more photos, showing the addition of a rotary encoder for tuning and an OLED display of the frequency, using the VFO_SDR0_90 sketch here.

OLED display
Mixer board
Teensy & Audio Adapter

Arduino Nano
Mixer board with Si5351 synthesiser
OLED display

The SGTL5000 IC has  some built-in DSP functions of its own. These include and auto-volume control and EQ filters.

Obviously these would both be useful for processing the MIC input. But so far I have failed to get them going. I will continue to work on it.

Acknowledgement to ZL2CTM for educating me in this effort. See his videos here