Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: [lpc2000] D/A noise

2006-01-19 by Peter Jakacki

As I sit here typing-up this message I am listening to Pachabels Canon 
being played over a monitor's speakers from an LPC2138. I am not using 
any filtering at all, just feeding the signal as it is directly to the 
monitor. The signal is being sampled a fraction slower than it needs to 
be as I derive the sampling from the VGA interrupts.

Now I can be a bit fussy but I don't have a problem with the sound I 
hear, it's clear and undistorted. Mind you, I have removed most of the 
jitter already because I use a two-stage interrupt process, first time 
to save registers and then sit in an idle loop, then the second a short 
time later which jumps straight into the actual ISR.

The audio playback rate is a simple prescaler off the 31.46KHz 
interrupt. So for 11K samples I divide by 3, for 32K samples just 1. I 
feed both 16-bit or 8-bit signals, both with volume (shifts) adjustment.

BTW, this is running off SD memory as the files are quite large.

When the music stops there is no hiss, I have everything turned-up and 
it is dead quiet.

My analog reference is filtered by a 10K and a 10uf. While the 10K is a 
little large and could definitely be lower it "doesn't hurt things 
none". The analog reference voltage is sitting around 2.5V.

*Peter*


Karl Olsen wrote:
> ---- Original Message ----
> From: "tengelberth" <tengelberth@...>
> To: <lpc2000@yahoogroups.com>
> Sent: Thursday, January 19, 2006 6:53 PM
> Subject: [lpc2000] D/A noise
>
>> I am trying to use the LPC2138 part as a simple voice device (play 16
>> khz voice).  Currently I am using a Keil MCB2130 eval board and
>> running a simple example program that plays 16 bit 8khz wav files via
>> the D/A port through a LM386 to the on board speaker (the wav file has
>> no hiss on my PC).
>>
>> The process works but there is a low level hiss or static in the
>> audio.  I have take the Aout and filtered it with a RLC filter to get
>> rid of the tinness from the audio but still has the hiss.  I also
>> tried using an off board amp and speaker but still have the
>> hiss/static in the audio.
>>
>> If the D/A is not changing then the hiss/static goes away so it does
>> not seem to be noise coupling over.
>>
>> I tried looking at the signal on the scope but can not see anything
>> above the scope noise.
>>
>> I am weak on audio stuff and am hoping to get some pointers.
>>
>> 1. Is this hiss just from the D/A S/N ratio and I am stuck with it??
>
> Probably not.
>
>
>> 2. Is caused by the Vref and V3A being tied with the Digital Vcc?  (If
>> this I would assume it would still get the noise when the D/A is not
>> changing)
>
> Yep, I'd assume that too.
>
>
>> 3. Do I need to filter the Aout better?
>
> When you output 8k samples/sec, you need to filter everything at 4 kHz and
> above away.  Does the hiss sound high-frequency?
>
> An analog filter with a sharp cut-off at just below 4 kHz is tricky.  The
> early CD players had some very high-order analog filters to remove the 22050
> Hz (half of the 44100 Hz sampling frequency) and above.
>
> You can make it easier by oversampling: Create an AOUT signal with finer
> steps that are easier to smooth out by outputting at 16 or 32 kHz (2x or 4x
> oversampling), and create the intermediate values in software by
> interpolating between the known samples.  At 2x, you can do linear
> interpolation by simply outputting the average of the two neighboring known
> samples.  At 4x or 8x, you might need something more advanced than linear
> interpolation -- you want to synthesize a signal that has no frequency
> content above 4 kHz.  At 4x oversampling, your analog filter just needs to
> keep the signal below 4 kHz, and cut away above 16 kHz (half the output rate
> of 32 kHz).  Such a filter is much easier to make.  At 8x oversampling, the
> noise to filter away even gets above the human audible range.
>
>
>> 4. Any other test I should try??
>
> Since the AOUT is only 10 bit, you remove some information from the 16-bit
> signal.  You thereby introduce a rounding error, or distortion, that is
> heard as quantisation noise.  The brain perceives the distorted signal as
> the ideal signal plus some hiss noise.  Each bit gives 6 dB of signal/noise
> ratio, so with 16 bit you can get ~96 dB, with 10 bit ~60 dB of S/N, because
> of quantisation.  You obviously only hear this noise when you output a real
> signal, not when outputting silence.  60 dB is pretty good, so it is
> probably not that you are hearing.
>
> While outputting values with rounding errors gives quantisation noise, just
> as bad is it to output them at the wrong time.  Outputting a sample a little
> too early or late will also introduce distortion to the smoothed analog
> signal.  So you want to output them with as little jitter as possible.
>
> If you output them from a timer interrupt, you'll get a jitter typically a
> few clocks, depending on whether the foreground program had just started a
> multi-cycle instruction that needed to be completed.  In the foreground
> program, you should of course avoid disabling interrupts that could delay
> the interrupt handler excessively.  The best case would probably be if the
> foreground program could be in idle mode every time the interrupt fired,
> this should give zero jitter.  This can of course be difficult if the CPU
> has other tasks than outputting sound.  Try something like this in your
> foreground program:
>
> while (1)
> {
>   /* Enter idle mode, and re-enter it after each interrupt */
>   PCON = 0x01;
> }
>
> To remove jitter you could also try making an external analog sample-hold
> circuit, see http://groups.yahoo.com/group/lpc2000/message/12460 .
>
>
> Karl Olsen

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.