• 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. RF Design
  3. how to capture 1/f noise in spectre

Stats

  • Locked Locked
  • Replies 2
  • Subscribers 63
  • Views 4535
  • 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

how to capture 1/f noise in spectre

pureck
pureck over 15 years ago

Hello

 I am designing a down-converter and need to capture 1/f noise corner. I need to find a way to capture the corner automatically after simulation (PSS and Pnoise) instead of using rulers to find it.

Does anyone know how to grab it automatically?

 

Thanks much in advance.

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago

    Not exactly sure how you intended to determine where the 1/f corner is, but here's an example I put together to find the point in a phase noise curve of an oscilator where it moves from -30dBc/decade to -20dBc/decade (transition from flicker to thermal):

    ;------------------------------------------------------------------------
    ; In this example look for change in slope of a phase noise curve
    ;------------------------------------------------------------------------
    pn=phaseNoise(1 "pss_fd" ?result "pnoise")
    ;------------------------------------------------------------------------
    ; Convert the x-axis into the log (base 10) of frequency
    ;------------------------------------------------------------------------
    decade=log10(xval(pn))
    ;------------------------------------------------------------------------
    ; And then get the phase noise versus this - this means that now we
    ; have phase noise versus the decade number
    ;------------------------------------------------------------------------
    pnVsDecade=abChangeXAxis(pn decade)
    ;------------------------------------------------------------------------
    ; Now the slope is in db/decade
    ;------------------------------------------------------------------------
    slope=deriv(pnVsDecade)
    ;------------------------------------------------------------------------
    ; in a phase noise curve, starts at -30dB/decade, and then goes to -20dB/decade
    ; decide the point at which you consider the "corner" (given that it's a
    ; transition over a decade or two
    ;------------------------------------------------------------------------
    freqDec=cross(slope -28)
    ;------------------------------------------------------------------------
    ; Convert back to frequency (from decade)
    ;------------------------------------------------------------------------
    freq=10**freqDec

    This uses this code to change the X axis:

    /* abChangeXAxis.il

    Author A.D.Beckett
    Group Custom IC (UK), Cadence Design Systems Ltd.
    Language SKILL
    Date May 25, 1999
    Modified May 21, 2002
    By A.D.Beckett

    Function to change the X Axis of a waveform to the corresponding
    Y values of the second variable.

    Also function to transpose the X and Y axes of a waveform.

    Now handles families, and can be registered as a special function.
    Just call:

    abRegChangeXAxis()

    to add to the calculator.

    ***************************************************

    SCCS Info: @(#) abChangeXAxis.il 11/27/08.09:59:36 1.3

    */


    /*******************************************************************
    * *
    * (abChangeXAxis yVar xVar) *
    * *
    * Return a new waveform object with the x axis set to the y values *
    * of the second argument. *
    * *
    *******************************************************************/


    (procedure (abChangeXAxis yVar xVar)
    (let (newWave)
    (cond
    ;------------------------------------------------------------------
    ; Handle normal waveform
    ;------------------------------------------------------------------
    ((drIsWaveform yVar)
    (setq newWave (drCreateEmptyWaveform))
    (drPutWaveformXVec newWave (drGetWaveformYVec xVar))
    (if (eq (drGetWaveformXVec yVar) (drGetWaveformXVec xVar))
    ;---------------------------------------------------------------
    ; if the x axes are the same for both, it's simple
    ;---------------------------------------------------------------
    (drPutWaveformYVec newWave (drGetWaveformYVec yVar))
    ;---------------------------------------------------------------
    ; otherwise need to use value() to interpolate
    ;---------------------------------------------------------------
    (let (xVec yVec len)
    (setq xVec (drGetWaveformXVec xVar))
    (setq len (drVectorLength xVec))
    (setq yVec (drCreateVec (drGetWaveformYType yVar) len))
    (for ind 0 (sub1 len)
    (drAddElem yVec (value yVar (drGetElem xVec ind)))
    )
    (drPutWaveformYVec newWave yVec)
    )
    )
    newWave
    )
    ;------------------------------------------------------------------
    ; Handle family
    ;------------------------------------------------------------------
    ((famIsFamily yVar)
    (famMap 'abChangeXAxis yVar xVar)
    ) ; is family
    (t
    (error "abChangeXAxis - can't handle %L\n" yVar)
    )
    ) ; cond
    ) ; let
    ) ; defun

    /**********************************************************************
    * *
    * (abRegChangeXAxis) *
    * *
    * Registers abChangeXAxis as a new special function in the calculator *
    * *
    **********************************************************************/


    (procedure (abRegChangeXAxis)
    (calRegisterSpecialFunction
    (list "abChangeXAxis" 'abChangeXAxisCB)
    )
    t
    )

    /***************************************************************************
    * *
    * (abChangeXAxisCB) *
    * *
    * Callback function for the special function - which builds the expression *
    * *
    ***************************************************************************/


    (procedure (abChangeXAxisCB)
    (calSpecialFunctionInput 'abChangeXAxis '(STACK))
    )

    /***************************************************************
    * *
    * (abTransposeXY var) *
    * *
    * Swap the X and Y axes of a variable *
    * *
    ***************************************************************/


    (procedure (abTransposeXY var)
    (let (newWave)
    (setq newWave (drCreateEmptyWaveform))
    (drPutWaveformXVec newWave (drGetWaveformYVec var))
    (drPutWaveformYVec newWave (drGetWaveformXVec var))
    newWave
    )
    )

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • pureck
    pureck over 15 years ago

    Hello Andrew,

     Thanks a lot. It works.

    One thing in flicker noise differs from PN is that it is 10dB/dec and we define 1/f noise corner at the point where a straight line (10dB/dec) of the flicker noise meets a horizonal line (0dB/dec) of the thermal noise as you may already know.

    Now it is a little difficult to decide the corner at what slope which can best interpret the real corner frequency. I guess it is up to designers' interpretation.

     Thanks a lot for your help.

    • 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