Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: audio2
On Fri, May 24, 2019 at 21:51:35 +0900, Tetsuya Isaki wrote:
> At Thu, 23 May 2019 17:08:42 +0300,
> Valery Ushakov wrote:
> > > +#if defined(__GNUC__)
> > > +/* gcc defines '>>' as ASR. */
> > > +#define AUDIO_ASR(value, shift) ((value) >> (shift))
> > > +#else
> > > +#define AUDIO_ASR(value, shift) ((value) / (1 << (shift)))
> > > +#endif
> >
> > This feels inverted. The mathematically correct operation required
> > here is symmetric division (that rounds towards zero). Arithmetic
> > shift is flooring division (that rounds towards minus infinity).
>
> Both are not correct but are acceptable.
>
> # I also used to feel that division is the correct operation.
> # But I don't think so now.
>
> For example, let's consider to convert 16bits to 15bits.
> In case of round-to-zero,
> 32767, 32766 => 16383
> :
> 3, 2 => 1
> 1, 0 => 0 <---- *1
> -1 => 0 <---- *1
> -2, -3 => -1
> :
> -32766, -32767 => -16383
> -32768 => -16384 <---- *2
>
> In case of round-to-minus-inf,
> 32767, 32766 => 16383
> :
> 3, 2 => 1
> 1, 0 => 0
> -1, -2 => -1
> :
> -32767, -32768 => -16384
>
> As above, in round-to-zero, there are three inputs that output 0
> (*1) and there are only one input that output -16384 (*2).
> In contrast, in round-to-minus-inf, all outputs correspond to two
> input values.
>
> Which is "correct"?
Speaking in the abstract: The operation that happens here is
rescaling, as far as I understand. Yes, the two-complement ranges are
lopsided with an extra value on the negative side, but that is far
less important, I think, than commuting with negation. If you negate
all samples, you have basically the same audio
https://manual.audacityteam.org/man/invert.html ("invert" is a bit
unfortuante as a name b/c of the confusion with the bitwise
operation), so it's nice to have:
-scaleN(sample) = scaleN(-sample)
> The correct operation is not exist whenever rounding to integer
> occurs.
>
> And in audio area, we need to understand that both rounding
> are not correct but are acceptable.
I think you are confusing correctness and precision here.
> Furthermore, we have to consider that this operation is performed
> in the bottom of loop in realtime mixing. If both rounding are
> acceptable, I'd like to use faster one. Of course, unless it is
> "undefined".
>
> > So it feels confusing and wrong to *name* the operation the
> > opposite of what it really is.
>
> What I want to do here is arithmetic right shift operation and 2nd
> argument in this macro indicates shift count. So I named it ASR.
My point is exactly that you are confusing implementation detail that
uses right shift as a good enough implementation (which, I reiterate,
I don't object to here) and what is the meaning of the operation that
you are implementing/approximating (see my first paragraph above).
-uwe
Home |
Main Index |
Thread Index |
Old Index