2
$\begingroup$

I don't understand what happened in my simulation. I would like to perform a trade off between 2 ways to estimate power in frequency bands. I want to detect spurious frequencies.

First method:

I constructed a vector of noise and computed the periodogram without windowing. As example, for a vector length of 1048576 and a FFT length of 1024, I have reduced the noise variance by a factor of $\sqrt{1024}$.

Second method:

I constructed a vector of noise and computed the periodogram without windowing. As example, for a vector length of 1048576 and a FFT length of 262144, I have reduce the noise variance by a factor of $\sqrt{16}$.

Between these 2 methods I can perform a lower peak detection with the first one (equal to the noise power in a bin). But if my peak have a large power; $26 \mathtt{dB}$ greater than my noise, many FFT bins shall be affected as in the second. But the frequency separation of the second method is better.

I've tried a test mix of both methods. Add the 16 successive bins to reconstruct an equivalent periodogram of the first method.

For me, I've increased the noise variance because I've summed 16 "normal" ($\chi^2 $ in fact) law, but I've increased my spurious compare to the result of the first method.

In fact I've reduced my noise variance. It is the same as in the first method: $\sqrt{1024}$.

My first reaction is to think I have made a mistake to consider law as independent, but how can I verify that?

Someone can help me with any document reference or demonstration please?

Below an example in Scilab:

nfft  = 1024;
nbPts = 1024*nfft;
nfft2 = 16*nfft;

noise  =  (grand(1, nbPts, "nor", 0, 1) +%i * grand(1, nbPts, "nor", 0, 1))/sqrt(2);

myfft = zeros(1,nfft);
myfft2 = zeros(1,nfft2);

// perform 1st periodogram
for cnt=1:nbPts/nfft
    myfft = myfft + abs(fft(noise((cnt-1)*nfft+1:cnt*nfft))/nfft).^2; 
end

myfft = 10*log10(myfft/(nbPts/nfft));


// perform 2nd periodogram
for cnt=1:nbPts/nfft2
    myfft2 = myfft2 + abs(fft(noise((cnt-1)*nfft2+1:cnt*nfft2))/nfft2).^2; 
end

// sum it
fftsum = zeros(1,nfft);
for cnt=1:nfft,
    fftsum(cnt) = 10*log10(sum(myfft2((cnt-1)*nfft2/nfft+1:cnt*nfft2/nfft))/(nbPts/nfft2));

end

// visualization
figure(0)
set(gca(),"auto_clear","on")
plot(1:nfft,myfft)
set(gca(),"auto_clear","off")
plot(1:nfft,fftsum,'r')
$\endgroup$

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.