@@ -35,8 +35,8 @@ namespace Binaural
3535 listenerHeadRadius{_listenerHeadRadius},
3636 listenerILDAttenutationDB{ ILDATTENUATION },
3737 enableDirectionality {false , false },
38- anechoicDirectionalityAttenuation {0 .0f , 0 .0f },
39- reverbDirectionalityAttenuation { 0 .0f , 0 .0f }
38+ anechoicDirectionalityLinearAttenuation {0 .0f , 0 .0f },
39+ reverbDirectionalityLinearAttenuation { 0 .0f , 0 .0f }
4040 {
4141 std::unique_ptr<CHRTF> a (new CHRTF (this )); // HRTF of listener
4242 listenerHRTF = std::move (a);
@@ -222,60 +222,86 @@ namespace Binaural
222222 }
223223 if (ear == Common::T_ear::LEFT)
224224 {
225- anechoicDirectionalityAttenuation .left = _directionalityAttenuation;
226- reverbDirectionalityAttenuation .left = CalculateReverbDirectionalityAttenuation (_directionalityAttenuation);
225+ anechoicDirectionalityLinearAttenuation .left = std::pow ( 10 , _directionalityAttenuation / 20 ) ;
226+ reverbDirectionalityLinearAttenuation .left = CalculateReverbDirectionalityLinearAttenuation (_directionalityAttenuation);
227227 }
228228 if (ear == Common::T_ear::RIGHT)
229229 {
230- anechoicDirectionalityAttenuation .right = _directionalityAttenuation;
231- reverbDirectionalityAttenuation .right = CalculateReverbDirectionalityAttenuation (_directionalityAttenuation);
230+ anechoicDirectionalityLinearAttenuation .right = std::pow ( 10 , _directionalityAttenuation / 20 ) ;
231+ reverbDirectionalityLinearAttenuation .right = CalculateReverbDirectionalityLinearAttenuation (_directionalityAttenuation);
232232 }
233233 }
234234
235235 float CListener::GetAnechoicDirectionalityAttenuation_dB (Common::T_ear ear) const
236236 {
237237 if (ear == Common::T_ear::LEFT)
238- return anechoicDirectionalityAttenuation .left ;
238+ return 20 * std::log (anechoicDirectionalityLinearAttenuation .left );
239239 if (ear == Common::T_ear::RIGHT)
240- return anechoicDirectionalityAttenuation .right ;
240+ return 20 * std::log (anechoicDirectionalityLinearAttenuation .right ) ;
241241 return -1 .0f ;
242242 }
243-
243+
244+ float CListener::GetAnechoicDirectionalityLinearAttenuation (Common::T_ear ear) const
245+ {
246+ if (ear == Common::T_ear::LEFT)
247+ return anechoicDirectionalityLinearAttenuation.left ;
248+ if (ear == Common::T_ear::RIGHT)
249+ return anechoicDirectionalityLinearAttenuation.right ;
250+ return -1 .0f ;
251+ }
252+
244253 float CListener::GetReverbDirectionalityAttenuation_dB (Common::T_ear ear) const
245254 {
246255 if (ear == Common::T_ear::LEFT)
247- return reverbDirectionalityAttenuation .left ;
256+ return 20 * std::log (reverbDirectionalityLinearAttenuation .left ) ;
248257 if (ear == Common::T_ear::RIGHT)
249- return reverbDirectionalityAttenuation .right ;
258+ return 20 * std::log (reverbDirectionalityLinearAttenuation .right ) ;
250259 return -1 .0f ;
251260 }
252261
253- float CListener::CalculateReverbDirectionalityAttenuation (float directionalityExtend_dB)
262+ float CListener::GetReverbDirectionalityLinearAttenuation (Common::T_ear ear) const
263+ {
264+ if (ear == Common::T_ear::LEFT)
265+ return reverbDirectionalityLinearAttenuation.left ;
266+ if (ear == Common::T_ear::RIGHT)
267+ return reverbDirectionalityLinearAttenuation.right ;
268+ return -1 .0f ;
269+ }
270+
271+ float CListener::CalculateReverbDirectionalityLinearAttenuation (float directionalityExtend_dB)
254272 {
255273
256274 float angle_rad = 0 ;
257275 float angleStep = M_PI / (float )NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB;
258276 float v = 0 ;
277+
259278 for (int c = 0 ; c <= NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB; c++)
260279 {
261- v += CalculateDirectionalityAttenuation (directionalityExtend_dB, angle_rad) * std::sin (angle_rad);
280+ // Weighted sum of the directionality of the sphere rings
281+ v += std::pow (CalculateDirectionalityLinearAttenuation (directionalityExtend_dB, angle_rad),2 ) * std::sin (angle_rad);
262282 angle_rad += angleStep;
263283 }
264-
265- v = 0.5 * v / (NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB + 1 );
266-
267- v = std::pow (10.0 , v / 20.0 );
284+ // Normalizing (making omnidirectional non-attenuating)
285+ v = std::sqrt (v /(2 * (NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB + 1 )));
268286
269287 return v;
270288 }
271289
272- float CListener::CalculateDirectionalityAttenuation ( float directionalityExtend, float angleToForwardAxis_rad)
290+ float CListener::CalculateDirectionalityLinearAttenuation ( float directionalityExtend, float angleToForwardAxis_rad)
273291 {
274- if (directionalityExtend > 30 ) directionalityExtend = 30 .0f ;
292+ if (directionalityExtend > 30 ) directionalityExtend = 30 .0f ;
293+ else if (directionalityExtend < 0 ) directionalityExtend = 0 .0f ;
294+
275295 float directionalityFactor = 0 .5f - 0 .5f * std::pow (10 , -directionalityExtend / 20 );
276- float directionalityAttenuation = 1 - directionalityFactor + (directionalityFactor)* std::cos (angleToForwardAxis_rad);
277- return ( 20 * std::log10 (directionalityAttenuation) );
296+
297+ return 1 - directionalityFactor + directionalityFactor * std::cos (angleToForwardAxis_rad );
278298 }
299+
300+ float CListener::CalculateDirectionalityAttenuation_dB (float directionalityExtend, float angleToForwardAxis_rad)
301+ {
302+ return 20 .0f * log10 (CalculateDirectionalityLinearAttenuation (directionalityExtend, angleToForwardAxis_rad));
303+ }
304+
279305
280306 int CListener::GetHRTFResamplingStep () const
281307 {
0 commit comments