Deutsch English Français Italiano |
<vvfvvl$13ns7$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Bill Sloman <bill.sloman@ieee.org> Newsgroups: sci.electronics.design,comp.dsp Subject: Re: DDS question: why sine lookup? Date: Thu, 8 May 2025 01:58:38 +1000 Organization: A noiseless patient Spider Lines: 126 Message-ID: <vvfvvl$13ns7$1@dont-email.me> References: <o3ak1k9ifikv6c1tmfnd89k6vfj4vigj37@4ax.com> <vvdm8h$3i2ju$2@dont-email.me> <7dd00187-0adf-9f30-dc8b-f6a123ef08e8@electrooptical.net> <9u2l1kh2o87dmqec5o69paej05htbvi714@4ax.com> <nnd$25b8629f$1dc955d4@d3121bed5460d21e> <a3om1klofoht6uf45dosvntdnf0phc0t4d@4ax.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 07 May 2025 17:58:46 +0200 (CEST) Injection-Info: dont-email.me; posting-host="bc8050660e7eef80f959528af1c69d84"; logging-data="1171335"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18SUGWEYaqgXuNtnSpHy+/FWMGXpwWvjHg=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:i00QnyioafDc3MCvHxPQ6VklKK0= X-Antivirus: Norton (VPS 250507-2, 7/5/2025), Outbound message Content-Language: en-US In-Reply-To: <a3om1klofoht6uf45dosvntdnf0phc0t4d@4ax.com> X-Antivirus-Status: Clean Bytes: 6630 On 7/05/2025 11:32 pm, john larkin wrote: > On Wed, 7 May 2025 11:44:23 +0200, Arie de Muijnck <noreply@ademu.nl> > wrote: > >> On 2025-05-07 00:50, john larkin wrote: >>> On Tue, 6 May 2025 16:46:16 -0400, Phil Hobbs >>> <pcdhSpamMeSenseless@electrooptical.net> wrote: >>> >>>> On 2025-05-06 15:00, Jeroen Belleman wrote: >>>>> On 5/6/25 17:48, john larkin wrote: >>>>>> A DDS clock generator uses an NCO (a phase accumulator) and takes some >>>>>> number of MSBs, maps through a sine lookup table, drives a DAC and a >>>>>> lowpass filter and finally a comparator. The DAC output gets pretty >>>>>> ratty near Nyquist, and the filter smooths out and interpolates the >>>>>> steps and reduces jitter. >>>>>> >>>>>> But why do the sine lookup? Why not use the phase accumulator MSBs >>>>>> directly and get a sawtooth, and filter that? >>>>>> >>>>>> The lowpass filter looks backwards in time for a bunch of ugly samples >>>>>> to average into a straight line. The older sine samples are the wrong >>>>>> polarity! If the filter impulse response is basically zero over the >>>>>> period of the sawtooth, and we compare near the peak, we'll average a >>>>>> lot of steps and forget the big sawtooth reset. [...] >>>>> >>>>> Two things are immediately obvious: First, the sawtooth will have >>>>> a variable frequency, and the filter won't have a zero response >>>>> for all possible frequencies. >>>>> >>>>> Second, the usual reconstruction filters do *not* interpolate >>>>> into straight lines. >>>>> >>>>> Beyond that, I would have to think this over a bit more. >>>>> >>>>> Jeroen Belleman >>>>> >>>>> >>>>> >>>> >>>> You don't want to use a sawtooth if you can help it, because it has huge >>>> contributions from all harmonic orders. It also puts a lot of demands >>>> on the slew rate and settling of the DAC and any amplifiers used in the >>>> filtering. Errors there are of course nonlinear, because once an amp is >>>> in slew limiting, it stops responding to its inputs for a bit. >>> >>> I was thinking that my DAC is just 5 or 6 resistors hanging off some >>> FPGA pins, and that drives a 3rd order (CLC) LC filter and the >>> comparator. So no opamps. >>> >>> >>> >>>> >>>> It also emphasizes the close-in spurs. Say you have two N-bit DDSes >>>> running at the same average frequency but different phases. The DAC >>>> samples only the M high-order bits. It happens that at time t=0 the >>>> accumulator overflows on the same clock cycle on both. >>>> >>>> This will continue to happen until one of them overflows a cycle early >>>> because the bottom N-M bits rolled over. >>>> >>>> The resulting voltage difference between them is a full-scale, >>>> one-clock-wide pulse, followed by a noisy baseline as the bottom N-M >>>> bits roll over into the DAC's LSB at different times. This will repeat >>>> every cycle until the other DDS catches up. This scenario will play out >>>> some number of times in a full period, i.e. the least common multiple of >>>> the accumulator size and the increment in clocks. >>>> >>>> The energy in that glitch is much larger than in the noisy baseline, and >>>> its timing is variable in complicated ways. >>>> >>>> A triangle would be better, and of course that could be done pretty >>>> simply, e.g. with a flip flop controlling a bunch of XOR gates, if you >>>> don't mind halving the frequency. >>>> >>>> Once you have a lookup table, a sine is as easy as anything else, and >>>> minimizes the demands on the DAC, filters and amplifiers. >>>> >>>> Cheers >>>> >>>> Phil Hobbs >>> >>> If I'm using, say, 8 MS phase accumulator bits and a 5-bit DAC and >>> synthesizing one octave of frequency, the sine table is no big deal. >>> 256 bytes of RAM per DDS unfolded. >>> >>> I've been playing with sims. The sawtooth works OK but may be too >>> cute. I'll compare it to sines. >>> >>> The pseudo-DAC output is always positive. It can go into one >>> comparator input and I can RC lowpass filter same into the other, to >>> switch on the waveform midpoint. >>> >>> I reall need to get my FPGA kids to run the phase accumulator at 160 >>> MHz. Run way below Nyquist. >>> >> >> >> Can't you fold the LIN to SIN conversion in the resistor values? > > I don't know. You really ought to find out. Hanging resistors on successive taps of a shift register creates a Finite Impulse Response Filter. You have to taper the resistor values with a Hamming window to avoid Gibbs oscillations - I found out about that the hard way, but it isn't difficult. You can certainly use one to convert a square wave into a pretty good approximation to a sine wave. It doesn't lend itself to non-integer frequency division. > I can buy a small cheap R-2R resistor network, and a 8-8 > bit sine lookup is easy in an FPGA. I ended up having to use 10ppm 0.1% E96 resistors, and the more critical to get each resistance sufficiently correct, but I used a fairly long shift register. I was quite fond of the female bat acoustician I put the gear together for, and went in for a bit of over-kill. > Resistors are linear and sine is nonlinear. Not a relevant point. -- Bill Sloman, Sydney