Background Info

I have a real signal comprised of 8 frequencies 400Hz-680Hz in 40Hz increments. The signal is generated from 8 cosines of equal amplitude (A=1) and phase (Phase= 0rad), summed together. This signal is fed through a transmitter to a receiver, and on the receiving end I wish to recover the frequencies and phases of each component. My transmit and receive sample rate is 48kHz. I have verified that I can recover the phase and frequency when I feed directly from the "generation" algorithm to the "processing" algorithm without passing through the tx->rx cycle. I am using FFTW3 in C++.

What's Working

I have a DFT on the receive-side which correctly identifies the 8 component frequencies with great reliability and accuracy. The FFT length is 1200.

What's not Working

When I try to derive the phase, (I'm using std::arg() in C++), the phases are all over the place, and I do not get what I expect.

What I've Tried

I understand that when I recover the signal at the receiver, I don't have a perfect starting sampling point as I do when I cut the tx->rx cycle out. I've tried "sliding" my DFT window along the signal to try finding the place where the 400Hz component's phase is 0rad as I expect, but even when I find "windows" where the phase for 400Hz is correct, the other phases are goofy and make no sense.

Example output from my receiver

--------------- ITER 23 ---------------
400Hz @ -0.582348 degs
440Hz @ -117.297 degs
480Hz @ 136.052 degs
520Hz @ 36.7404 degs
560Hz @ -59.7696 degs
600Hz @ -152.054 degs
640Hz @ 118.413 degs
680Hz @ 30.3169 degs


Edit 1

Dropping down to two tones gives a similar result, although a pattern emerges. While moving the DFT window along the samples one-by-one, every 1200th iteration of this action shows the periodicity, and the phase is not off by much. This makes sense as every 1200 sample window should be identical over the whole signal sample.

--------------- ITER 3411 ---------------
400Hz @ 0.102598 degs
440Hz @ -5.95263 degs
--------------- ITER 4611 ---------------
400Hz @ -0.277188 degs
440Hz @ -6.18412 degs

--------------- ITER 5811 ---------------
400Hz @ -0.270323 degs
440Hz @ -6.75208 degs

My Question

How can I reliably recover the phase from this complex signal? Is there anything wrong with my approach? What would a better approach be if so? Any other inputs are appreciated.

  • 1
    $\begingroup$ What's your channel like ? Do you do clock recovery at the receiver ? $\endgroup$
    – Hilmar
    May 18 '21 at 21:10
  • $\begingroup$ @Hilmar, in this example I'm not doing any clock recovery directly, because my signal is 1s long (48000 points) so it contains multiple windows of 1200 samples for the DFT. My assumption is that in one of the permutations of the sliding window DFT described above would yield the correct interpretation of phase. In the final system I'm working on it will be synced by a cyclic prefix. $\endgroup$ May 18 '21 at 21:50
  • $\begingroup$ Can you describe your channel a little more? $\endgroup$
    – mmmm
    May 18 '21 at 23:22
  • $\begingroup$ @mmmm I'm not sure I understand what you mean here. What details are you asking about? $\endgroup$ May 18 '21 at 23:36
  • $\begingroup$ @mmmm I'm not sure what all details you're asking for, but basically the signal is transmitted as audio over an FM TRX pair, so there's no case of multipath at the RX side. The TRX pair have a usable bandwidth of about 3.6kHz, 400-2800 being safely inside the band. The received signal is very clean. $\endgroup$ May 18 '21 at 23:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.