[LAD] Floating point Denormals: C++ and Waf

Tim Goetze tim at quitte.de
Thu Aug 2 20:11:52 UTC 2012


[David Robillard]

>On Thu, 2012-08-02 at 20:31 +0200, Martin Homuth-Rosemann wrote:
>[...]
>> // denormals are zero
>> static inline float daz( float f )
>> {
>>    // define an aliasing type to perform a "reinterpret cast"
>>    typedef __u32 __attribute__ (( __may_alias__ )) u32bit;
>>    if ( *( (u32bit*)&f ) & 0x7F000000 ) // E > 1 : normal.
>>      return f;
>>    else // E <= 1 : zero or _almost_ denormal
>>         // (may become denormal with next operation)
>>      return 0.0;
>> }
>[...]
>> float reverb( float xin )
>> {
>>    static float yout = 0.0;
>>    static float xv0, xv1, yv0, yv1;
>>    float x, y;
>> 
>>    // additional feedback
>>    x  = daz( xin/8 + yout/64 );
>
>Branch per sample, eeck...

Not to worry about the aliased pointer ...

I think it's almost always a better idea to add an inaudible DC offset
or a square wave at the block interval or at Nyquist, whatever, all
less problematic than this (adorable but potentially slow) solution or
relying on specific FTZ/DAZ-capable hardware to run your code.

Tim



More information about the Linux-audio-dev mailing list