This is meant as a fun little condundrum about measuring noise from FFT style plots - some of you will know this stuff, others might be surprized.
I'm using a notional 44.1kHz sample rate and 256-point FFTs.
Imagine a signal with a -60dBV sine wave (that's 1mV rms just to be clear) added to white noise of 1µV/√Hz voltage noise density (-120dBV). Here's a plot, the tone itself is 4kHz:
The amplitude of the tone is 1.414mV as you'd expect from 1mV rms, and the noise is about 0.15mV rms over the 22kHz bandwidth of the sampled signal. [ √(22050) * 1µV ~= 0.15mV ]
Seems straight forward, 1mV rms of signal tone and about 0.15mV rms of noise.
So we take its spectrum using a 256-point FFT and Hann window, and display in dBV:
The 4kHz tone peak is at -60dBV as expected. However the noise floor is around -95dBV.
But 0.15mV rms is about -76dBV.
And our noise-floor was supposed to be -120dBV anyway.
Neither of those correspond to the -95dBV we see in the plot. What's going on?
I'm using a notional 44.1kHz sample rate and 256-point FFTs.
Imagine a signal with a -60dBV sine wave (that's 1mV rms just to be clear) added to white noise of 1µV/√Hz voltage noise density (-120dBV). Here's a plot, the tone itself is 4kHz:

The amplitude of the tone is 1.414mV as you'd expect from 1mV rms, and the noise is about 0.15mV rms over the 22kHz bandwidth of the sampled signal. [ √(22050) * 1µV ~= 0.15mV ]
Seems straight forward, 1mV rms of signal tone and about 0.15mV rms of noise.
So we take its spectrum using a 256-point FFT and Hann window, and display in dBV:

The 4kHz tone peak is at -60dBV as expected. However the noise floor is around -95dBV.
But 0.15mV rms is about -76dBV.
And our noise-floor was supposed to be -120dBV anyway.
Neither of those correspond to the -95dBV we see in the plot. What's going on?
First point is that the amount of noise depends on the bandwidth of the measurement, whereas the amount of signal doesn't (so long as its somewhere in the passband).
And secondly an FFT is really a series of measurements each with a bandwidth equal to fs/N where fs is the sampling frequency and N is the number of points in the FFT.
Changing the sampling frequency or changing the number of points of the FFT both affect the apparent noise level in an FFT spectrum (and so does the choice of FFT window). The difference in dB between signal peaks and noise floor is not just a property of the circuit being measured.
For instance here are some plots of that same signal (averaged to reduce variation in the noise floor), with 256, 1024 and 8192 point FFTs. In each case the raw data is identical.
They are plotted with two scales, the left one for signal level, the right hand one for noise density, aka power spectral density (well amplitude-squared rather than power to be precise).
When measuring noise you normally want to talk about power spectral density, as this is a property of the system being measured, be it an amplifier or whatever.
If you take an FFT without recording the sample-rate and number of points and window function, you cannot subsequently determine the absolute noise level even if you know the absolute signal levels.
Another subtlety is that very low signal peaks can be buried in the noise in one measurement, but clearly discernable in another - increasing the number of FFT points, or decreasing the sampling rate, or both will lower the apparent noise floor in a spectrum to reveal buried peaks.
If you reduce the sampling rate its required that the pre-digitization anti-aliasing filter scales to match otherwise aliased noise won't be removed. However these days its not hard to increase the FFT size to 10^6 or more which can reveal more detail.
Many simple audio analysis packages don't present spectral densities, high-end equipment may give a choice of spectrum or spectral density, but I quite like the presentation of both using dual axes as in the graphs above. I'll post the Python code for this if anyone's interested.
And secondly an FFT is really a series of measurements each with a bandwidth equal to fs/N where fs is the sampling frequency and N is the number of points in the FFT.
Changing the sampling frequency or changing the number of points of the FFT both affect the apparent noise level in an FFT spectrum (and so does the choice of FFT window). The difference in dB between signal peaks and noise floor is not just a property of the circuit being measured.
For instance here are some plots of that same signal (averaged to reduce variation in the noise floor), with 256, 1024 and 8192 point FFTs. In each case the raw data is identical.



They are plotted with two scales, the left one for signal level, the right hand one for noise density, aka power spectral density (well amplitude-squared rather than power to be precise).
When measuring noise you normally want to talk about power spectral density, as this is a property of the system being measured, be it an amplifier or whatever.
If you take an FFT without recording the sample-rate and number of points and window function, you cannot subsequently determine the absolute noise level even if you know the absolute signal levels.
Another subtlety is that very low signal peaks can be buried in the noise in one measurement, but clearly discernable in another - increasing the number of FFT points, or decreasing the sampling rate, or both will lower the apparent noise floor in a spectrum to reveal buried peaks.
If you reduce the sampling rate its required that the pre-digitization anti-aliasing filter scales to match otherwise aliased noise won't be removed. However these days its not hard to increase the FFT size to 10^6 or more which can reveal more detail.
Many simple audio analysis packages don't present spectral densities, high-end equipment may give a choice of spectrum or spectral density, but I quite like the presentation of both using dual axes as in the graphs above. I'll post the Python code for this if anyone's interested.
Do you have Matlab/octave models?
Noise in the signal vs noise in the sampling. The sine wave is infinite detail, adding noise at that scale (ie adding noise to the sine generation function) vs adding noise to the measurement sampling?
For single tones you can ignore the point - for music and multiple tones, then adding noise to the tone/music frequencies vs adding noise to the sample is different. Adding noise to a sample is essentially adding probabilistic noise to all the frequencies with magnitude >0 during that sample period.
Yup Discrete FT (DFT) rather than grouping everything as FFT.
One last point. most of this is ADC - thus if you have a full song FFT then you can identify all the frequencies in the Digital recording and reject those that are out of a 5-25Khz range as noise reduction via analysing the bytes.
I've not seen a DAC run a corrective ADC feedback loop for example.
First point is that the amount of noise depends on the bandwidth of the measurement, whereas the amount of signal doesn't (so long as its somewhere in the passband).
Noise in the signal vs noise in the sampling. The sine wave is infinite detail, adding noise at that scale (ie adding noise to the sine generation function) vs adding noise to the measurement sampling?
For single tones you can ignore the point - for music and multiple tones, then adding noise to the tone/music frequencies vs adding noise to the sample is different. Adding noise to a sample is essentially adding probabilistic noise to all the frequencies with magnitude >0 during that sample period.
And secondly an FFT is really a series of measurements each with a bandwidth equal to fs/N where fs is the sampling frequency and N is the number of points in the FFT.
Yup Discrete FT (DFT) rather than grouping everything as FFT.
One last point. most of this is ADC - thus if you have a full song FFT then you can identify all the frequencies in the Digital recording and reject those that are out of a 5-25Khz range as noise reduction via analysing the bytes.
I've not seen a DAC run a corrective ADC feedback loop for example.
Last edited:
I use Python, mainly numpy, scipy.signal, matplotlib.
I am not sure what you are trying to say about the point I am making re noise v. signal in FFT plot used for measurements.
Why would you need to reject any out-of-band stuff - you're already taking the spectrum, you can see the whole picture and ignore out-of-band easily.
I am not sure what you are trying to say about the point I am making re noise v. signal in FFT plot used for measurements.
Not sure that makes any sense - why would you take an FFT of a whole piece of music other than to collect statistics on power/frequency distribution?One last point. most of this is ADC - thus if you have a full song FFT then you can identify all the frequencies in the Digital recording and reject those that are out of a 5-25Khz range as noise reduction via analysing the bytes.
Why would you need to reject any out-of-band stuff - you're already taking the spectrum, you can see the whole picture and ignore out-of-band easily.
I use Python, mainly numpy, scipy.signal, matplotlib.
I am not sure what you are trying to say about the point I am making re noise v. signal in FFT plot used for measurements.
Not sure that makes any sense - why would you take an FFT of a whole piece of music other than to collect statistics on power/frequency distribution?
Why would you need to reject any out-of-band stuff - you're already taking the spectrum, you can see the whole picture and ignore out-of-band easily.
Just thoughts and too often I extrapolate the answer without leading people to it - I should have a play then I might understand it a bit better.
The reason I mentioned octave (has the same libraries basically) is that I found vectorisation easier with octave vs lots of for loops in python.
The reason I mentioned octave (has the same libraries basically) is that I found vectorisation easier with octave vs lots of for loops in python.
Do you know Python's numpy library and numpy arrays? It may be just what you need for avoiding many for loops.
Do you know Python's numpy library and numpy arrays? It may be just what you need for avoiding many for loops.
Hehe more the python.. the two are sort of like COBOL compared to FORTRAN..
I have memories of the biz-science grads hammering spacebars (cobol loops) and we had the luxury if fortran77 and fortran90 as part of numerical computation classes.
Perhaps I had mentioned this before -- different thread "FFT Scaling for Noise" from AP --
FFT Scaling for Noise - Audio Precision
The AP macro's are slow, but they work.
FFT Scaling for Noise - Audio Precision
The AP macro's are slow, but they work.
Noise itself is quite tricky thing. Besides the peak and RMS levels and FFT's ENBW, it has noise density function, as well as bandwidth (when you take rand(), it has frequencies above Fs/2 and they fold into baseband).
I prefer using natural noise sources over synthesized as they are... real 🙂
I prefer using natural noise sources over synthesized as they are... real 🙂
Noise itself is quite tricky thing. Besides the peak and RMS levels and FFT's ENBW, it has noise density function, as well as bandwidth (when you take rand(), it has frequencies above Fs/2 and they fold into baseband).
I prefer using natural noise sources over synthesized as they are... real 🙂
I drove a global bank’s first use if quantum computing - the beauty is a qubit is naturally random (not an approximation) if you model with a QC they are higher accuracy too - no chance of random number generation algorithmic bias.
You can then use quantum FFT to get a better approximate answer (rather than having 0 or 1).
Also have a little experience with photonic quantum computers for random number generation 🙂
Thanks, Mark and Jack!
Along the lines of what Mark was posting about in 2020 (unfortunately the images disappeared), I'm trying to figure out how to get meaningful noise measurements and graphs with REW and an external audio interface (I'm using a Focusrite Scarlett Solo 3rd gen) and also, what REW actually does when it plots noise levels.
As the help file explains, in the RTA display, once one selects one of the per-octave scales (i.e. not 'spectrum'), one gets the option of selecting V/Sqrt(Hz) for the vertical scale. Presumably the plot then shows properly normalized noise amplitude spectral density if one selects a rectangular window for the FFT. Different selections for the FFT window give different (mis) scalings of a discrete frequency test signal, with the 'flat-top' option apparently preserving the rms value, i.e. a 1V 1 kHz generator signal will appear at a height of 1V. This seems (to me) to indicate that plotting noise floor and distortion simultaneously and correctly does not seem to be an option?
If one then (after having selected V/sqrt(Hz) in 'RTA' mode) subsequently switches back to the 'spectrum' display option, the V/sqrt(Hz) vertical scale is actually preserved. But what does REW really plot, and how does it normalize the noise when 'spectrum' is selected? I had originally (before reading the help file and discovering I need a stepped sine measurement) naively assumed it would plot the noise floor as dBV (or dBu or dBFS, i.e. whatever scale is selected for the discrete frequency signals and harmonics) over sqrt(Hz) for a bandwidth of 1Hz, but if it says that anywhere in the help file, I haven't been able to find it.
I believe I need to select stepped sine, and lock the generator frequency to the FFT, and probably also turn on some dithering to get meaningful noise floor measurements, but what else does one need to do to get a proper noise measurement and graph from REW?
I'm sure plenty of people before had the same question and have figured it out, and I hope some of them will chime in.
Along the lines of what Mark was posting about in 2020 (unfortunately the images disappeared), I'm trying to figure out how to get meaningful noise measurements and graphs with REW and an external audio interface (I'm using a Focusrite Scarlett Solo 3rd gen) and also, what REW actually does when it plots noise levels.
As the help file explains, in the RTA display, once one selects one of the per-octave scales (i.e. not 'spectrum'), one gets the option of selecting V/Sqrt(Hz) for the vertical scale. Presumably the plot then shows properly normalized noise amplitude spectral density if one selects a rectangular window for the FFT. Different selections for the FFT window give different (mis) scalings of a discrete frequency test signal, with the 'flat-top' option apparently preserving the rms value, i.e. a 1V 1 kHz generator signal will appear at a height of 1V. This seems (to me) to indicate that plotting noise floor and distortion simultaneously and correctly does not seem to be an option?
If one then (after having selected V/sqrt(Hz) in 'RTA' mode) subsequently switches back to the 'spectrum' display option, the V/sqrt(Hz) vertical scale is actually preserved. But what does REW really plot, and how does it normalize the noise when 'spectrum' is selected? I had originally (before reading the help file and discovering I need a stepped sine measurement) naively assumed it would plot the noise floor as dBV (or dBu or dBFS, i.e. whatever scale is selected for the discrete frequency signals and harmonics) over sqrt(Hz) for a bandwidth of 1Hz, but if it says that anywhere in the help file, I haven't been able to find it.
I believe I need to select stepped sine, and lock the generator frequency to the FFT, and probably also turn on some dithering to get meaningful noise floor measurements, but what else does one need to do to get a proper noise measurement and graph from REW?
I'm sure plenty of people before had the same question and have figured it out, and I hope some of them will chime in.
Part of the answer may hinge on what distinguishes a signal such as a weakly-nonlinear-distortion spurious-spectral-line from a noise, especially when the spectral line has its own correlated-noise-skirts (not to mention when the entire noise floor level varies with the test signal). There are certain assumptions in play about the nature of the signals to be analyzed.
Well, the AP note that @jackinnj linked to talks a bit about the difficulties (or choices to be made) for simultaneous display of discrete (in frequency) and broad signals, but I'm not getting to that point with REW. I just simply can't make sense of the noise normalization and scaling. The noise floor measurement does not seem to be normalized to a 1 Hz bin width when I select the V/sqrt(Hz) vertical scale, but it also doesn't seem to be the 1/2^n octave fraction bin width (judging from comparing the integral in the distortion display box to the level of the curve, for narrow measurement windows of a few Hz). The displayed level does scale though with the square root of the octave divider bin width.
Well, be that as it may, the stepped sine seems to do its job of pushing the noise sufficiently down, in particular at higher frequencies.
Well, be that as it may, the stepped sine seems to do its job of pushing the noise sufficiently down, in particular at higher frequencies.
IIRC, if you can do synchronous FFTs where the signal source is a DAC which is on the same clock as the ADC, and then if you choose test tones centered on bin frequencies, then you don't need to window. In that case the spectrum you see should be unadulterated. Noise and spectral lines should be as acquired and as normally processed to show only magnitude information (without phase), which is the standard spectral view. Of course, in high resolution FFTs spectral lines may have noise skirts visible at the base of spectral lines. The skirts are widened and raised areas arising from data converter amplitude noise (AN) and clock phase noise (PN) which are strongly correlated with the test tone. The noise skirts should go up and down with the test tone signal level, which may help distinguish noise skirts from the noise floor. Also, in some dacs the whole noise floor may go up and down more or less as a function of the instantaneous DC level of the test tone. In some dacs, after test signal transients there also may be a noise burst as dac integrator state variable settle (but it is an effect usually masked from human perception by the preceding transient, although training may make the effect audible).
Averaging successive spectral views will have the effect of boxcar averaging displayed amplitude values for each frequency, basically a type of LP filtering. This can make it easier to determine the average noise level.
This next part is sort of from long ago memory so it may not be quite right, but here goes anyway: It is possible to do more or less the same thing as above by acquiring a wave file with a DAW or other digital recorder, then doing some data file processing which involves truncating the file ends to leave complete test tone sine waves that would cross through zero at the file ends if the file were to be looped (to make it like the sine waves would be continuous if repeated or looped over all time). The dataset can also be resampled to provide a number of sample points compatible with a particular FFT processor. Some processors only support certain fixed numbers of sample points.
That's about all I can think of at the moment. Maybe someone else will chime in with additional information, and or hopefully to correct me if I got anything wrong. 🙂
Averaging successive spectral views will have the effect of boxcar averaging displayed amplitude values for each frequency, basically a type of LP filtering. This can make it easier to determine the average noise level.
This next part is sort of from long ago memory so it may not be quite right, but here goes anyway: It is possible to do more or less the same thing as above by acquiring a wave file with a DAW or other digital recorder, then doing some data file processing which involves truncating the file ends to leave complete test tone sine waves that would cross through zero at the file ends if the file were to be looped (to make it like the sine waves would be continuous if repeated or looped over all time). The dataset can also be resampled to provide a number of sample points compatible with a particular FFT processor. Some processors only support certain fixed numbers of sample points.
That's about all I can think of at the moment. Maybe someone else will chime in with additional information, and or hopefully to correct me if I got anything wrong. 🙂
Last edited:
Thanks, Mark. Yes, I understand it the same way: with the generator locked to the FFT, and DAC and ADC part of the same device, frequencies get shifted to the center of bins, and a rectangular window (= no window) can be or should be used. Signal and harmonics should entirely fall into single bins, and thus show up with the proper amplitudes.
Additionally, there is the option of also displaying the noise floor in real (noise spectral density) units, but I can't seem to get that to work, or rather, I do not understand the normalization. I should probably post a question in the REW forum.
Additionally, there is the option of also displaying the noise floor in real (noise spectral density) units, but I can't seem to get that to work, or rather, I do not understand the normalization. I should probably post a question in the REW forum.
- Home
- Design & Build
- Software Tools
- Noise and FFT condundrum