• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC Design
  3. Resistor Noise Calculation using FFT and Noise Analysis...

Stats

  • Locked Locked
  • Replies 7
  • Subscribers 125
  • Views 16224
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Resistor Noise Calculation using FFT and Noise Analysis is different

Nader Fathy
Nader Fathy over 4 years ago

Hello,

I am doing a simple simulation for a circuit noise and found that the FFT spectral measurement gives different results compared to noise simulation. This test bench shows the difference:

  • The circuit is simply a 1kOhm resistor with enabled noise at (Fmin = 1, Fmax = 320kHz) and 300K temp.
  • On running a noise simulation from 1mHz to 10GHz, and plot the output noise of the resistor, I get a noise floor of 20log(sqrt(4kTR)) V/sqrt(Hz) = -167.8 dB (which is correct with high accuracy).
  • On running transient for 998.4msec at a fixed step of 1/320k sec, then measuring the FFT spectrum as shown below, I get the noise floor = -161.9 dB (nearly twice as much noise [i.e. additional 6dB]).

Is there a setting that I am missing?

OS: Redhat 7

Virtuoso: IC6.1.8-64b.500.15

sub-version  19.1.0.541.isr14

Regards,

Nader Sh.

  • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago

    Dear Nader,

    Nader Fathy said:

    • On running a noise simulation from 1mHz to 10GHz, and plot the output noise of the resistor, I get a noise floor of 20log(sqrt(4kTR)) V/sqrt(Hz) = -167.8 dB (which is correct with high accuracy).
    • On running transient for 998.4msec at a fixed step of 1/320k sec, then measuring the FFT spectrum as shown below, I get the noise floor = -161.9 dB (nearly twice as much noise [i.e. additional 6dB]).


    I spent more time than my pride allows me to admit trying to duplicate a couple of your results for what appears to be a very simple circuit and analysis! In any case, I do have some information that may help...but will let you be the judge of that!

    I performed a transient noise analysis using what I believe were your transient noise simulation settings with the exception that I also included a strobeperiod option to eliminate the need for any interpolation by the Cadece dft() function. You may have noted the comment below your Spectrum GUI and I believe this may have lead to interpolation in your data set. In lieu of using the Spectrum Analysis tool, due to an issue I will comment on, I performed a dft() analysis of the output voltage directly using both a Rectangular window and the window you chose (Hanning). You may or may not be aware of it, but the use of the Hanning window impacts the amplitude accuracy of your dft() result and hence it will not provide a gain of 1. A rectangular window preserves the amplitude (i.e., a gain of 1). Hence, since you are comparing small-signal and large-signal noise amplitudes, my thought is you might consider using a Rectangular window. From the dft() results, I computed the noise power in dB/root Hz and in v/root Hz to compare with the expected result for the thermal noise of a 1K resistor at 300K:

    Figure 1 details the resulting analyses for both a Rectangular and your Hanning windows with the noise, expressed in both dB/root Hz and v/root Hz for each window type. Note that the use of the Rectangular window provides a noise consistent with the expected theoretical values while that with the Hanning window is considerably less due to its lower gain. From my experiments with the Spectrum tool, I found it did not update the average power number when I switched its window type from Rectangular to Hanning. Further, I am not sure of the algorithm it is using to compute the noise. However, from my manual use of the dft() function using the parameters shown in Figure 1, its average power for both analyses is totally consistent with what I would expect. I did not open a case with Cadence to explore this potential issue.

    So, in summary, it appears the transient noise analysis doe provide a reasonably accurate estimate of the desired thermal noise power for a 1 K resistor at 300K. Let me know if I overlooked anything in your question Nader!

    Shawn

    Figure 1

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • Nader Fathy
    Nader Fathy over 4 years ago in reply to ShawnLogan

    Dear Shawn,

    Thank you very much for your analysis! I really appreciate it.

    I used strobeperiod = 1/fs = 1/320k = 3.125u, and strobedelay = 0. Here are my trials so far for 1k ohms ideal noisy resistor, at 300K (27C), "conservative" running for 998.4 msec:

    • Using rectangular or hanning window: FFT (N=319488) Noise floor reported in GUI = -161.89dB/sqrt(Hz) (8.044nV/sqrt(Hz)), Expressions:
      • spectrumMeasurement(v("/Vout" ?result "tran") t 0.0 0.9984 319488 1.002 160000.0 2048 "Rectangular" 0.0 0 1 "snrh")
      • spectrumMeasurement(v("/Vout" ?result "tran") t 0.0 0.9984 319488 1.002 160000.0 2048 "hanning" 0.0 0 1 "snrh")
    • Used rectangular or hanning window, then averaged the FFT (N=319488) plotted and got Noise floor of: Rectangular = -164.4dB/sqrt(Hz) (6.025nV/sqrt(Hz)), Hanning = -162.6dB (7.41nV/sqrt(Hz)), expressions:
      • average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 319488 "Rectangular" 1 "default" 1.0)))
      • average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 319488 "Hanning" 1 "default" 1.0)))
    • I used N = 32000 just like in your trial instead, although the spectral resolution in >> 1Hz in this case if a tone is inserted. Got for Rect = -156.2dB/sqrt(Hz), Hann = 154.5dB/sqrt(Hz)
      • average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 32000 "Rectangular" 1 "default" 1.0)))
      • average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 32000 "Hanning" 1 "default" 1.0)))

    I am not sure why my results are not similar to yours, maybe you are using a different expression/settings? Also, the spectrumMeasurment is not very clear on its method of calculation for the noise compared to DFT, the manual doesn't give much insight.

    Kindest Regards,

    Nader Fathy

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago in reply to Nader Fathy

    Dear Nader,

    Well, as happens too often, I just provided an extensive response after logging in and the Cadence forum site dropped my login and erased my response...an abbreviated response to your questions follows...

        Nader Fathy said:
        I used strobeperiod = 1/fs = 1/320k = 3.125u, and strobedelay = 0. Here are my trials so far for 1k ohms ideal noisy resistor, at 300K (27C), "conservative" running for 998.4

    My strobeperiod was set to the variable "strobe_time" whose value was determined from the following variables in my test bench:

    Nader Fathy said:
    Using rectangular or hanning window: FFT (N=319488) Noise floor reported in GUI = -161.89dB/sqrt(Hz) (8.044nV/sqrt(Hz)), Expressions:

        spectrumMeasurement(v("/Vout" ?result "tran") t 0.0 0.9984 319488 1.002 160000.0 2048 "Rectangular" 0.0 0 1 "snrh")
        spectrumMeasurement(v("/Vout" ?result "tran") t 0.0 0.9984 319488 1.002 160000.0 2048 "hanning" 0.0 0 1 "snrh")



    As I mentioned in my prior posting, I observed the same incorrect behavior with the spectreumMeasurement() function from the Spectrum GUI. The use of the Hanning window should not result in the same noise floor as the use of a Rectangular window. I did not open a Cadence SR to better understand their result.

    Nader Fathy said:
    Used rectangular or hanning window, then averaged the FFT (N=319488) plotted and got Noise floor of: Rectangular = -164.4dB/sqrt(Hz) (6.025nV/sqrt(Hz)), Hanning = -162.6dB (7.41nV/sqrt(Hz)), expressions:

        average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 319488 "Rectangular" 1 "default" 1.0)))
        average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 319488 "Hanning" 1 "default" 1.0)))



    A comment - the use of the average function needs to be on the linear amplitude data - not the logarithmic data. The average of a series of data is not the same as the average of the logarithms of the data series due to the non-linear logarithmic function. Hence, you might consider modifying your expression to take the average of your linear data.

    Secondly, since you are interested in the noise expressed in dB/root Hz, you should include the normalizing frequency bin width. Although you have your  bin width set to 1 Hz, the normalization should not matter, it is best to include it for future experiments where the bin width is not 1 Hz.

    Nader Fathy said:
    I used N = 32000 just like in your trial instead, although the spectral resolution in >> 1Hz in this case if a tone is inserted. Got for Rect = -156.2dB/sqrt(Hz), Hann = 154.5dB/sqrt(Hz)

        average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 32000 "Rectangular" 1 "default" 1.0)))
        average(dB20(dft(v("/Vout" ?result "tran") 0 0.9984 32000 "Hanning" 1 "default" 1.0)))




    Now, your strobe time does not correspond to the samples you requested for the dft() and hence your results will have interpolation errors. For such a low noise floor, the interpolation error may impact the accuracy of your result when computed correctly (ie., include non-unit frequency bin width and using averaging on linear data).

    I will attach a compressed version of the Microsoft Excel workbook I used to perform the noise floor computations in my follow-on post (due to size). The specific dft() functions I used were:

    dft(VT("/vout")  0 998.4m 320000 "Rectangular" 0 0 1) dft(VT("/vout")  0 998.4m 320000 "Hanning" 0 0 1)


    and their data is in the workbook tab "dft.csv" with the noise computations in tab "dft_noise_data" and the plot I provided in my prior post in tab "dft_noise_plot". I hope you can follow the computations as they are relatively straight forward - I hope anyway!


    Shawn

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago in reply to ShawnLogan

    Dear Nader,

    A link to the compressed Excel file is at URL:

    https://1drv.ms/u/s!AnM-GsAEZPoSrEQAwwik0IHWyAv6?e=bp2cts

    The link will work for 1 week.

    Shawn

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago in reply to ShawnLogan

    Dear Nader and Andrew,

    As a follow-up and since I read that Andrew has recently filed a CCR, one item I did not mention to either of you was in the process of trying to duplicate Nader's AC noise results for the 1K ideal, but noisy, analogLib resistor, I found I was consistently getting a noise value of about 2.89 nV/root Hz in lieu of the expected value of 4.7 nV/root Hz. This was puzzling to me and I spent a good deal of time trying to determine why the small-signal noise result was not as expected. The 2.89 nV/root Hz value was actually exactly 1/root 2 of the desired 4.7 nV/root Hz correct noise value.

    After much work and filing an SR with Cadence (Case 46528166, Raj Patel), I found that the use of the +dcopt command line option combined with the spectre simulator leads to an incorrect simulation result for the noise of the 1K resistor. A summary of the experiments I ran, the versions of the tool I am using and the CCR that Raj filed for me.

    $ spectre -W
    sub-version  19.1.0.428.isr9 
    $ virtuoso -W
    sub-version  ICADVM20.1-64b.500.17

    1. spectre X with or without the +dcopt command line option provides the correct noise of Noise = 4.071 nV/root Hz at 1.000 MHz.

    2. spectre +aps only provides the correct noise result without +dcopt:

    • a. spectre +aps with +dcopt command line option: Noise = 2.879 nV/root Hz at 1.000 MHz (incorrect value)
    • b. spectre +aps without +dcopt option: Noise = 4.071 nV/root Hz at 1.000 MHz (correct value)

    3. spectre only provides the correct noise result without +dcopt:

    • a. spectre only with +dcopt command line option: Noise = 2.879 nV/root Hz at 1.000 MHz (incorrect value)
    • b. spectre only without +dcopt command line option: Noise = 4.071 nV/root Hz at 1.000 MHz (correct value)

    Raj filed CCR 2484730 with the test case I provided and these results.

    Shawn

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • Nader Fathy
    Nader Fathy over 4 years ago in reply to ShawnLogan

    Hi Shawn,

    Thank you very much for all your analysis! Indeed I was wrong in calculating the average of dB instead of averaging the actual results. However, I am still not getting the correct results from my side.

    I will get back to analyzing the issue asap and let you know if I catch the any issues that might lead to the incorrect results of noise.

    Kindest Regards,

    Nader Fathy

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • ShawnLogan
    ShawnLogan over 4 years ago in reply to Nader Fathy

    Dear Nader,

    Nader Fathy said:
    However, I am still not getting the correct results from my side.

    Rats! I was hoping that you were able to get the expected transient noise results based on the comments and the example in the Excel workbook...oh well...

    It seems as if your last example should have resulted in the same result I got if you adjusted your strobeperiod to 998.4 ms/320K (which is what I set it to). I also only saved the strobe points (i.e., did not highlight the GUI radio button to "all".

    Good luck Nader,

    Shawn 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information