Tuesday, March 10, 2015

Update on the mcHF - Adding more features (Part 2) - Implementing audio filters and fractional I/Q phase adjustments

The front panel display of the mcHF SDR transceiver, an entirely
self-contained all-mode HF transceiver based on open-source software.
This is shown not in its 3D-printed case - which is open-source, too...
(No, you don't need a computer for this transceiver to work!)
Last time (See the January 27, 2015 entry - LINK) the addition of AGC and a gain control to maximize receiver dynamic range was discussed.

This time:  A discussion on the addition of adding audio filtering, decimation/interpolation and fractional I/Q phase adjustments for both receive and transmit.

Doing audio processing with limited resources:

Being that the mcHF is entirely self-contained and has a reasonably powerful, yet modest processor (the STM32F405 or '407 processor running at 168 MHz - a device with an ARM Cortex M4 core that includes hardware floating-point support) there are practical restrictions on how much number-crunching one can get away with when performing various tasks.  As you might expect, the most time-critical task is the "real time" processing of the receive data from the dual A/D converters as I/Q channels into demodulated audio.

If one goes through the literature on typical SDRs in the amateur world it quickly becomes apparent that limited processing power is often not a prime consideration.  This is not too surprising considering the fact that multi-GHz, multimedia processors in desktop computers are ubiquitous, so processing power is considered to be "cheap" and very often a lot of processing is thrown at a problem simply because it is available!

For example, one might implement an FIR (Finite Impulse Response) audio filter with 512 or even as many as 2048 taps without batting an eye on a PC and still have resources to burn, but try that on the processor in the mcHF and you'll have suddenly used up the vast majority of processor power (if not all of it - and more!) on that one task!

So, one starts to ask various questions like:
  • How can I do something while using less processor horsepower?
  • How "good" is "good enough"?
  • If I cut a corner somewhere, how detrimental will it really be in practical, real-world situations?

Receive signal processing:

The mcHF uses a standard, inexpensive "sound card" type codec (a Wolfson WM8731 or the compatible TLV320AIC23) for all A/D and D/A.  This is a 16 bit device capable of a number of sample rates from 8 to 96 ksps (KiloSamples Per Second), but in the mcHF it is typically operated at 48 ksps, this to allow the visualization of the spectrum +/- 24 kHz from the center as can be seen in the picture at the top of the page.

Being a typical SDR one of the first steps in signal processing is the same as that of any typical "phasing" rig - analog or digital - and that is to impart a differential 90 degree phase shift on the audio channels, a task that is, in this case, accomplished with a "Hilbert" transform.

Now, at the beginning the mcHF's audio path was "baseband" based, which is a confusing way to say that all demodulation was done around "zero Hz" or "near DC":  A demodulated CW tone tuned to yield 700 Hz was, in fact, 700 Hz away from the local oscillator frequency.  This is not an ideal situation for a number of reasons (which will be covered in a later installment!) but it was, from the beginning, the easiest thing to do.

Because the demodulation was done "near DC" this meant that the Hilbert transformer had to be of the "0 degree/90 degree" type rather than the more typical "-45 and +45" degree type:  While the former can be made to behave fairly well at low audio frequencies with a reasonable number of FIR taps, the latter cannot!  An 81-tap FIR-based Hibert transformer is used to provide the audio phase shift, providing reasonable performance down to a couple hundred Hz - as low as we need to go for SSB!

Once the two audio channels are set 0/90 degrees from each other one can then do the math to convert the two channels into USB and LSB - which is just addition or subtraction of these channels:  Which does which depends on which phase happens to have been assigned where in the hardware.  This demodulation converts the separate I/Q channels into just ONE audio channel, but it is not yet bandpass-filtered!

Working with limited resources:

IIR instead of FIR audio filtering:

Originally the code used a combination of FIR low-pass and bandpass filters with 48 taps to provide the receive audio filtering but because the receiver sample rate was 48 ksps this meant that with so few taps that it was not practical to define a very "sharp" audio filter.  To get a "properly sharp" FIR audio filter at 48 ksps would require, perhaps, 3-4 times as many taps as that and commensurately larger audio buffers and an increased amount of processor overhead, so I decided to take a different approach.

Most of my embedded programming has been using fairly low-end PIC microcontrollers (the PIC16 and PIC18 families) and I have used both FIR and IIR filters on these devices of rather low complexity since the resource of these processors are extremely limited.  Having cut my teeth on these types of filters I was comfortable enough with IIR filters that I was not scared of their (somewhat undeserved!) reputation of being "inherently unstable" and I also knew from experience that IIR filters could, when properly finessed, offer superior performance to FIR filters in situations where one needed to severely limit the amount of processor overhead, particularly when one has floating point math available.

Having access to MatLab and its filter design/simulation tools I soon had working some fairly low-complexity IIR filters thanks to the built-in support of the CMSIS DSP library (link) that offered performance that was far superior to the original FIR filters with reasonable "Shape Factors" (e.g. the ratio between the passband and attenuation response).

Decimation to reduce processor loading:

So it remained like this for several versions of code:  All of the audio processing was being done at 48 ksps but I had not yet taken advantage of another trick available to reduce processor overhead:  Decimation.

At this point I was still crunching numbers at 48 ksps - this, to produce audio that had no components higher than 4 kHz or so!  Nyquist tells us that to process such signals we need not sample at any higher than 8 kHz, so running at many times that sample rate was simply wasting CPU power!

The term "decimation" in DSP terms simply means keeping 1 out of N samples and throwing the rest away, and if you have fewer samples, there are fewer numbers to crunch.  For practical reasons - sometimes those dictated by available library functions and/or the sizes of buffers - it is usually best to pick "N" as a power-of-two (e.g. 2, 4, 8, 16, etc.) For the second of these reasons (e.g. the audio "chunk" size was 64 samples - a number that was NOT evenly divisible by 6!) my best choice was to decimate-by-four to reduce my sample rate from 48 ksps to 12 ksps.

If you throw away samples you must still do something about the audio spectral content that would be above the Nyquist limit at the new sample frequency, so one must first low-pass filter and remove those signals and that meant that I had to get rid of those signals that would be at 6 kHz and above!

  • In theory, a decimation-by-8 to yield a sample rate of 6 ksps would have worked since, for normal SSB, my maximum audio frequency could be less than 3 kHz.  The problem is that this would have placed my Nyquist limit very near my desired maximum frequency of 2700 Hz or so - and in the audible range - requiring pretty tight filtering.  The added complexity of such filtering may have countered any gains afforded by the reduction in sample rate, plus it would have precluded the use of "wide" audio filters (such as the 3.6 kHz filter) for SSB and AM unless I were to have added yet another decimation rate!  (For CW or Digital-mode filters this would probably be fine...)

The CMSIS library for the ARM M4 processor contains a handy decimation function with a built-in FIR low-pass filter, but number-crunching (with the aid of MatLab) showed that I'd need quite a few FIR taps - and additional processor overhead - to get the needed 60dB or so low-pass filtering that was required!

Fortunately, I already had a low-pass filter at hand:  The Hilbert transformer!

Using the free "Iowa Hills" filter design tools I designed a new Hilbert Transformer that was identical to what was already in there, except that it had a low-pass cut off starting at about 3.6 kHz or so - just about right for the 3.6 kHz audio filter in the radio - and with 81 taps it provided reasonable (>=55dB) worst-case low-pass filtering to prevent aliasing at and above 3.6-ish kHz, the highest audio frequency that my audio filters would pass.

At this point I'll say a few words about "appropriate" audio filtering.  I really didn't care too much if the filtering above this frequency was insufficient to prevent "audible" aliasing since it was going to be removed by the SSB filters anyway.

For example, if one picked, say, 4 kHz has the highest-frequency signal that was going to get through the 3.6 kHz audio filter (e.g. a strong CW signal down on the "skirts" of that filter) we know via math that its alias would be at 12 - 4 = 8 kHz.  What that means is that worst case, our strongest alias signal - and the "closest" to our audio passband - would be at 8 kHz, so our filter must attenuate adequately - by some 60dB or so - between the 3.6 kHz representing the "top" of our widest filter and 8 kHz.

On this point I actually "fudged" a bit:  The filtering was adequate to knock it down only by 50 dB or so, but since the 3.6 kHz filter was not going to be used very often I looked, instead, at the numbers for the "2.3 kHz" filter - which actually passes audio between about 300Hz and 2600 Hz, and its steep skirt is around 3100 Hz or so.  Taking 3100 Hz as our "new" highest frequency the alias would be at 12 - 3.1 = 8.9 kHz and this extra (almost) 1 kHz of roll-off provided another 10 dB or so on our low-pass filter.

Because the CMSIS decimation function required that I put some FIR low-pass filtering in place - that is, I could not use the function without it - I used as few as FIR taps as practical, finessing them with MatLab so that they, too, did as much filtering as they could with those few taps and achieved something in the 10-20dB area (depending on frequency) on top that achieved with the Hilbert transform, so we now had our target of at least 60 dB!

At the output of the decimator I now had to work at 12 ksps rather than 48 ksps which meant that I had to redesign all of my audio filters, but by keeping them as complex as they had been before - even though the sample rate was now lower - meant that they could now be made to be made "sharper" than before and thus offer higher-performance!

Since I had one forth as much audio data to crunch, more processor horsepower was now available to do other things, allowing to add additional features in the future!

Interpolating back to 48 ksps:

At the end of the audio filtering and AGC processing I had another problem:  The D/A converter still operated at 48 ksps so I had to do an "interpolation" step to up-convert from 12ksps.  Here, too, one must do a bit of low-pass filtering, but for a different reason:  The raw 12 ksps audio would contain aliased audio if upconverted directly to 48 ksps and this can be heard (if your ears are good enough) and could be extremely annoying!

As with the decimation, there is a CMSIS library interpolation function and it has a built-in FIR low-pass function, but there is no real need to make this filtering particularly strong.

In the worst case scenario with the 3.6 kHz audio filter selected, there will be audio content at (12kHz - 3.6 kHz = ) 8.4 kHz - but nothing below that, so a fairly weak low-pass filter with relatively few FIR taps (to minimize processor loading!) was designed in MatLab.  This filter was designed to start rolling off above 3.6 kHz and by the time it got to 8.4 kHz it was attenuating by 25dB or so and was down by 30-40 dB the time it got to 9-10 kHz, where the vast majority of the aliasing energy would be when one operated the most-used 2.3 kHz audio filter:  Because of the way that the human ear works, the "clutter" at the high audio frequencies, knocked down by 25+ dB would probably not even be noticed by someone with even the most acute hearing!

Upon getting this code operational, I fed the LINE OUT from the receiver into the Spectrum Lab program with a sound card running at 192 kHz and verified that the low-pass filtering did, in fact, reduce the aliased signals by the predicted amount.  I then routed the audio into full-range speakers and, with a graphic equalizer, intentionally boosted the highs by 10-15dB in an effort to accentuate the aliasing signal but even in a worst-case scenario with single tones the aliasing was pretty much inaudible.

  • For the 10 kHz audio filter mode, decimation/interpolation-by-2 was used and similar tricks were used with the Hilbert transformer to minimize processor loading.  In this case the interpolation's low-pass filtering was far less effective since the Nyquist frequency is 12 kHz so the output contains aliasing components that are only 6-15dB down, worst-case.  Even in this case, with a 9.8 kHz tone - with the alias at 24 - 9.8 = 14.2 kHz - the psychoacoustical properties of human hearing make it somewhat difficult to hear this tone.
  • The codec chip is also capable of operating at 8 ksps, both for A/D and D/A operations.  While this would greatly reduce processor overhead, it would limit the view on the spectrum scope to just +/- 8 kHz!  If there had not been enough processing power to do what was needed to be done this may have been a necessary strategy to take, but with voice modes, it turned out not to be needed.  In the future when digital modes are contemplated and additional processing power may be needed - but a wide "spectrum scope" is not - the use of an 8 ksps rate will be considered.

Fractional I/Q phase adjustments:

One of the problems with real-world hardware is that there will inevitably be variations in the I/Q phasing and amplitude of the audio as it is processed by the two audio A/D converters.  This phase difference could be from a slight shift in the local oscillator signal or, more likely, it could be due to component variations in the analog circuitry comprising the mixer and filtering that precedes the A/D converter.  Whatever causes this problem, it must be addressed to maximize the opposite-sideband rejection.

Addressing the amplitude imbalance is pretty easy:  One simply multiplies the amplitude of the I/Q channels by a small, fractional number made adjustable by the user.   Typically both channels are multiplied by equal and opposite amounts so that the total amplitude remains generally constant.

Phase adjustment, on the other hand, is trickier!

In my researching how this is done on PC-based SDR implementations I saw that there appeared to be handy, on-the-fly calculations phase adjustments that could be done using various library functions that would transform the I/Q signals.  While such functions may have existed somewhere in the bowels of the libraries available to me, real-time calculation of the phase for each sample that came in would represent a prohibitive cost in terms of processor power!

So, how would one take care of this problem with a minimum of overhead, preferably with a one-time calculation?

It struck me that if I could modify the Hilbert transformer in a "fractional" manner I might be able to effect a fractional phase adjustment.  Since calculating the 81 coefficients internally was out of the question (I didn't want to figure out how to do that from scratch, plus it would have been a pain if I needed to modify the Hibert transformer in the future if I wanted to modify its parameters!) I wondered if I could "tweak" a fixed set of coefficients and not "break" the transformation to a significant degree?

Using the Iowa Hills program I calculated four sets of Hilbert coefficients:  0 degrees, 90 degrees, 89.5 degrees and 90.5 degrees.  In the mcHF, the 0 degree set (the "I" channel) would remain constant, but if the I/Q phase needed to be adjusted, the data from the nearest "alternate" set of coefficients for the "Q" channel would be proportionally blended.  For example, if 89.95 degrees was needed, it would use 10% of the 89.5 degree set and 90% of the 90.0 degree coefficients and this new data would be input to the Hilbert transformer.

Putting this new code into the receiver, using a signal generator, and making very careful measurements at the "worst case" settings of 89.75 and 90.25 degrees (and a few points in between) I measured only very minor amplitude (for which I could compensate!) and phase degradation in the performance of the Hilbert transformer due to these "straight line" approximations and called it good!

This method of phase adjustment is applied for both receive and transmit, but in practice it has been observed that far more amplitude adjustment is typically required than phase adjustment to effect optimal opposite-sideband rejection, at least if good-tolerance components - especially capacitors - are used in the receive and transmit paths!

  • On my mcHF transceiver I have typically require well under 1/10th of a degree of phase adjustment, so the available range of +/- 0.5 degrees is probably overkill!

What about transmit?

All of the above tricks could be applied to transmit, but thusfar, there has been no need to do any decimation/interpolation - just the Hilbert transformations, amplitude and phase adjustments, some audio processing and filtering - topics for later discussion.

For transmitting, since fewer operations need to be accomplished than in receive, everything still operates at 48 ksps with processing power to spare.  If it does become necessary in the future, I could decimate/interpolate within the transmit function and "regain" a significant number of CPU cycles!

How does the receiver sound "on the air"?

In tuning around with this receiver, the result of this processing - which is all done with floating-point arithmetic - is at least comparable to any of my other all-analog radios in terms of filter performance, adjacent channel rejection and opposite-sideband rejection:  Even under "contest" conditions with a very strong signal "next door" the receiver seems to be perfectly capable of holding its own!

While a few shortcuts had to be taken to reduce the amount of processing to an amount that could be handled by this radio, it does not seem to have demonstrably compromised its receive performance in actual, real-world conditions!

Next time:

Adding DSP noise reduction and automatic notch filtering.

Saturday, March 7, 2015

Using the "RTS.SDR" dongle (with HF upconverter) as found on Ebay

Some months ago I was perusing the wares of a seller on EvilBay and having decided to purchase one of those all-purpose component testers, I was tempting myself with other items on sale.  One of the items that I could not resist was the "RTL.SDR" that was billed as having an onboard frequency upconverter to allow HF operation, plus a more stable reference oscillator.

Figure 1: 
The EvilBay "RTL.SDR" with built-in upconverter
for HF reception.
According to the pictures on EvilBay, the units
currently sold host different picture, with
 a graphical representation of the schematic
diagram showing the mixer.
Click on the image for a larger version.
Stepping back for a moment, the "RTL" SDR dongles have been around for a few years, so-called because they typically contain as one of their active devices the Realtek RTL2832U.  These devices - costing roughly $10 (more or less) also contain a device (a Rafael Micro R820T in the case of the one pictured) with an onboard frequency synthesizer, I/Q mixer and (8 bit) A/D converter that allows one to receive signals from 50 MHz (or lower) to well above 700 MHz - sometimes way above 700 MHz, just using a computer with reasonable horsepower and FREE software!

While the thought of an 8 bit A/D converter might make it sound like these devices may be useless when connected to an antenna, the fact that they convert only a limited range of frequencies (approximately +/- 2.4 MHz at most) around the tuned frequency - plus the "oversampling" nature of the raw A/D sampling rate of the 8 bit converter means that relatively narrowband signals can have quite good ultimate quantization range.  What can suffer is when, within the sample-rate passband there are signals that range widely in signal strength:  Under such conditions it is recommended that one "finesse" the gain controls for optimum input signal levels to the A/D converter.

Perhaps the most popular software to do this is "SDR#" (a.k.a. "SDR-'Sharp'").  Easily found via a web search, this software is compatible with many software defined radio packages and it supports many modes and features, also offering many optional plug-ins.

These low-cost USB dongles were intended to allow the reception of digital TV and FM/Digital Audio broadcast (but not the sort of TV or digital audio broadcast that is used in North America) on a computer so they were designed to tune from something around the low-medium VHF range - say, 20's to 50's of MHz and up, almost completely leaving out the HF frequency bands.

Several schemes have been devised to allow the use of these handy devices to receive HF and these typically involve the use of some sort of upconverter to translate the HF frequencies from as low as the AM broadcast band up to a range that these devices will tune.

So, I soon found myself with the device pictured in Figure 1 in my hands.  Getting busy with life and other things, it was a few months before I got around to playing with it and while I quite easily got it working on the "UV" input which, on this particular unit tunes from just below 25 MHz to over 1 GHz (although I'm not sure exactly how far above 1 GHz...) but I was puzzled as to how to configure it operate at HF.

How to make it work on HF:

Back then, a web search didn't help as there was a plethora of hits on "RTL SDR Upconverter" so I removed the unit from its case and found the callsign "BA5SBA" on the board that you see in Figure 2 and got a hit with Google on a German page (this one - LINK - you may need to run it through a translator, so try THIS LINK which may or may not work...)  While this web page didn't describe exactly what I needed to do, it did provide enough clues to get it working!

  • More recently, the some of the sellers on EvilBay are including in their postings some basic instructions on how to get these devices to work on their "HF" ports, but what follows below contains more information - and is hopefully easier to find and more permanent - than an EvilBay posting!

Figure 2: 
Inside the BA5SBA "RTL.SDR" with the
built-in upconverter - the singly-balanced diode mixer
being located under the white blob in the foreground.
The jumper in the upper-left corner marked "A" and
"P" appears to be intended for putting 5 volts on
the "UV" antenna connector to power an external
RF amplifier.  ("A" = active, "P" = passive).
Click on the image for a larger version.
As I surmised from what can be seen in Figure 2 - and was verified by the German page listed above - the "HF" converter was simply a diode-ring mixer driven by the already-present 28.3 MHz reference oscillator on board the converter.  The output of the diode ring mixer was then connected to one of the inputs of the chip, so all I had to do was to figure out the offset frequency and how to access that input.

Using a signal generator set to 5 MHz I connected it to the "HF" input of the device and, just for kicks, tuned SDR# to 5.000 MHz as well.  After a bit of fiddling about, I finally found how to configure the unit to receive at HF.

  • STOP the SDR receiver first by hitting the square "stop" button at the top.
  • Bring up "RTL-SDR Controller" window (accessible by clicking on the "gear" symbol)
  • Under "Sampling Mode" set it to "Direct Sampling (Q Branch)".  Note:  You cannot change the sampling mode without first STOPPING the SDR.
  • Restart the SDR by pressing the "start" button (the right-pointing triangle resembling a "PLAY" button)

Once I had done this I saw the 5 MHz signal on the display!

  • By default, SDR# will set the "RF Gain" setting in this same "RTL-SDR Controller" window (see Figure 6) to minimum gain (all the way to the left.)  If you leave it there, the SDR dongle will be EXTREMELY DEAF when it is in the normal "Quadrature Sampling" mode.  When you have it in either "Direct Sampling" mode this control is disabled.
  • I would suggest checking the box that says "RTL AGC" and moving the RF Gain control in either "Quadrature Sampling" or "Direct Sampling" modes:  If you do not do this your receiver may be very deaf!
  • I experimented with using this device with the "HDSDR" program and found that at HF, its sensitivity was noticeably worse than that obtained when using it with SDR#.  I'm not sure why this might be, but it seems to have something to do with the way the "ExtIO" driver - or HDSDR itself - handled the internal gain settings of the dongle.
Figure 3: 
A screenshot of SDR# showing the configured "Shift" for the mixer.
Click on the image for a larger version.

Now I am very surprised that I can tune SDR# to "5.0" MHz and see the 5 MHz signal that I am inputting as the chip on this dongle should not function at that frequency!  What I expected to have to do was as follows as shown in Figure 3:
  • Knowing that the onboard mixer uses the 28.8 reference oscillator, check the "Shift" button on SDR#.
  • Enter a frequency of "-28800000" (yes, negative 28.8 million) into the box as shown in Figure 3.
  • Note:  There is a bug in some versions of SDR# that, if you are already tuned to a frequency lower than the "shift" frequency, the tuning may not work properly until one sets a much higher frequency with the 100 MHz digit and tunes back down.
  • Having done this, one need not mentally add the desired HF receive frequency to 28.8 MHz:  The receive frequency is simply input to the main frequency tuning as one would any other frequency!
  • If the 28.8 MHz frequency reference oscillator is somewhat off frequency one must first set the frequency using the "normal" VHF/UHF mode and calibrate it in the "RTL-SDR Controller" window and THEN, after switching to HF mode as described above, one can input a frequency that is slightly different from 28.8 MHz as needed to correct the offset.  I did not have to make any correction at all!
  • The 28.8 MHz reference oscillator supplied with this unit appears to be quite a good, stable TCXO and is only off a few PPM!
  • If you want to use the VHF/UHF input again, remember to reset the "Sampling Mode" back to "Quadrature Sampling" and UN-CHECK the "Shift" box that is visible in Figure 3.
Does it matter whether one uses the "0 MHz" method or the "-28.8 MHz" method with the offset?  Not really:  I could see no difference in the sensitivity of the SDR - but it is good to be aware of both methods just in case the "0 MHz" method doesn't work!

Comments on the design of the HF mixer and its limitations:

Sensitivity (or the lack of...)

Figure 4:
The low-pass filter in front of the mixer.
Click on the image for a larger version.
The very simple mixer on this SDR Dongle has its limitations, the first of which is that being entirely passive, the ultimate sensitivity at HF is not particularly good:  Using SSB (2400 Hz) bandwidth, signals down to around -90dBm were audible, but that was about it.  While this represents a signal of around 7 microvolts and may seem horrible (and it is, compared to modern HF receivers!) it should be remembered that if this is connected to anything resembling a full-sized HF antenna, it "hears" just fine since the background noise on HF bands - and thus the signals - will typically be above this level - at least on the "lower" bands of 10 MHz and below.

Because it does use a passive diode mixer it can take more signal and this means that if an amplifier is placed in front of it, it is not as likely to be overloaded as other upconverter designs for SDR dongles that use, say, an NE602!  This is probably a good thing since the converter chips in these devices are fairly easily overloaded, anyway!

Nyquist rules!

The other problem is that the local oscillator frequency is 28.8 MHz.  What this means is that there is a Nyquist limit of 14.4 MHz - and that means that any signal above 14.4 MHz will reappear again as an "image" at a lower frequency, approaching Zero Hz as it approached 28.8 MHz.  In other words, if you were tuned to 7.1 MHz in the 40 meter band, you would also hear a signal at 7.1 MHz below 28.8 MHz, or 21.7 MHz!  This also means that if you were trying to listen on 21.1 MHz in the 15 meter band, you would hear a signal at its 7.7 MHz image!  The situation is worse on 10 meters since the 28.8 MHz local oscillator is nearly in the middle of this band:  An FM signal on 29.5 MHz would also appear on 28.1 MHz!
Figure 5:
The response of the low-pass filter depicted in Figure 4.
The bandpass response is the solid line.
Click on the image for a larger version.

If you look at the circuit board in Figure 2 you'll notice several components in the foreground, namely a number of inductors and surface-mount capacitors, all with the values marked on the silkscreen.  Presuming that the values of these components are as-marked, I drew the schematic in LT Spice that is shown in Figure 4 and simulated it with the result in Figure 5.  As can be seen, this low-pass filter effectively blocks signals much above 40 MHz or so, offering more than 40 dB of attenuation above 60 MHz.

Other than keeping signals from low-band TV and FM broadcast out of the "HF" input, this filter does not help us at all in our image problem.  Because this filter does not block signals immediately above 28.8 MHz, we have another set of images that occur which means that a signal that is at 33.8 MHz - 5 MHz above 28.8 MHz - will also show up at 5 MHz! 

If there are no signals (or noise!) on these "image" frequencies, there should be no problem, but this is likely not to be the case during the daytime on a large wire antenna - which means that if you really want to use this dongle for serious HF reception, you need some sort of filter in front of it, either a separate Low Pass (below 14.4 MHz) and High Pass (above 14.4 MHz) to be used individually, or you could use a tunable preselector to pass only the frequencies of interest.  (There would be a problem with 10 and 20 meters as these bands are close to or include the Nyquist frequency!)

Possible modifications:

If you look at Figure 2 you'll note that there are several small "prototype" areas on the circuit board.  These are large enough to allow the construction of some simple circuits, namely a bit of additional gain (amplifiers, filters) to improve the sensitivity of the receiver.

As mentioned before another useful modification - one external to this box - would be the addition of a preselector to filter a narrower range of frequencies.

Is this upconverter useful as-is?

In general, yes, with a good antenna.  Despite its flaws, when one casually tunes around the HF bands using the built-in upconverter its problems do not immediately jump out, at least on the lower bands.

The biggest advantage of this particular SDR Dongle is that it seems to have quite a stable oscillator on board - much better than the $8 USB "stick" that I have experimented with previously:  This one seems to move only a few 100 Hz from cold start even at UHF frequencies whereas the very cheap ones seemed to move all over the place with temperature!

To be sure, one could probably get better HF performance by building (or buying) an upconverter for this sort of SDR that uses a much higher local oscillator frequency - say, 100 MHz -  but if one upconverts all of the HF frequencies en-masse, there are a few things that one must remember:
  • If you use a chip like the NE602, it may simply overload when connected to a full sized HF antenna unless you are prepared to add switchable attenuation to it and/or a preselector!
  • On a full-sized antenna, intercepting and converting the entire HF spectrum can represent quite a bit of signal energy.  If the HF upconverter that you are using does not, itself, overload, there is a good change the the converter chip in the RTL-SDR itself will overload with so much energy from such a wide variety of frequencies!  Remember:  The receiver chips in these dongles were intended to work with the relatively weak and sparse broadcast signals intercepted on small, indoor antennas, not the entirety of the HF spectrum when the bands are open!
Figure 6: 
The screen for configuring the dongle's
Click on the image for a larger version.

A few brief comments on using it at VHF/UHF:

Remembering to set it to the "Quadrature Sampling" mode when using the "U/V" input, there are a few things to know when using this device - and possibly others like it - with SDR#.

Clicking on the "gear" symbol will open a screen such as that depicted in Figure 6 that allows modification of settings related to the dongle's hardware.  In particular, note the check in the box for RTL AGC and the lack of a check in the Tuner AGC box:  The RTL AGC box is necessary in both the Quadrature Sampling mode to get the most gain out of the device.

The Tuner AGC box - which is only available when Quadrature Sampling mode is active - if checked, does not seem to work properly in the the version of driver and/or SDR# at the time of initial posting of this blog entry (March, 2015) as it seems to increase the gain too much, causing overload of the A/D converter and actually reducing performance - particularly if a decent antenna is connected!
Figure 7: 
 Top:  Properly adjusted RF gain setting
Bottom:  The degradation from too much RF gain!
Click on the image for a larger version.

Figure 7 demonstrates the problem.  The top half of the image shows an optimally adjusted amount of gain - a setting of 12.5 dB for this particular antenna (yours will vary!) while the bottom shows a gain setting of 37.0 dB.

Even though more signal is reaching the A/D converter in the bottom example, it is way too much and the converter is being badly overloaded, causing the noise floor to rise from below, submerging weaker signals!  If the RF gain is sett too low, degradation can also occur, but this time from too little signal.

The idea is to adjust the RF gain so that there is there is the maximum difference between the highest signal and the noise floor seen between stations - even if the absolute level of the signals may be lower, overall!


Friday, February 20, 2015

A "quiet" 5 volt USB car power supply

Several months ago (see the May, 2014 posting - "How USB car power adapters can ruin 2 meter mobile reception" - link)

In this post I wrote about those ubiquitous USB car power adapters that fit in a cigarette lighter and while these devices work well for power phones, GPS receivers and the like, they are terrible if you have any intention of listening on 2 meters while in your car - even if you are using an external antenna.

Unmodified, I found that the unit that I had in my car effectively reduced the sensitivity of my 2 meter transceiver - with its external, permanently-mounted antenna - by nearly 40dB.  To put that into other terms, a signal that was weak with this adapter turned off would have to be increased in signal strength by a factor of 10 thousand to sound the same when the adapter was plugged in with cables attached!

Figure 1: 
The completed USB car power adapter in the box.
Click on the image for a larger version.
Modifying the adapter as noted in the above link I managed to knock down garbage emitted from the adapter by 15-20 dB (a factor of 30-100) - a significant improvement - but when driving up some of the local canyons I found that repeaters that had been perfectly copyable along the entire route were no longer audible unless I unplugged the adapter.

Something had to be done!
I'd already done about as much
to the small cigarette-lighter USB adapter as I could, short of completely rebuilding it, but it was still too noisy.  The problem with this device was that of differential currents:  Between the input and output terminals of the device there were, on the circuit board, several amps of switching current floating around.

Even though there was a common "ground" shared between the input and output, this same "ground", consisting of just a few short and somewhat thin traces rather than a large, heavy and solid ground plan was suprisingly reactive at higher frequencies - such as those above a few 10's of MHz.  Even a very short length of circuit board trace can have a few 10's of nanoHenries of inductance, but if you are pushing amps of current and considering harmonic energy at 100+ MHz, you can soon see that these seemingly few nanoHenries can make what would seem like a "solid" ground plane act like the feedpoint of an antenna.  With the switching supply itself as the transmitter and the car wiring and the connected USB cables acting like the wires of a dipole antenna one can soon see where the interference was coming from!

Aside from having the voltage converter designed on a "proper" multilayer circuit board with very high quality components - not something that you'll get on a $5-$20 power adapter - the only other way to take care of the problem is to put the entire thing into a metal enclosure and filter/bypass all of the power leads going in and out.

Two approaches:

There are two approaches that I could have taken to accomplish this task.

 1)  Containing noise from the original adapter.

The easiest would have been to take the original USB power adapter and put it in a shielded enclosure and bypass all of the leads going in and out.  I would, of course, have lost the convenience of the small, self-contained device that plugged into the cigarette lighter, but I would have solved the problem.

The techniques described below could apply to filtering the original adapter, just as they did the approach that I ended up taking.

2)  Build another supply.

Figure 2:
The "DC to DC Converter Step-down Voltage LED Power Module 3A"
obtained from EvilBay.  (Ignore the slightly messy soldering - that
was the fault of myself and the often  "grainy" nature
of  lead-free solder!)
Click on the image for a larger version.
If you have been following this blog or read any of the other entries, you will not be surprised that I took this route - but I did not build it entirely from "scratch", but I went to EvilBay and found some inexpensive buck-type switching regulators for under $2 each and used them as a starting point:  I couldn't even get the components themselves for $2!

The devices that I found were described as "DC To DC Converter Buck Step-down Voltage LED Power Module 3A 12V To 5V 3.3V" (see Figure 2) and are based on the LM2576 switching regulator.  These also had a fixed 3.3 volt regulator on board, but I had no need for that so I left it in place, doing nothing with it.

It is important to note that a cheap, $2 switching regulator from EvilBay is not going to be any better than the original USB car adapter in terms of RF cleanliness and it may even be suspect in terms of reliability so a few things need to be done to the $2 board before it may be deemd to be reliable and useful.

The first things to consider are the capacitors on the cheap switching regulator boards:  They are not to be trusted!  This should be considered to be true of any cheap switching supply that you get on EvilBay!
Figure 3:
The inside of the converter showing the  components for filtering
and the two switching modules.
Click on the image for a larger version.
In any switching regulator one of the most important aspects of component selection is that of the quality of the capacitors:  They must be of the low ESR type, designed specifically for switching service and even more importantly, they must be of a known manufacturer, obtained from a reputable seller.

Upon inspection of these switching regulators I saw that the capacitors onboard were rated at 105C - a good sign - but I'd never heard of the maker.  Rather than removing the original capacitors, I simply paralleled them with 100uF low-ESR Nichicon units that I'd obtained from a reputable supplier (either Digi-Key or Mouser) and used a dab of RTV ("silicone") adhesive to secure them into position.  I would not recommend the use of "hot melt" (thermoset) glue for this:  It will be in a car - which will get hot and bounce around and they will break loose!  Putting these "good" capacitors in parallel would take a lot of the stress off the "unknown" capacitors on the board, prolonging their life.

Figure 4: 
A close-up of the added capacitors and the piece of copper added
for heat sinking and mounting of the regulator board.  As can be seen, a
small piece was added to help stiffen the right-angle board and
increase the heat conductivity.
Click on the image for a larger version.

The second thing to consider about these cheap switching regulator boards are their current/power ratings.

These units are rated at 3 amps output, and a quick check on the data sheet for the LM2576 indicated that this was about right.  Going on faith that the LM2576's on board were the genuine article - and not counterfeit devices - I put one of them on the bench supply and loaded the output to 3 amps and found that they held up fine, but that the heat-sinking - such as it was - was not adequate, at least if I were to put them inside a metal box with no air ventilation.

Fortunately, the solution was simple:  Add a bit of extra heat-sinking.

Using a bit of scrap copper, I constructed and then soldered an "L" bracket to the circuit board on the back side of the board, opposite to where the LM2576 was mounted.   This bit of copper would not only conduct heat away from the LM2576, to the aluminum body of the  die-cast box, but it also provides a very good local electrical "ground" connection for the board as well:  Figures 4 and 6 show details on this bracket.  When you solder this piece of copper to the board, be careful in the application of heat as you could easily "un-solder" the LM2576 from the other side:  I did this by accident on this board that you see in Figure 2 which explains the rather lumpy solder connections!

Filtering circuitry:

The schematic diagram in Figure 5, below, shows how the input and output filtering is connected.
Figure 5: 
Schematic diagram showing the filtering and interconnections.
The "5V/3A Buck Conv." are the voltage converter modules as described/modified.
Click on the image for a larger version.

How it works:

Referring to the diagram in Figure 5, above, L1, a 22uH inductor (the toroid in the upper-left corner of Figure 3, wound with red wire) offers impedance to RF that may ingress from outside and feedthrough capacitor FT1 shunts any remaining RF to ground.  L2 (the yellow-core toroid on the far left wound with reddish wire) blocks RF that may be present from the switching converters DC inputs, also allowing capacitor FT1 to do its job.  Capacitors C1 and C2 perform "bulk" filtering of high switching currents that may be present on the DC input lines, coming from the two DC-DC converters.

There are two identical DC-DC "buck" type converters and only the upper one will be discussed:

Inductor L3 (visible on the right side of Figure 3 on edge covered in heat-shrink tubing) blocks residual switching energy and RF that are on the DC line coming out of the switching converter and these are shunted to ground by FT2, a feedthrough capacitor and additional filtering is provided by C3.

As noted above, all of the electrolytic capacitors are of the "Low ESR" types and of well-known manufacturers (I use only Panasonic or Nichicon).  Again, when dealing with switching supplies, these special low-impedance capacitors are absolutely necessary in order for proper, long-term reliability and efficient operation of such power supplies and using any other type of capacitor will inevitably result in reduced operational lifetime and/or efficiency.

Figure 6: 
The back side of the switching regulator board showing the
added capacitors and the mounting bracket/heat sink.  The 100uF, low
ESR capacitors added to supplement the original capacitors
on the (cheap!) regulator board can be clearly seen, held in place
with RTV (silicone) adhesive.
Click on the image for a larger version.

Not mentioned in the above description are components R1, R2 and R3 which are self-resetting thermal fuses.  These typically look much like yellow disk ceramic capacitors (they may be either round or square) and when the current through them exceeds their ratings, they get hot (approximately 100C) and their internal resistance increases, effectively opening the circuit.  Unlike a fuse, when the current is removed they immediately cool down and return to their previous state and reset themselves.

These devices are inexpensive and have the obvious advantage of protecting their circuits like a fuse, but self-resetting after the fault has been cleared!

In the above circuit I happened to use "feedthrough" capacitors which may be seen on the metal barrier near the right edge of Figure 3 (the blue devices soldered into it).  While these devices are especially designed for passing DC and blocking RF, they are a bit difficult to find - but are not absolutely necessary.  Instead of feedthrough capacitors, good-quality "monolithic" multilayer capacitors could be used instead, soldered to the wires with very short leads as they pass by the solderable ground plate.

In looking at Figure 3 you will also notice that there are two metal barriers constructed of brass:  One in the upper-left corner, just above L2, and the more obvious one near the right side into which feedthrough capacitors FT2 and FT3 are soldered.  Perhaps a bit of overkill, these provide a (literal!) RF barrier into which the feedthrough capacitors are soldered,  Practically speaking, they provide a convenient place to which the important RF bypassing capacitors may be mounted to the aluminum box to which one cannot solder

Aspects of filtering - why this works:

It was noted earlier that the reason why the original USB power converter was so noisy was that there were many amps of switching currents floating around along the circuit board and even though it was "grounded" at DC, the fact that there was so much current and that the circuit board's traces had some inductance that was significant at VHF was the reason why it radiated badly!

In this circuit, we have taken pains to avoid the pitfalls that would cause it to radiate and if you take your own approach using your own switching converter - perhaps putting that USB power adapter that you already own into its own, shielded box, there are a few things to consider.

In this case, it is the combination of the box itself and the inductors and capacitors that work together to contain the switching energy within the confines of the ground plane of the interior of the box.  It is important to note that it is not the shielding of the box, per se that is the magic here, but the combination of chokes in the various leads and the "solid" ground plane which assures that the circulating currents stay between the input and output leads and do not appear across them where they can radiate.

Take, for example, the output inductors, L3/L4.  The job of an inductor is to resist the change of current so it will pass DC just fine, but it will block AC which means that any RF that gets out of the switcher will hit L3/L4, be blocked by it and whatever small amount of residual energy is left will get shunted to ground by FT2/FT3 and further filtered by C3/C4.

The point here is that on the output lead, L3/L4 will block the RF currents as they leave the switcher, breaking up the path for these currents on the output leads.  This not only prevents that energy from appearing on the output leads, but it also prevents any circulating currents between the input and output as well.

What about switching currents on the input lead?

This is handled by using a good quality capacitors for C1 and C2 which will shunt the vast majority of switching energy to ground.  Residual RF switching energy is then blocked by L2 and whatever little gets through is shunted to ground by FT1 and then there's yet another inductor, L1!

Sources of components:

I happen to have a pretty good junk box of components - particularly the toroidal inductors used.  If you don't have such inductors laying around, junked PC power supplies will likely have what you need in the form of toroidal inductors and small, solenoid-wound chokes wound on ferrite.

The values given (22uH, 47uH) are not at all critical:  Anything from 4.7uH to 100 uH would likely work fine as this range would be more than enough to choke off RFI - but the higher values (22uH and higher) would be somewhat preferable if you have an HF rig in your vehicle that might be bothered.  The most important rating on the chokes to consider is that they be wound with reasonably heavy wire - say #18 AWG or heavier:  If a couple of amps is pulled through the choke, you don't want it to drop more than a tenths of a volt at most!

As mentioned above, you really do need to get good quality electrolytic capacitors for this and I would recommend places like Digi-Key or Mouser in the U.S. and Panasonic or Nichicon brands. I would strongly suggest that when you go looking for capacitors that you get only those that have "low impedance" and/or "low ESR" in their specifications.  Another thing to look for is their temperature rating:  If they are only 85C, they are probably NOT low ESR or low impedance type.

The die-cast box is approximately 4-5/8" x 2-1/2" x 1-1/2" (12 x 6.5 x 3.75 cm) in size and I obtained it from Jameco Electronics, but similar boxes are readily available surplus and on EvilBay.  A suitable enclosure could be also be constructed using pieces of copper-clad circuit board material, and this would have the advantage of being able to solder directly to it, or one could use a much less-expensive folded aluminum "Bud" type utility box.  The important point is that internally, everything must be connected together on a very heavy, solid ground plane, preferably  without any mechanical joints in the box itself between those internal ground connections.

If you were to just put all of these same components into a plastic box and connect their common point grounds together with thin pieces of hookup wire, you would be risking having RF currents circulating along that thin piece of wire and there being differential voltage across it and having the problem, once again, of RFI escaping the switching regulators!  The only way to make a plastic box work for this sort of thing would be to construct a "box within a box" with the internal one being constructed of metal.

Getting the power out and connecting it to the devices in the car:

Up to this point nothing has been said about getting the power out of this box.

Since the female USB connector is ubiquitous, I decided that this was a good approach so I found some inexpensive "USB Extension cables" on either EvilBay or Amazon (I forget which) and when they arrived, I cut them up, using only rather short portion of the cable with the female USB cable to minimize voltage drop, verifying the power connections in the USB connector using an ohmmeter and a USB pinout diagram that I found on Wikipedia.

It should be mentioned that some devices, particularly cell phones of various brands, particularly those named after fruit, may require that the "data" lines be connected to resistors that "program" the charging current before they will accept a charge:  Not having one of those types of phones I connected nothing to the "D+" or "D-" lines and found that my Android phone charged normally - although it may be that it would charge faster if I would have connected those lines to resistors.  Some phones will pull several amps while charging, hence the use of a pair of 3 amp converter boards!  (e.g. one to run the GPS receiver in the car, the other to charge phones...)

Other devices simply connect to the female USB sockets as normal.

One of the devices powered by this box is my Garmin GPS receiver which has a "special" power cord:  If there is not a resistor across one of the pins of its mini USB connector it will search for a computer when it powers up, delaying its start up.  Since this resistor is built into its power cord I simply removed the cord from the original Garmin power adapter and connected it to the new power converter box and it was happy, booting up immediately, bypassing the check for the computer!

How well does it work?

One of the tests that I ran on this USB supply was to connect a 100 MHz oscilloscope to the input and output leads of the power supply.  With the sensitivity of the 'scope set to maximum I can see just a few millivolts of ripple from the LM2576 regulators, but this energy is confined only to the switching frequency of these devices and the first few harmonics.  Since it is at such a low level it is very unlikely that even if I were to power a sensitive receiver from this regulator that was tuned to the switching frequency that I would even be bothered by it!

The 'scope showed absolutely no evidence of switching energy at higher frequencies so I connected my FT-817 directly to the DC input and output of the supply via a 0.01uF blocking capacitor and only at the lower frequencies (say, 160 meters and lower) could I detect the harmonics of the switching regulators.  If I placed a wire connected to the FT-817's antenna port near one of the power wires going into/coming out of the box, I could hear nothing of it at all!

After all of this, it needn't really be said that this device is completely "clean" at 2 meters and 70cm as well as the FM broadcast band!

What I did hear a little bit of "grunge" from is one of the devices that I run from it (a gps-based dashcam) but breaking that device open and adding a small choke and capacitor on its DC input lead fixed that problem - but a couple of turns of the power lead through a ferrite core would have probably quashed this as well.

Final comments:

I could have used the above techniques to clean up the original cigarette-lighter USB power adapter, if I had:
  • Removed the circuit board from its case.
  • Put it in a metal box, grounding it firmly.
  • Supplied DC input power via the L/C (coil/capacitor) filtering as done above.
  • Filtered the DC output power via the L/C filtering as shown above.  I would not have been able to use the USB connectors of the original power adapter, directly, but rather I'd had to have wired in female USB connectors as was done above.
 It would have taken less effort, but it would probably have worked just as well!

Friday, January 30, 2015

Updated version of the "Simple" PWM LED/Laser modulator

A few years ago, for our friends in the Tucson area, I threw together a "simple" PWM circuit for audio modulation of high power LEDs (but it works just as well for laser pointers) for an optical transmitter - you can read about that here:

A "Simpler" Pulse-Width Modulator for LEDs, Lasers and whatnot and a simpler foam-core enclosure - link
Figure 1:
As-built prototype of the updated PWM transmitter designed to test both
 the AGC and manual gain/tone configurations.
There is currently no circuit board pattern:  If you design one,
please let me know!
Click on the image for a larger version.

As the page describes, this was intended to be comparatively simple and flexible in its operation, providing both modulation of both audio and test tones.  While it worked just fine, it did bother me a bit that it did not have a "manual" gain mode - that is, one could not simply override the audio AGC - which does work quite well - and "ride" the audio level manually, instead.

That was 2009 - so flash forward to 2014 when, at the request of some fellow amateurs in Australia, I finally got the impetus to update the firmware to add the means of selecting a completely manual gain control to the PWM circuit, of so-desired, in addition to various tone modes, all by setting pins on the PIC processor to the appropriate logic levels.  Of course, the original AGC audio mode is still present and may be used exactly as before, if one wishes, and one could even construct the circuit so that it could be switched between manual and AGC mode.

What it's for:

If you have ever been to the Modulatedlight.org web site link  (which I'll admit to having quite a lot to do with...) you will know that it has a lot to do with optical communications - mostly using high-power LEDs, but it also touches a bit on using low-power laser modules as well.

For modulating audio onto LEDs, onto LEDs, one of the easiest ways to do this is via linear current modulation, a process that is explained on the web page Linear Modulator for high-power LEDs - link.

Figure 2:
Examples of waveforms used to generate PWM signals,
from the web page "The Luxeon:  
New Light of Hope for Optical Communications"
by Chris Long

Another way that LEDs may be modulated is by turning them on and off in a manner that simulates linear modulation using a method called PWM, or Pulse Width Modulation - a system that is very easy to do using digital hardware such as counters and is often found in microcontrollers.

For laser diodes such as those found in laser pointers, current modulation is NOT very good for a number of reasons, including the fact that the brightness-current curves of laser diodes isn't particularly linear over a wide range, nor is it predictable at which current a diode will start to laser under a given set of conditions (e.g. temperature, age) or up to what current a specific diode can be safely operated!

For amplitude modulation, it is always preferable that one modulates as deeply as possible to achieve the best-possible signal-noise ratio and if one is trying to current-modulate a laser diode, this becomes problematic as the bounds of safe and reliable operation are difficult to know!  It is more convenient, then, to simply turn it on and off, operating it at a known, safe current when it is on and varying the duty cycle using PWM.

If the switching frequency of the PWM is sufficiently high it will be compatible with a "conventional" analog optical receiver that was intended for amplitude-modulated light sources as the PWM waveform will be integrated by the low-pass response of the receiver's front end.  At the very least, the PWM frequency must be at least twice that of the highest modulating frequency of the audio to be carried  and if necessary, a simple low-pass filter could be added to an existing receiver to remove any residual switching components - see Figure 2 for a pictorial of how a "slow", low-pass response can smooth out the PWM frequency components.

How it works:

Figure 3:
Diagram of the version with audio AGC.
Click on the diagram for a larger version.
This circuit uses a PIC12F683, an 8 pin microcontroller internally clocked at 8 MHz.  Using its PWM hardware, it generates a waveform with a clock rate of 31.25 kHz that is pulse-width modulated at a resolution of 8 bits - suitable for voice.

Audio can come from one of two places:  A built-in tone generator, or an external microphone/line-in audio source.

Using DDS techniques, audio sine waves can be generated at frequencies from a few 10's of Hz to several kHz and these are applied to the PWM generator, producing tones with 100% modulation depth.

Audio from the microphone or line input is first amplified and then low-pass filtered to remove high-frequency content and applied to the 10 bit A/D input of processor where it is digitized at a rate of 31.25 kHz and also passed to the PWM output.

"AGC" mode:

In diagram depicted in Figure 3, the circuit is configured to use an audio AGC to assure that the modulation is kept at a consistently-high level.  The audio level is monitored continuously to determine if its level is within 6 dB of clipping.  If it exceeds that level, a counter is incremented, but if it does not, a counter is allowed to self-decrement.  If the counter exceeds a pre-set value indicating that the audio level has been high recently, the processor pins that control the gain on the amplifier stage are adjusted to reduce the gain to the next, lower step.  If the counter self-decrements below a pre-set value indicating that the audio level has been consistently low, the gain is adjusted to increment.

There is also a built-in 12 dB gain adjustment in software:  If the audio has been low and the audio gain is near maximum, a 12 dB gain step can be switched in which is done by first limiting the A/D values in software to ostensible 8 bit values and then shifting the A/D data to the left by two bits and offsetting.

When switched to the "tone" mode, instead of audio being applied to the A/D input, the voltage from potentiometer R220 is applied instead allowing a variable voltage to be used to set the tone mode:
  • <=0.5 volts:  1 kHz tone
  • >0.5 to < 4.5 volts:  Variable frequency audio tone
  • >= 4.5 volts:  Tone sequence
Having a fixed 1 kHz tone is useful if using a computer or other device when setting up end-to-end alignment of an optical path as narrow detection bandwidths may be employed to maximize the overall sensitivity of the detection scheme.  Because this PIC's oscillator is not crystal-based, the actual frequency can vary by several percent, but it should be easily spotted with spectral analysis programs such as "Spectrum Lab" by DL4YHF, Spectran or Argo (to name but a few).

In the variable tone mode the frequency may be set from a few 10's of Hz (below mains frequency) to a bit over 2 kHz as desired.  Finally, the "tone sequence" mode is designed to emit a musically-dissonant series of notes (C4, E5#, F4#, E6) that really stick out of the noise:  By being dissonant, spanning over an octave and non-continuous they avoid "ear fatigue" and are more likely to be heard amongst other sounds that may be being heard from power mains and electric signage that might be intercepted.

Manual gain mode:
Figure 4:
The version with manual gain control
Click on the image for a larger version.

While the audio AGC works quite well to assure that ones voice fully modulates the LED to maximize "talk power" and signal-to-noise ratio, one may prefer to have a manual gain control instead and manipulation of several of the pins on the processor allows the selection of that mode as depicted in Figure 4.

In this version the audio gain is set with R309, but one can effect a "software" gain setting two switch in an extra 12 dB of gain via appropriate strapping of pin GP4.  As with the "AGC" version, there a variable "tone" mode is available but there are also some "fixed" tone modes that may be selected via appropriate strapping of pins GP3, GP4 and GP5 if you don't wish to use a potentiometer.

Minimalist version:
Figure 5:
Minimalist version.
Click on the image for a larger version.

Finally, Figure 5 depicts a somewhat minimal approach to the circuit, using only a single op-amp section with no active low-pass filter, manual gain control and the optional selection of a tone mode if you choose to implement switch SW301.

At its very simplest, one would connect GP3 (pin 4) to the +5 volt line to put the PIC into audio mode all of the time, but the triviality of adding just one SPST switch and a resistor would provide the facility of a tone generator, doing so would be hard to resist!

Getting the code:

If you are interested in building a modulator for an LED or laser using this device and are interested in the .HEX file for programming the PIC yourself, please let me know.  If you don't have a way to program the PIC and want a pre-programmed device, I can arrange that, too.

Tuesday, January 27, 2015

Update on the mcHF transceiver - Adding features to the original code

For an follow-up article, see this link.

It has been a few months since I have posted anything on the mcHF transceiver  (my previous post may be found here - link) so unless you have been following the mcHF Yahoo group (link - membership required) you would be forgiven for thinking that I had abandoned work on it.

Figure 1:
The mcHF transceiver in operation, showing signals on 10 meters.
Click on the image for a larger version
Quite the contrary, a lot of features have been added to the code, starting with the fine foundation written by Chris, M0NKA based on version 0.0.181.  Considering that he pulled the disparate pieces together pretty much single-handedly, it is quite amazing what was there when I started!

Of course, this is open-source and the whole idea behind it is to allow multiple contributors:  It would be the height of hubris to think that just one person had a monopoly on good ideas, let alone the time to implement a fraction of them, so a group effort is key here.  Even if the majority of the group does not actually contribute directly to writing code, getting user-feedback is absolutely vital to knowing if one is going down the proper path and the detection and fixing of the inevitable bugs that creep in when work is done!

What is the mcHF?

I've had a few people ask me about this transceiver, wondering what it is, some apparently under the mistaken impression that it connects to a computer somehow like many SDR products.

This is, in fact, a completely stand-alone SDR transceiver capable of operating on all bands from 80 through 10 meters. *

RF goes in/out through a BNC connector, DC is applied, one listens to audio on a speaker or headphone, and "talks" with a microphone or an attached CW key/paddle/bug.  If so-desired, you can even connect it to a computer (or smart phone) and run some "sound card" digital modes like PSK31, RTTY, Olivia, WSPR, DV2 or SSTV if you like via its Line in/Line out jacks. **

The "heart" of this transceiver is the ARM Cortex M4 processor (made by ST) running at something under 200 MHz, a reasonably-powerful device, but not super powerful, which makes for some interesting challenges when one is trying to squeeze in various features - more on that in later posts.

* 160 meters is possible too, with just a bit of "hacking" - maybe just as simple as adding an outboard 160 meter low-pass filter.
** Because it is an SDR it should, in theory, be possible for the mcHF to run some digital modes stand-alone as well, but there is the problem of "too many desired features and too little time"!

Why did I do this?

You might think that I started this project knowing all about SDR and DSP.

You would be wrong.

The reason that I tackled this project was that I DID NOT  know all that much about SDR and DSP.  To be honest, I do have a programming and electronics background (but almost entirely self-taught) and I "knew" how SDR radios and DSP worked at the high level, but I'd really never gotten my hands dirty - so this was my chance to get myself drenched, not just my feet!

Not having worked with the Cortex M4 processor before or the CooCox programming environment, but being familiar with the "C" programming language in general (I've used it for many years in programming PICs and other things) I found Chris' source code to be fairly easy to follow, fairly well documented, and the programming software pretty easy to use and I was soon able compile my own code successfully - so I started adding features.

In the next few posts I'll describe the "behind the scenes" of a few of the features that I added.

* * * * *

Adding features - AGC:

As it happened, just as I got started with this project, Chris had other obligations that diverted his attention for a while, but he was happy to see progress being made:  He did make it open source, after all!

The first major change that I made was the implementation of an AGC in the receiver - something that had been missing from the beginning.

Admittedly, I had no pre-conceived notion as to how to do this in code and I purposely did not look at other open-source implementations, but since I knew exactly how an AGC circuit worked, so I simply wrote some code that emulated the rapid charging of a capacitor in the presence of a signal and the slow discharge in its absence and adjusted the "gain" of the audio path in the process simply by multiplying the "live" audio by the floating point number on-the-fly.

In a nutshell, it works like this.

In a loop, operating on each audio sample:
  • Take the absolute value of the pre-AGC, post-filter audio signal.
  • Multiply it by the current AGC value.
  • If the resulting value is above the AGC "knee" value, reduce the AGC value quickly (e.g. the AGC "attack") by an amount proportional to the current AGC value, but if it is below the AGC "knee" (e.g. the AGC "decay") increase the AGC value comparatively slowly by a proportional amount.   The rate of the "decay" is the AGC "hang" time.
  • Enforce limits to minimum and maximum AGC values.
  • Multiply the audio signal by the AGC value.
  • Use the linear AGC value to calculate the logarithmic S-Meter reading.

To my amazement, it actually worked the first time!

As often happens, tweaking the software leads to tweaking the hardware - which leads back to more tweaking the software.  Originally there had been an N-channel JFET across the RF signal path ("Q2" on the RF board) to provide a manual attenuation control.  The problem was that, due to an oversight it was not possible to completely bias this JFET to an OFF state as there was no way to apply a negative gate bias, so it was always causing a bit of signal attenuation (typically 6 dB) even when the attenuation control (and gate voltage) was set to "zero."

I'd also noticed that, while tuning around the bands, particularly 40 and 80, that some strong signals would cause terrible distortion so I put the transceiver on my service monitor and observed that its receiver would overload badly, with clipping of the A/D converter occurring at around -55dBm!


This transceiver uses a Wolfson WP8371 (which is very similar to the pin-compatible TI TLV320AIC23) which contains both a 16 stereo A/D and D/A converters.  In receive mode, the A/D converter takes the quadrature I and Q channels from the receive mixers and digitizes them, sends them to the MCU (processor) and then the D/A converter produces the receive audio.  In transmit, the A/D converter takes the transmit audio which is processed by the MCU and the I and Q channels are sent out via the D/A converter to the transmit mixers.

Upon inspecting the code I noted that the internal gain control of the codec was set to maximum which made me wonder if I could extend the dynamic range of the receiver with the codec's own gain control.

A bit of quick experimentation showed that by setting the codec gain to minimum the signal overload point of the receiver was raised from about -55dBm to around -19dBm - a significant improvement!

Note:  This "overload" level applied to signals within the A/D passband, +/- 24 kHz of center.  The "overload" level of signals beyond this range was approximately -5 dBm or so, the level at which the mixer, RF amplifiers and operational amplifiers started to compress/clip.  This was possible due to hardware-based "brick-wall" filtering within the codec chip that removed out-of-band signals beyond this +/- 24 kHz range.

A bit more "hacking" at the code yielded the final result - an additional "AGC" loop wrapped around the main AGC loop:

  • The output of the A/D converter is monitored.  If the output exceeds 1/8th full-scale, the codec gain is reduced by one "step" ("several" dB) immediately.  At this same instant other places in the receive signal chain (e.g. audio, S-meter) are rescaled by the same amount to compensate.
  • If the output of the A/D converter never exceeds 1/8th full scale for "a little while" the gain is increased by one step, which is to say that when the strong signals disappear, the gain reduction is removed relatively slowly.
  • If the output of the A/D converter is higher than 1/4 full scale, the bottom portion of the S-meter scale - which is normally white - is displayed in red to indicate a possible overload condition.  This does not indicate a malfunction, but is mostly for informational purposes and it could be useful if one decides to override the "Automatic" codec gain control and use the "manual" codec gain control instead.
The upshot of the above is that on a "busy" band with strong signals one will occasionally see the bottom portion of the S-meter flash red, but it is extremely rare for the receiver to overload.  Even though reducing the gain of the A/D converter does reduce the ultimate sensitivity of the receiver, in practice this is almost never noticed since, on a very busy band where there are very strong signals, one would probably not "miss" an S-unit or two of sensitivity at the bottom end of sensitivity, anyway!  In other words, we are more prudently using our limited, available dynamic range!

This also meant that by changing the code and taking advantage of the hardware gain control built into the codec, the "iffy" JFET attenuator circuit could be completely eliminated as this new method of "attenuation" was much more effective, anyway!

The next time I write about the mcHF:  Implementing audio filters and fractional I/Q phase adjustments with limited processor horsepower - follow this LINK.

Wednesday, December 24, 2014

Noisy fan on my Owon DS7102V Digital Oscilloscope

A bit over two years ago I got one of those inexpensive, Chinese-made digital oscilloscopes to supplement my old, trusty (and still working!) Tektronix 465B analog scope.  While the old analog scope is still my "Go To" scope since it is much easier to use in most situations, there are quite a few instances where just being able to throw some cursors and lines on the screen to quickly measure and monitor various parameters - and then save the results to a USB memory stick - is just "nice"!

I chose the Owon over the Rigol, the more popular scope at the time with similar ratings and for about the same price because:
  • The Owon has a 10 Meg sample memory depth, meaning that even though you might be operating at audio rates, you can still be sampling at many MHz!
  • It had a much larger screen than the then-comparable Rigol with much better resolution.
  • The other folks that reviewed it said that although there were fewer firmware updates available, they weren't really needed since there weren't any known, serious bugs.
  • They guy at Saelig offered it to me for the same price as the Rigol, including some accessories that would have cost extra with the Rigol!
So, I've been happily using this 'scope for a few years now, preferring its lower mass and bulk when taking it portable and occasionally taking advantage of its ability to store the scope image (and even the memory buffer) to a USB memory stick - or even via an ethernet connection.  Another interesting feature that has occasionally come in handy its its VGA output connector allowing the screen to be directed to a much larger monitor at the same time as the built-in monitor is active - something that I've occasionally used at Ham Club meetings to to demonstrate something using an overhead projector.
Figure 1:
Two of the four black screws to be removed.
There are two more on the other size, one deeply recessed
as well as the large, silver ground screw.
Click on the image for a larger version.

About 6 months ago I noticed something odd:  Occasionally, when I would turn it on, I would hear the fan screech.  I soon realized that this happened only when it was cold and (apparently) the lubrication in the fan was likely a bit thick.  If I let it screech for a minute, turned it off and then back on, everything would be fine - but it was getting to be increasingly annoying.

I finally decided to do something about it, knowing that it would require disassembling the unit.

First, some warnings:
  • You may be voiding any warrantees that the unit may have by doing this!
  • This unit contains potentially dangerous/fatal high voltages!  You must disconnect it from the mains before servicing.
  • If you do not have a modicum of experience in working on electronic devices, do not work on one of these!  (If you own an oscilloscope in the first place I would guess that you'd know something, though!)
  • Take necessary precautions to minimize static buildup as there are static-sensitive components that could be destroyed if excess voltage is applied!
  • You risk breaking something and/or damaging yourself:  If you undertake this task you agree to accept all risks in doing so!
  • Work in a clean, well-lit area with a soft cloth on which to place the oscilloscope face-down and a container to store screws, noting the different sizes and types (and their locations!) as you remove them.
  • Figure 2:
    Location of the two tabs on the bottom of the unit.
    One must press on the white plastic to release these tabs.
    Click on the image for a larger version.
  • Your mileage may vary!

Having gotten that out of the way, let's get on with it.

Getting it apart:

Getting the back off is slightly tricky, but not bad if you know the secrets:
  • Remove the four black screws, two on each side.  These have small washers with them that you should not lose!  One of these screws is deeply recessed, so a fairly long, thin screwdriver is needed to remove it.
  • Remove the large, silver ground screw from the back of the unit.
Figure 3:
Location of the single tab on the top of the unit.
Press on the white plastic in the location of the tab
to release it.
Click on the image for a larger version.

Once you have removed the five screws from the back, the case will still not come apart so you must now press in just the right places to release the tabs as the pictures indicate.

Figure 4:
The power supply and the attaching wires.
The ground wire unplugs from the socket on the rear
cover while the mains wires unplug from the power supply.
Click on the image for a larger version.
On the bottom, there are TWO tabs that must be released in order to separate the front from the rear of the unit.  To do this, press firmly on the white plastic front while prying apart the side closest to that tab and the two halves should come apart.  This is done again for the other tab on the bottom and for the single tab in the middle, on the top.

Once you have the tabs released, carefully work the rear cover past the power switch, noting that it is tethered to the power supply board with several wire.  Carefully unplug the yellow/green ground wire from the plug on the rear cover and then gently but firmly pull the AC mains connector from the main board, rocking it back and forth, prying slightly on connector's tab if necessary.

Once you have disconnected these wires, set the rear cover aside in a safe place.

Now it will be necessary to remove the power supply.
Figure 5:
The screw location for the power transistor.
This screw, along with the four in the corner, hold
the power supply board into place.
Click on the image for a larger version.
  • It is possible that this power supply has capacitors on it that are charged to dangerous/lethal voltages, even when powered off.
  • Do not touch anything on the back side of the power supply board or set it on a conductive surface!
  • Note from Figure 4 which screw has the ground wire connected to it! 
First, disconnect the other power cables that connect from the power supply board to the other boards.  Now, locate the four screws in the corners of the power supply and carefully remove them, noting that they are coarse-threaded screws that go directly into the plastic.

Once the four corner screws are removed locate the hole in the power supply board and note that there is a screw that fastens a power transistor to the metal structure for heat-sinking.  Using a (preferably) magnetic screwdriver, remove this screw, keeping track of any washer with it.  At this point you should be able to lift the power supply board free and set it aside on a non-conductive surface such as a piece of paper or cardboard.

Figure 6:
The display interface board being removed.
Note that the other two wires have been removed - plus
the orange/brown cable from the front panel display.
Click on the image for a larger version.
Now, the display/driver board must be removed - this being the blue board that was partially under the power supply board and the reason that we needed to remove the power supply in the first place.   First locate the brown/orange cable at the end of the board that goes to the main display panel and note how much of the gold-plated conductor from the cable is visible while it is plugged in to the connector!  Remember this as it will be helpful to know when you plug the cable back in!

This connector is white with a black or brown release tab.  To release this cable, this tab slides away from the board (along the cable) evenly by only a millimeter or two while still being connected to the socket, preferably using one's fingernails rather than metal tools:  You should gently work each side of the black/brown release catch until it is at the end of its travel, noting that when you push on one side, the other side will move back slightly.  Once this tab is released the cable should be easy to pull out with very slight force:  If you have to pull on it very hard at all, the tab is not properly released!
  • Be very careful with this release tab and cable as both are easily broken if excessive force is applied!  This release tab does not separate from the connector.
Once the cable for the display is disconnected, carefully unplug the two other cables connecting to the board noting that some of them have release tabs.
Figure 7:
Shield cover with BNC connector.  The large plastic
shield must be removed from the connector along with
machine screws that hold this cover into place.
Click on the image for a larger version.

At this point the four small screws holding the board in place may be removed and once this is done the board may be unplugged from the side-mounted connector that connects it to the rest of the circuitry.  This board should be set aside in a safe location, observing anti-static precautions.

Now, locate the shield portion with fan and the "Trigger" BNC connector and remove the black plastic shroud around it.  On this shield, locate the other screws that hold it in place to the stand-offs to the board below and remove those screws, noting that they are machine screws!

At this point you should now be able to remove the large metal shield with the fan attached, noting how the cable from the front panel is routed through the hole.  As you lift it, you will be able to remove the power connector for the fan from the main board by firmly pulling on it and rocking.  Be very careful for other impediments for removing this cover - just in case I forgot something in these instructions!
Figure 8:
The original fan.  I chose to re-lubricate this fan with
a PTFE-based oil, but now that I have a picture of it I
should be able to cross-reference it and order a new
fan ahead of time should is start to make noise again!
Click on the image for a new version.

You should now have the fan sitting in front of you.  As it turns out, I didn't a replacement for the particilar fan that was used, but having had experience with these sleeve bearing fans before I knew that if the bearings were in reasonable shape (e.g. not "cooked") then it was perfectly reasonable to replenish the original lubricant.

To inspect the sleeve bearings slip a small, clean (de-greased) screwdriver under the label where the wires emerge from the fan and pry up, carefully pulling off the label.  Under this, in the center, you will see the end of the sleeve bearing and if you see "wet" oil rather than what looks like bits of tar, the sleeve bearings are likely to be in good shape.

At this point I soaked up as much of the original oil as I could with a paper towel and then dripped one drop of PTFE ("Teflon" tm) lubricant as a replacement, the brand being visible from the picture.

Figure 9:
The fan and the supplementing lubricant, a PTFE-based oil.
Click on the image for a larger version.
Over the past several years I have had good luck the above technique:  Usually, it is done to "resurrect" a fan for long enough time to get a brand new one ordered and on its way, but I have, on several occasions, forgotten that I have done this to a completely seized-up fan after cleaning out the gooey remnants of the original oil and realized, after a year or two, that it was still running fine:  Not the ideal thing to do, but good to know if you are in a pinch - or are really cheap!

Once the single drop of PTFE oil was added - be sure to completely clean up any that was spilled on the surrounding plastic using alcohol - re-attach the label if it came of "cleanly" - that is, if you were able to remove it without leaving any of its adhesive behind.  If parts of the label and/or its adhesive did come off when you removed it, use some "invisible" tape to cover the hole, but be sure to tape the original label of the fan to the outside of the metal shield where you can see it when you take off the cover so that you could, if need be, cross-reference it and get a new one!

Once the fan has been relubricated it is time to reassemble the oscilloscope, and as they say "Reassembly is the reverse of disassembly:  Please refer to the steps above - and your notes - when putting it back together.

A few points to remember:
Figure 10:
The ground stud:  Note that it must be aligned so that it is
flush with the back panel or else it will not go on!
Click on the image for a larger version.
  • The machine screws that hold the metal cover into place.
  • The plastic piece around the BNC connector.
  • When plugging in the display interface board, make sure that the connector properly aligns with the main board:  If it doesn't seem to fit, it isn't plugged in correctly!
  • The small screws that hold the display board into place.
  • The two cables that plug into the display board - one for the back light and the other from the front-panel buttons.
  • The LCD panel cable:  Be sure that you release the black/brown part of the connector before trying to insert the cable.  Once the cable is pushed in all of the way, re-seat the black/brown lock.
  • Re-install the power supply:  Put in the four corner screws first, then the screw that holds down the power transistor, remembering to install the ground wire.  Refer the the picture, above, if you need to be reminded as to where the ground wire attaches to the power supply.
  • Make sure that all cables are reconnected!
  • Reconnect the power and ground wires to/from the rear cover.
  • Making sure that no wires are pinched, place the rear cover into place, carefully working your way around the power button.
  • Note that you need to carefully align the BNC connector and ground screw stud to the back panel.  Note that the ground stud actually protrudes into the back panel and is flush with it and that the rear panel cannot be properly installed until this is done!
  • Carefully engage all three snaps.
  • Reinstall the four long, black screws with their small washers.
  • Reinstall the large, silver ground screw.
  • You are done with reassembly!

If all has gone well the fan will now be quiet.

One final recommendation:  Turn the oscilloscope on and let it run face up for an hour or so so that it gets warm and then shut it off, leaving it face up while it cools down.  This will allow the new PTFE-based lubricant to permeate the sleeve bearings within the fan, particularly as it cools and the lubricant withdraws back into the sintered bronze sleeve bearings themselves.

If the fan becomes noisy again (or is still noisy) you will now be able to cross-reference the original fan with a new one and know how to install it.  If you do get a new fan, it would be best to get one that is specifically designated as having ball bearings and/or from a well-known brand so that you don't have to replace it again!

For your convenience, the general specifications of the original fan are as follows:
  • Size:  60x60x10mm
  • 12 Volt, 0.15 Amp
  • Noise:  27-29dBA
  • Speed:  3600-4700RPM
  • Air Flow:  11.4-16.5 CFM
Some suitable replacements using ball bearings are:

Digikey:  603-1407-ND  (Delta model number EFB0612MA)
Mouser:  664-AD0612MX-G76T-LF  (ADDA model number AD0612MX-G76(T)-LF)

Other fans may be found with sleeve bearings, etc. and any of them should work in a pinch.  Since this 'scope does not run particularly warm, picking one with somewhat less air flow would probably not be a "show stopper", particularly if it isn't used in very warm environments.

Best of luck!