I am look into CSPE. "Signal Analysis Using the Complex Spectral Phase Evolution (CSPE) Method"

The method is simple. It compares the original signal's FFT and shifted signal FFT in phase domain so that it can get an estimate of frequency. The original purpose of this paper is to improve the accuracy. However, I am wondering if it can be used to detect if there is a tone around certain FFT bin.

One way to do this is to get the $\delta$ value for each FFT bin. If $|\delta| < .5 $ indicates a potential tone around the frequency. One simulation is to do it on pure noise. However, I found that the results depend largely on the window you added to your signal. Here is my code:

#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

nfft = 512
nsamples = 513    

noise = np.random.randn(nsamples) + 1j * np.random.randn(nsamples)
noise = np.sqrt(.5) * noise

SNR = 10
noise = noise * 10 ** (-SNR/20)

recv = noise # pure noise

s0 = recv[:nsamples-1]
s1 = recv[1:]

S0 = np.fft.fft(s0 * signal.chebwin(len(s0), at = 80), nfft)
S1 = np.fft.fft(s1 * signal.chebwin(len(s1), at = 80), nfft)

#S0 = np.fft.fft(s0, nfft) # square window
#S1 = np.fft.fft(s1, nfft) # square window

SS = np.conj(S0) * S1
aSS = np.angle(SS)
idx = np.where(aSS < 0)
aSS[idx] = aSS[idx] + 2 * np.pi
cSS = aSS * (nfft/2/np.pi)
bSS = cSS - np.arange(nfft)
print(np.sum(np.abs(bSS) < .5)) # estimation of potential # of tones

Some results:

  1. If chebwin is used, I usually got 300 potential tones, which is bad.
  2. If I used squared window, I usually got 20+, which is not bad
  3. If I reduce chebwin's attenuation, the number also reduces.

I can't figure how this can be related to the window function.




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.