async input: default constructor arguments for noise-shaping and dither set to false example: comment updateddds
| @@ -82,6 +82,21 @@ void Quantizer::configure(bool noiseShaping, bool dither, float factor){ | |||
| _noiseShaping=noiseShaping; | |||
| _dither=dither; | |||
| _factor=factor; | |||
| if (_dither){ | |||
| _factor-=1.f; | |||
| } | |||
| if (_noiseShaping){ | |||
| // the maximum rounding error is 0.5 | |||
| // Assuming the rounding errors of the last NOISE_SHAPE_F_LENGTH samples was 0.5 at the positive noise-shaping-coefficients and -0.5 at the negative coefficients, | |||
| // the maximum added value can be computed as follows: | |||
| float* f=_noiseSFilter; | |||
| float maxAddedVal=0.f; | |||
| for (uint16_t j =0; j< NOISE_SHAPE_F_LENGTH; j++){ | |||
| maxAddedVal+=abs(*f++); | |||
| } | |||
| maxAddedVal/=2.f; | |||
| _factor-=maxAddedVal; | |||
| } | |||
| reset(); | |||
| } | |||
| void Quantizer::reset(){ | |||
| @@ -141,7 +156,7 @@ void Quantizer::quantize(float* input, int16_t* output, uint16_t length){ | |||
| *output=(int16_t)_factor; | |||
| } | |||
| else if (xnDR < -_factor){ | |||
| *output=(int16_t)_factor; | |||
| *output=-(int16_t)_factor; | |||
| } | |||
| else { | |||
| *output=(int16_t)xnDR; | |||
| @@ -43,7 +43,7 @@ public: | |||
| ///@param attenuation target attenuation [dB] of the anti-aliasing filter. Only used if AUDIO_SAMPLE_RATE_EXACT < input sample rate (input fs). The attenuation can't be reached if the needed filter length exceeds 2*MAX_FILTER_SAMPLES+1 | |||
| ///@param minHalfFilterLength If AUDIO_SAMPLE_RATE_EXACT >= input fs), the filter length of the resampling filter is 2*minHalfFilterLength+1. If AUDIO_SAMPLE_RATE_EXACT < input fs the filter is maybe longer to reach the desired attenuation | |||
| ///@param maxHalfFilterLength Can be used to restrict the maximum filter length at the cost of a lower attenuation | |||
| AsyncAudioInputSPDIF3(bool dither=true, bool noiseshaping=true,float attenuation=100, int32_t minHalfFilterLength=20, int32_t maxHalfFilterLength=80); | |||
| AsyncAudioInputSPDIF3(bool dither=false, bool noiseshaping=false,float attenuation=100, int32_t minHalfFilterLength=20, int32_t maxHalfFilterLength=80); | |||
| ~AsyncAudioInputSPDIF3(); | |||
| void begin(); | |||
| virtual void update(void); | |||
| @@ -1,7 +1,7 @@ | |||
| #include <Audio.h> | |||
| AsyncAudioInputSPDIF3 spdifIn(false, false, 100, 20, 80); //dither = true, noiseshaping = true, anti-aliasing attenuation=100dB, minimum half resampling filter length=20, maximum half resampling filter length=80 | |||
| AsyncAudioInputSPDIF3 spdifIn(false, false, 100, 20, 80); //dither = false, noiseshaping = false, anti-aliasing attenuation=100dB, minimum half resampling filter length=20, maximum half resampling filter length=80 | |||
| AudioOutputSPDIF3 spdifOut; | |||
| AudioConnection patchCord1(spdifIn, 0, spdifOut, 0); | |||