I'd like to create a random number generator based on thermal noise from a resistor, using an opamp to amplify the noise and an inverter to convert the resulting spikes into a digital signal.

Here's my current design:

Resistor thermal noise based generator (revision 0)

When I remove R5 and feed Multisim's thermal noise source (set to 10M ohm / 27C / 1MHz bandwidth) I get perfect results. The output of U2 is noisy, the input of U1A ranges from roughly +12V to -12V, and the output of U1A gives me a random-ish digital output. I plan to feed this to a PIC and do bias correction on there.

The problem is that Multisim's resistors are ideal, or at least ideal enough to not produce any noise. As such, I can't test this. Will it work as I expect, or am I missing something?

Update #1:
I've split the opamp into three stages and introduced a second 10M resistor to make the input midscale. I now get a much higher bandwidth output and my gain is about 10,000. Resistor thermal noise based generator (revision 1)

Update #2:
Ok, I think we're getting there. Some resistor values have been tweaked, and a midpoint has been added. Resistor thermal noise based generator (revision 2)

  • 4
    \$\begingroup\$ Just a comment: You're using a gain of 20000 in a single op amp stage. I would definitely split it into multiple stages for several reasons, one of which is that you'd need a pretty high gain-bandwidth op-amp to achieve that 20000 gain out to a bandwidth of more than a few hundred hertz. \$\endgroup\$ – Jason S Apr 11 '12 at 0:17
  • 1
    \$\begingroup\$ One of my professors in college posed that question with some constraints (I can't remember what they were unfortunately) and showed a proof that the optimal gain per stage was e (=2.718281828...) -- that's a bit low for reality, but I'd guess that a gain of somewhere in the 10-100 range per stage would be appropriate. I'd probably split it into 3 stages myself (with a gain of about 27 per stage), but I don't know your bandwidth requirements. The first stage is going to need to be a low offset-voltage op-amp (come to mention it: you need to split R5 so that U2's + input is midscale). \$\endgroup\$ – Jason S Apr 11 '12 at 0:23
  • 1
    \$\begingroup\$ You're closer... With the op-amps running off of a single supply, your gain will still cause the op-amps to saturate. You need to add gain relative to the midscale of the opamp input range.... so my suggestion to split R5 has probably led you astray... it would be better to create a supply midscale point (e.g. a pair of 1K resistors arranged in a voltage divider, the middle node being the "output", with capacitor bypassing to ground -- 0.1uF probably fine) and then connect all your 1.0K resistors there as well as one 10M resistor between the midscale point and the first + input.... \$\endgroup\$ – Jason S Apr 11 '12 at 1:10
  • 1
    \$\begingroup\$ ...you need to use the same midscale point because if you used two separate midscale points, with a gain of 20,000, if you're even 1mV off that would create a 20V output offset. (Or you could AC-couple each stage.) BTW I am not an expert in noise sources; I think there's a way to do this with one or two HC04s as pseudo-amplifiers, but I can't remember where I saw this. \$\endgroup\$ – Jason S Apr 11 '12 at 1:11
  • 1
    \$\begingroup\$ All looks good except for C2 which should be connected between ground and the midpoint of R12,R11. -40V DC?! methinks the software is getting confused.... what's the input bias current of a 3554AM? \$\endgroup\$ – Jason S Apr 11 '12 at 1:42

you got popcorn noise on front end OA too.. no longer random

OP Amps generate Pop Corn noise unlike thermal brownian motion random noise, so your assumption was invalid. THis works for microwave noise range but not for audio frequency range unless you use low noise OA that is lower than a resistor. Hence your design will not create random number gnerator from the time domain bias of pop corn noise in active parts.

  • 3
    \$\begingroup\$ ... what? I have no idea what you're saying here. \$\endgroup\$ – Polynomial Apr 11 '12 at 3:32
  • 4
    \$\begingroup\$ This isn't an answer really. Post it as a comment instead. \$\endgroup\$ – stevenvh Apr 11 '12 at 5:05
  • \$\begingroup\$ This looks like an answer to the question "I can't test this. Will it work as I expect, or am I missing something?" to me. \$\endgroup\$ – Stefan Paul Noack Apr 11 '12 at 13:03
  • \$\begingroup\$ @noah1989 - The original answer was just the first line, it's been edited since. \$\endgroup\$ – Polynomial Apr 11 '12 at 13:19
  • \$\begingroup\$ Well, I'll accept this since it answers my question. Thanks to Jason S too, for discussing the idea with me :) \$\endgroup\$ – Polynomial Apr 11 '12 at 14:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.