Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dB values seam to be incorrect on both Periodogram & Spectrogram #22

Open
ashley-b opened this issue Feb 25, 2020 · 2 comments
Open

dB values seam to be incorrect on both Periodogram & Spectrogram #22

ashley-b opened this issue Feb 25, 2020 · 2 comments

Comments

@ashley-b
Copy link

When display a single test tone of amplitude 1.0 in the Periodogram or Spectrogram display the amplitude seams down from were it should be. 3dB down for complex and 9dB down for real signals.
It does not seam to be significantly affected by the windowing mode.
But adjusting the "Full Scale" parm fixes the the issue. eg 1.0 *sqrt(1/2) for complex bring the displayed amplitude to were i would expect.

Complex normal
complex normal
Complex adjusted
complex ajusted

Real normal
real normal
Real adjusted
real ajusted

I see this bug under the Pothos v0.7.0-g42d23cb1

@guruofquality
Copy link
Contributor

If you send in a DC tone at 1.0 amplitude and set the window to rectangular you should see exactly 0 dBfs (if the full scale is 0). One you change the frequency or window, you start to spread out that power among multiple fft bins. The total cumulative power of those bins should add up to 0 dBfs. In the example above, you have two powerful bins which are down about 3dB, so the cumulative power is correct.

@nowls
Copy link

nowls commented Nov 4, 2024

Two things to note here:

  1. By selecting a normalized frequency of 0.1 and FFT size 1024, you're seeing spectral leakage since your tone is not perfectly centered on an FFT bin (0.1*1024=102.4, a non-integer). This leads to scalloping loss, which is a function of the window used. For your chosen Hann window, the maximum scalloping loss is -1.42 dB if the tone is exactly halfway between bins, but it will be slightly less for your case. Choosing a normalized frequency of 1/1024*102=0.099609375 would put you on the nearest FFT bin center, and you should see the scalloping loss go away.
  2. The Fourier transform of the Hann window shows that there are 3 dominant coefficients that constitute the main lobe of the Hann window's frequency response. By windowing in the time domain, you're convolving the Hann window's frequency response with your tone in the frequency domain. Thus most of the energy of your tone will get distributed into the 3 FFT bins centered around your tone, but the center bin will not have amplitude 1, but rather 0.5, hence -3 dB down from peak.

Edit: an earlier version of this comment incorrectly stated that WaveformSource sets Re{z}=1 and Im{z}=1, which has a magnitude of SQRT(1^2+1^2) ~ 1.414. In fact, WaveformSource populates a wave table using std::polar, which handles normalizing the real and imaginary parts by 1/SQRT(2), thus the magnitude is 1, and therefore dBFS=0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants