I have a situation that the measurement device is generating a known signal in the data at 1/4 of the rate. In this case that is a 500 Hz signal when sampling at 2000 Hz.

Now I can extract the 500 Hz signal using a Butterworth Band-Pass at 490–510 Hz which works, but it takes >1/8th of a second to extract the signal. In our setup we know the measurement and the signal are perfect in sync (same clock source etc) so a perfect 500 Hz filter would be ideal.

Is there a better extraction method? Ideally without the latency of the Butterworth or more computationally efficient or more accurate to extract the signal?

Here is an example of the 2 kHz data:

-34561, -32650, -3422, -5064, -33967, -32061, -2807, -4436, -33364, -31447, -2108, -3771, -32863, -31050, -1801, -3516, -32634, -30871, -1711, -3496, -32761, -31115, -2027, -3919, -33237, -31652, -2684, -4606, -33831, -32279, -3394, -5291, -34442, -32775, -3764, -5582, -34667, -32969, -3872, -5589, -34532, -32665, -3446, -5064, -34014, -32082, -2771, -4385, -33355, -31437, -2114, -3771, -32854, -31032, -1796, -3501, -32651, -30819, -1593, -3425, -32671, -31067, -1924, -3859, -33214, -31631, -2639, -4519, -33802, -32225, -3301, -5254, -34406, -32736, -3741, -5594, -34652, -32932, -3886, -5572, -34453, -32592, -3377, -5056, -33953, -32043

plot of data above

Edit: The aspect of interest is the amplitude of the 500hz signal, the amplitude can be converted to give a circuit impedance which we wish to efficiently measure. The butterworth takes a long time for a 1st order butterworth to converge to a steady amplitude measurement with fixed circuit impedance. A higher order could viable but this feels like overkill and as there is so many known about the signal so a more efficient approach would feel to be viable, just magnitude is the key. I tried some simple approached but these still had oscillation of amplitude at 50hz albeit the average was good, there may be formal methods I'd like to try.

Update: Here is a plot showing the butterworth vs the given solution shown in Green which does exactly what I had hoped with 4 samples latency! Previously I had looked at peak-signal but taking peak-average does look preferable anyway and what the solution is giving us. Thankyou for your help. Comparison with Butterworth and Super-Heterodyne

  • $\begingroup$ Welcome to SE.SP! What order Butterworth filter are you using? $\endgroup$
    – Peter K.
    May 22, 2020 at 15:36
  • $\begingroup$ If you know that it is clock-sync-ed to the sampling clock, what aspect of the signal is it that you need? Its amplitude? Phase? $\endgroup$
    – Knut Inge
    May 22, 2020 at 15:36
  • $\begingroup$ Unless you have literal billions of numbers, your 1/8 is a sign of incredibly inefficient filter implementation (and little else) $\endgroup$ May 22, 2020 at 16:06
  • $\begingroup$ I'd repeat very much what Knut asked: you don't need to actually get a signal out of this when you know exactly the frequency, then the only unknown is amplitude and phase, and you'd need very few samples to estimate these – and then you can recreate your signal simply using $A\cos(2\pi \cdot 500\,\text{Hz}\cdot t+\varphi)$. Maybe you could elaborate on your use case a bit! I bet you get a much more useful answer that way. $\endgroup$ May 22, 2020 at 16:08
  • $\begingroup$ also, as you can see from the plot, your signal's period is really not 4 samples, so it's really not at 500 Hz = 2000 Hz / 4 $\endgroup$ May 22, 2020 at 16:12

1 Answer 1


To estimate the amplitude of the 500 Hz signal, a simple moving average filter will give you the best estimate in the presence of white Gaussian noise. This can be easily done by doing a moving average on the result of converting the 500 Hz signal to baseband as described below. This filter will have a Sinc response in frequency, so has high sidelobes which means it would be sensitive to the presence of other stronger signals if present. A very simple work-around is to just window the time domain signal first and then follow the same process (downcovert to baseband and sum the result over N samples where N is the length of the moving average). This is essentially a bandpass filter (using the windowing filter design approach) but in any filter used there will be a trade between frequency selectivity and time of convergence.

A convenience of having a "digital IF" that is exactly $Fs/4$ is you can down-convert to baseband (create the equivalent baseband analytic signal) by just multiplying by +/-1 as follows:

To get I you multiply by

I = 1 0 -1 0 1 0 -1 0

To get Q you multiply by

Q = 0 -1 0 1 0 -1 0 1

As these would be the values for the Local Oscillator $e^{-j\omega t}$ for $\omega = \pi/2$ which is the normalized radian frequency at an LO of $f_s/4$.

I detail this approach further at this post:

DAC and ADC architecture in SDRs

  • $\begingroup$ Thanks for this response. I am a softy, sounds like this has some grounding I could use but will take a while for me to worm out the terms possibly. On Monday I will take a look into thi and report back. $\endgroup$
    – Crog
    May 23, 2020 at 19:31
  • $\begingroup$ @Crog--- Simply "down-covert" your signal to baseband by multiplying it with $e^{-j \omega t}$ where $\omega$ is your normalized angular frequency-- Normalized just means divide the frequency by your sampling rate (at $f_s/4$, $\omega = 2\pi f/f_s = \pi/2$), you are multiplying by a digital signal that is at -500 Hz, which moves your signal to baseband. The average of this result will be proportional to the amplitude of your signal at 500 Hz. $\endgroup$ May 23, 2020 at 19:34
  • $\begingroup$ Using your linked reference and a very handy comment you added to that post it all seems pretty explanatory. A wonderful solution and exactly what I had hoped for. $\endgroup$
    – Crog
    May 25, 2020 at 8:42
  • $\begingroup$ I don't have direct knowledge of the phase where I am using this, my naive assumption is that the correct phase is the one which gives the largest amplitude? I did a quick check offsetting the data and two gave negative amplitude and one was closer to zero and one is correct. Naively I would just take the biggest as being the phase of our signal or is there much preferred method? Thanks again for your help. $\endgroup$
    – Crog
    May 25, 2020 at 12:16
  • $\begingroup$ &Crog since you down covert to I (Real) and Q (Imaginary) you will be able to measure the phase and magnitude—- I and Q is a phasor I + jQ $\endgroup$ May 25, 2020 at 12:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.