Electronics > Projects, Designs, and Technical Stuff
Signal processing - getting exact frequency from short ADC sample
<< < (4/18) > >>
coppice:

--- Quote from: David Hess on December 14, 2019, 03:09:02 am ---
--- Quote from: coppice on December 14, 2019, 03:04:26 am ---You can get the exact frequency of any pure sine wave using 3 perfect samples - i.e. no amplitude noise, no timing noise (i.e. timing jitter), and masses of resolution. The snag comes when you realise how incredibly sensitive to noise the three sample approach really is.
--- End quote ---

Sampling noise is not bandwidth limited so it causes aliasing making the solution indeterminate.  If you use all of the samples, then the noise is integrated out increasing accuracy.

--- End quote ---
I didn't say the three sample approach was the most practical. However, it is widely used in things like speech analysis. See the Teager Kaiser Energy Operator (TKEO).
David Hess:

--- Quote from: coppice on December 14, 2019, 03:16:20 am ---I didn't say the three sample approach was the most practical. However, it is widely used in things like speech analysis. See the Teager Kaiser Energy Operator (TKEO).
--- End quote ---

I just meant to point out the type of algorithm to use.  In the analog domain it was common to phase lock a clean reference signal to the signal to be measured and then measure the clean reference signal at only a few points.  The continuous phase comparison did the integration.  But that is not feasible for burst measurements.
nfmax:
Another approach might be to use an FFT and Hilbert transform to construct the (complex) analytic signal. Since your pulse is fairly narrow-band, the argument of this is a good approximation to the phase of the original. After unwrapping it, fit a straight line to the phase (possibly with some weighting based on amplitude or SNR, and down weighting the end regions). The slope of the fitted line is the frequency estimate.

Choice of windows and weighting functions may be important. You can also try fitting a higher order polynomial, and using its linear term as your estimate.

I have used this technique to analyse optical interferograms. The SNR was high, but we needed very high 'frequency' (actually fringe spacing) resolution.
Kleinstein:
With just 200 samples I would go for the brute force least squares fit. This is rather close to the best possible suppression of noise. So the main weakness to worry about it the computational effort.  Writing the "sine" function to fit not at  A*sin(wt+phi) but as A1*sin(wt)+A2*cos(wt) the least square fit can be linearized quite well. So it does not need many iterations (maybe 2 or 3) if the starting point is good.

It kind of depends on the HW used. An a PC and for tests one could use the fitting function of a plotting program or math-lab. So one could try with real data sets what to expect.

Chances are a 100 MHz ARM based µC could to the math as fast as the data are coming in. For a similar task I reached that point with a 60 MHz Pentium CPU and a not very efficient program.
hamster_nz:
Made some bogus data, with an amplitude of +/- 75% at 10,000.0 Hz and 10,000.1 Hz. You can draw your own conclusions:

With 12-bit resolution:

