[hpsdr] exact frequency determination

John Marvin jm-hpsdr at themarvins.org
Thu Nov 21 01:13:12 PST 2013


OK, I made some mistakes in my last posting. The left shift should have 
been 25 bits, not 32 (I got fooled by a bad comment in the code). I was 
also wrong about an additional (very small) error being introduced by 
the rounding off of the constant used for the integer multiply. I was 
looking more closely at the algorithm in order to determine the maximum 
and minimum errors, and realized my mistakes. So, let me start over, 
rather than trying to correct my previous statements:

The formula used for computing the phase word is:

     Frequency (in Hz) * 2^32 / 122880000

This can be reduced to:

     Frequency * 2^16 / 1875

In order to preserve accuracy while doing integer math we shift 
everything to the left 25 bits, use a nearby integer constant for the 
multiply and then shift the result back 25 bits:

     (Frequency * 2^41 / 1875) >> 25

2^41 / 1875 is 1172812402.96106666.... . We round that up to 1172812403. 
So the equation becomes:

     (Frequency * 1172812403) >> 25

Since we are multiplying by a constant slightly higher than 2^41 / 1875 
we'll get a number slightly higher than the desired result, but we lose 
that additional amount when we shift the result by 25 bits.  Since the 
primary error is due to the integer truncation, this slight addition 
actually helps shift the error range downwards a tiny bit. In the case 
of frequencies that divide evenly by 1875, the additional error 
introduced by rounding up the integer constant won't accumulate into the 
25th bit until we reach a frequency of approximately 862 Mhz, which is 
much higher than the highest frequency the current HPSDR boards support. 
So there is no additional error introduced by this rounding, which means 
that frequencies that evenly divide by 1875 Hz are "perfect" and the 
lower bound on the error caused by the integer truncation of the 
resulting computation is 0.

What is the upper bound of the error? The upper bound would be when the 
formula would result in a phase word of X.999999999..... which then got 
truncated to X. So rounding the .999999999.... to 1, the maximum error 
is 1 unit in the phase word. Working backwards we get (1 x 1875 / 2^16), 
which is approximately .02861 Hz or 28.61 mHz. It's actually a tiny bit 
less than that due to the rounded constant used above, which would push 
values that were slightly under a whole unit just over to the next 
integer value. If we cared we could cut the maximum error in half, 
shifting the error range from 0-~28.61 mHz to  +/- ~14.31 mHz by adding 
another constant (2^40/1875 = ~586406201) after doing the multiply but 
before doing the 25 bit left shift (actually done as a bit selection in 
the code). Probably most people wouldn't care!

Hopefully I got it right this time :)

Regards,

John
AC0ZG

On 11/20/2013 5:57 PM, John Marvin wrote:
> ***** High Performance Software Defined Radio Discussion List *****
>
>
>
> Brian,
>
> The formula that is used in theory is:
>
>     (Frequency * 2^57/122880000) >> 32
>
> If you reduce that it becomes:
>
>     (Frequency * 2^41/1875) >> 32
>
> So, theoretically any frequency that is evenly divided by 1875 would 
> be  a "perfect" frequency. I use that rule when setting frequencies 
> for the FMT.
>
> However, in practice, the fpga uses integer math. 2^41/1875 is:
>
>     1172812402.961066666....
>
> The fpga code rounds this to 1172812403 and uses that constant for the 
> computation. So the actual formula used in the FPGA is:
>
>     (Frequency * 1172812403) >> 32
>
> Therefore there is always some error, however it is minimized at 
> frequencies that are evenly divided by 1875. In those cases I believe 
> the error is less than .1 mHz.
>
> This information should probably be put on the HPSDR wiki someplace.
>
> Regards,
>
> John
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openhpsdr.org/pipermail/hpsdr-openhpsdr.org/attachments/20131121/c5883fd4/attachment-0004.htm>


More information about the Hpsdr mailing list