Tom, if you're chopping out the lower bits, try instead rounding up
from the 11th bit (i.e: treat 20 to 5f as 40, 60 to 9f as 80, etc.).
This should give you 1/2 bit more accuracy, if I'm not wrong.
Something like this:
unsigned short x;
x = NextSample();
if( x >= 0x8000 ) // Provided 0x8000 is the 'center' value
x += 0x20; // D/A will chop the lower bits
else
x -= 0x20; // D/A will chop the lower bits
Guille
PS: Also, a sine wave function could give you some more hints. Try
using a sine table.
--- In lpc2000@yahoogroups.com, "Karl Olsen" <kro@p...> wrote:
>
> ---- Original Message ----
> From: "tengelberth" <tengelberth@y...>
> 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
>Message
Re: D/A noise
2006-01-19 by Guillermo Prandi
Attachments
- No local attachments were found for this message.