--- Code: --- -99,    632,    633
 -98,   1203,   1203
 -97,   1656,   1656
 -96,   1946,   1947
 -95,   2047,   2046
 -94,   1946,   1946
 -93,   1656,   1655
 -92,   1203,   1202
 -91,    632,    632
 -90,      0,      0
 -89,   -632,   -633
 -88,  -1203,  -1203
 -87,  -1656,  -1656
 -86,  -1946,  -1946
 -85,  -2047,  -2046
 -84,  -1946,  -1946
 -83,  -1656,  -1655
 -82,  -1203,  -1202
 -81,   -632,   -632
 -80,      0,      0
 -79,    632,    633
 -78,   1203,   1203
 -77,   1656,   1656
 -76,   1946,   1946
 -75,   2047,   2046
 -74,   1946,   1946
 -73,   1656,   1655
 -72,   1203,   1202
 -71,    632,    632
 -70,      0,      0
 -69,   -632,   -632
 -68,  -1203,  -1203
 -67,  -1656,  -1656
 -66,  -1946,  -1946
 -65,  -2047,  -2046
 -64,  -1946,  -1946
 -63,  -1656,  -1655
 -62,  -1203,  -1202
 -61,   -632,   -632
 -60,      0,      0
 -59,    632,    632
 -58,   1203,   1203
 -57,   1656,   1656
 -56,   1946,   1946
 -55,   2047,   2046
 -54,   1946,   1946
 -53,   1656,   1655
 -52,   1203,   1202
 -51,    632,    632
 -50,      0,      0
 -49,   -632,   -632
 -48,  -1203,  -1203
 -47,  -1656,  -1656
 -46,  -1946,  -1946
 -45,  -2047,  -2046
 -44,  -1946,  -1946
 -43,  -1656,  -1655
 -42,  -1203,  -1202
 -41,   -632,   -632
 -40,      0,      0
 -39,    632,    632
 -38,   1203,   1203
 -37,   1656,   1656
 -36,   1946,   1946
 -35,   2047,   2046
 -34,   1946,   1946
 -33,   1656,   1655
 -32,   1203,   1203
 -31,    632,    632
 -30,      0,      0
 -29,   -632,   -632
 -28,  -1203,  -1203
 -27,  -1656,  -1656
 -26,  -1946,  -1946
 -25,  -2047,  -2046
 -24,  -1946,  -1946
 -23,  -1656,  -1655
 -22,  -1203,  -1203
 -21,   -632,   -632
 -20,      0,      0
 -19,    632,    632
 -18,   1203,   1203
 -17,   1656,   1656
 -16,   1946,   1946
 -15,   2047,   2046
 -14,   1946,   1946
 -13,   1656,   1656
 -12,   1203,   1203
 -11,    632,    632
 -10,      0,      0
  -9,   -632,   -632
  -8,  -1203,  -1203
  -7,  -1656,  -1656
  -6,  -1946,  -1946
  -5,  -2047,  -2046
  -4,  -1946,  -1946
  -3,  -1656,  -1656
  -2,  -1203,  -1203
  -1,   -632,   -632
   0,      0,      0
   1,    632,    632
   2,   1203,   1203
   3,   1656,   1656
   4,   1946,   1946
   5,   2047,   2046
   6,   1946,   1946
   7,   1656,   1656
   8,   1203,   1203
   9,    632,    632
  10,      0,      0
  11,   -632,   -632
  12,  -1203,  -1203
  13,  -1656,  -1656
  14,  -1946,  -1946
  15,  -2047,  -2046
  16,  -1946,  -1946
  17,  -1656,  -1656
  18,  -1203,  -1203
  19,   -632,   -632
  20,      0,      0
  21,    632,    632
  22,   1203,   1203
  23,   1656,   1655
  24,   1946,   1946
  25,   2047,   2046
  26,   1946,   1946
  27,   1656,   1656
  28,   1203,   1203
  29,    632,    632
  30,      0,      0
  31,   -632,   -632
  32,  -1203,  -1203
  33,  -1656,  -1655
  34,  -1946,  -1946
  35,  -2047,  -2046
  36,  -1946,  -1946
  37,  -1656,  -1656
  38,  -1203,  -1203
  39,   -632,   -632
  40,      0,      0
  41,    632,    632
  42,   1203,   1202
  43,   1656,   1655
  44,   1946,   1946
  45,   2047,   2046
  46,   1946,   1946
  47,   1656,   1656
  48,   1203,   1203
  49,    632,    632
  50,      0,      0
  51,   -632,   -632
  52,  -1203,  -1202
  53,  -1656,  -1655
  54,  -1946,  -1946
  55,  -2047,  -2046
  56,  -1946,  -1946
  57,  -1656,  -1656
  58,  -1203,  -1203
  59,   -632,   -632
  60,      0,      0
  61,    632,    632
  62,   1203,   1202
  63,   1656,   1655
  64,   1946,   1946
  65,   2047,   2046
  66,   1946,   1946
  67,   1656,   1656
  68,   1203,   1203
  69,    632,    632
  70,      0,      0
  71,   -632,   -632
  72,  -1203,  -1202
  73,  -1656,  -1655
  74,  -1946,  -1946
  75,  -2047,  -2046
  76,  -1946,  -1946
  77,  -1656,  -1656
  78,  -1203,  -1203
  79,   -632,   -633
  80,      0,      0
  81,    632,    632
  82,   1203,   1202
  83,   1656,   1655
  84,   1946,   1946
  85,   2047,   2046
  86,   1946,   1946
  87,   1656,   1656
  88,   1203,   1203
  89,    632,    633
  90,      0,      0
  91,   -632,   -632
  92,  -1203,  -1202
  93,  -1656,  -1655
  94,  -1946,  -1946
  95,  -2047,  -2046
  96,  -1946,  -1947
  97,  -1656,  -1656
  98,  -1203,  -1203
  99,   -632,   -633
 100,      0,      0

--- End code ---

With 14 bits:

