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
- If chebwin is used, I usually got 300 potential tones, which is bad.
- If I used squared window, I usually got 20+, which is not bad
- If I reduce chebwin's attenuation, the number also reduces.
I can't figure how this can be related to the window function.