--- Code: --- -99,   3797,   3800
 -98,   7222,   7225
 -97,   9941,   9943
 -96,  11686,  11687
 -95,  12288,  12287
 -94,  11686,  11685
 -93,   9941,   9939
 -92,   7222,   7219
 -91,   3797,   3793
 -90,      0,     -3
 -89,  -3797,  -3800
 -88,  -7222,  -7225
 -87,  -9941,  -9943
 -86, -11686, -11687
 -85, -12288, -12287
 -84, -11686, -11685
 -83,  -9941,  -9939
 -82,  -7222,  -7220
 -81,  -3797,  -3794
 -80,      0,      3
 -79,   3797,   3800
 -78,   7222,   7225
 -77,   9941,   9942
 -76,  11686,  11687
 -75,  12288,  12287
 -74,  11686,  11685
 -73,   9941,   9939
 -72,   7222,   7220
 -71,   3797,   3794
 -70,      0,     -2
 -69,  -3797,  -3799
 -68,  -7222,  -7224
 -67,  -9941,  -9942
 -66, -11686, -11687
 -65, -12288, -12287
 -64, -11686, -11685
 -63,  -9941,  -9939
 -62,  -7222,  -7220
 -61,  -3797,  -3794
 -60,      0,      2
 -59,   3797,   3799
 -58,   7222,   7224
 -57,   9941,   9942
 -56,  11686,  11687
 -55,  12288,  12287
 -54,  11686,  11685
 -53,   9941,   9939
 -52,   7222,   7221
 -51,   3797,   3795
 -50,      0,     -1
 -49,  -3797,  -3798
 -48,  -7222,  -7224
 -47,  -9941,  -9942
 -46, -11686, -11687
 -45, -12288, -12287
 -44, -11686, -11686
 -43,  -9941,  -9940
 -42,  -7222,  -7221
 -41,  -3797,  -3795
 -40,      0,      1
 -39,   3797,   3798
 -38,   7222,   7223
 -37,   9941,   9942
 -36,  11686,  11687
 -35,  12288,  12287
 -34,  11686,  11686
 -33,   9941,   9940
 -32,   7222,   7221
 -31,   3797,   3796
 -30,      0,     -1
 -29,  -3797,  -3798
 -28,  -7222,  -7223
 -27,  -9941,  -9941
 -26, -11686, -11686
 -25, -12288, -12287
 -24, -11686, -11686
 -23,  -9941,  -9940
 -22,  -7222,  -7222
 -21,  -3797,  -3796
 -20,      0,      0
 -19,   3797,   3797
 -18,   7222,   7223
 -17,   9941,   9941
 -16,  11686,  11686
 -15,  12288,  12287
 -14,  11686,  11686
 -13,   9941,   9940
 -12,   7222,   7222
 -11,   3797,   3796
 -10,      0,      0
  -9,  -3797,  -3797
  -8,  -7222,  -7222
  -7,  -9941,  -9941
  -6, -11686, -11686
  -5, -12288, -12287
  -4, -11686, -11686
  -3,  -9941,  -9941
  -2,  -7222,  -7222
  -1,  -3797,  -3797
   0,      0,      0
   1,   3797,   3797
   2,   7222,   7222
   3,   9941,   9941
   4,  11686,  11686
   5,  12288,  12287
   6,  11686,  11686
   7,   9941,   9941
   8,   7222,   7222
   9,   3797,   3797
  10,      0,      0
  11,  -3797,  -3796
  12,  -7222,  -7222
  13,  -9941,  -9940
  14, -11686, -11686
  15, -12288, -12287
  16, -11686, -11686
  17,  -9941,  -9941
  18,  -7222,  -7223
  19,  -3797,  -3797
  20,      0,      0
  21,   3797,   3796
  22,   7222,   7222
  23,   9941,   9940
  24,  11686,  11686
  25,  12288,  12287
  26,  11686,  11686
  27,   9941,   9941
  28,   7222,   7223
  29,   3797,   3798
  30,      0,      1
  31,  -3797,  -3796
  32,  -7222,  -7221
  33,  -9941,  -9940
  34, -11686, -11686
  35, -12288, -12287
  36, -11686, -11687
  37,  -9941,  -9942
  38,  -7222,  -7223
  39,  -3797,  -3798
  40,      0,     -1
  41,   3797,   3795
  42,   7222,   7221
  43,   9941,   9940
  44,  11686,  11686
  45,  12288,  12287
  46,  11686,  11687
  47,   9941,   9942
  48,   7222,   7224
  49,   3797,   3798
  50,      0,      1
  51,  -3797,  -3795
  52,  -7222,  -7221
  53,  -9941,  -9939
  54, -11686, -11685
  55, -12288, -12287
  56, -11686, -11687
  57,  -9941,  -9942
  58,  -7222,  -7224
  59,  -3797,  -3799
  60,      0,     -2
  61,   3797,   3794
  62,   7222,   7220
  63,   9941,   9939
  64,  11686,  11685
  65,  12288,  12287
  66,  11686,  11687
  67,   9941,   9942
  68,   7222,   7224
  69,   3797,   3799
  70,      0,      2
  71,  -3797,  -3794
  72,  -7222,  -7220
  73,  -9941,  -9939
  74, -11686, -11685
  75, -12288, -12287
  76, -11686, -11687
  77,  -9941,  -9942
  78,  -7222,  -7225
  79,  -3797,  -3800
  80,      0,     -3
  81,   3797,   3794
  82,   7222,   7220
  83,   9941,   9939
  84,  11686,  11685
  85,  12288,  12287
  86,  11686,  11687
  87,   9941,   9943
  88,   7222,   7225
  89,   3797,   3800
  90,      0,      3
  91,  -3797,  -3793
  92,  -7222,  -7219
  93,  -9941,  -9939
  94, -11686, -11685
  95, -12288, -12287
  96, -11686, -11687
  97,  -9941,  -9943
  98,  -7222,  -7225
  99,  -3797,  -3800
 100,      0,     -3

--- End code ---
Navigation
Message Index
Next page
Previous page
There was an error while thanking
Thanking...

Go to full version
Powered by SMFPacks Advanced Attachments Uploader Mod