@@ -222,60 +222,85 @@ namespace Binaural
222222 }
223223 if (ear == Common::T_ear::LEFT )
224224 {
225- anechoicDirectionalityAttenuation.left = _directionalityAttenuation;
225+ anechoicDirectionalityAttenuation.left = std::pow ( 10 , _directionalityAttenuation / 20 ) ;
226226 reverbDirectionalityAttenuation.left = CalculateReverbDirectionalityAttenuation (_directionalityAttenuation);
227227 }
228228 if (ear == Common::T_ear::RIGHT )
229229 {
230- anechoicDirectionalityAttenuation.right = _directionalityAttenuation;
230+ anechoicDirectionalityAttenuation.right = std::pow ( 10 , _directionalityAttenuation / 20 ) ;
231231 reverbDirectionalityAttenuation.right = CalculateReverbDirectionalityAttenuation (_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 (anechoicDirectionalityAttenuation.left );
239+ if (ear == Common::T_ear::RIGHT )
240+ return 20 * std::log (anechoicDirectionalityAttenuation.right );
241+ return -1 .0f ;
242+ }
243+
244+ float CListener::GetAnechoicDirectionalityLinearAttenuation (Common::T_ear ear) const
245+ {
246+ if (ear == Common::T_ear::LEFT )
247+ return anechoicDirectionalityAttenuation.left ;
239248 if (ear == Common::T_ear::RIGHT )
240249 return anechoicDirectionalityAttenuation.right ;
241250 return -1 .0f ;
242251 }
243-
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 ( reverbDirectionalityAttenuation.left ) ;
248257 if (ear == Common::T_ear::RIGHT )
249- return reverbDirectionalityAttenuation.right ;
258+ return 20 * std::log ( reverbDirectionalityAttenuation.right ) ;
250259 return -1 .0f ;
251260 }
252261
262+ float CListener::GetReverbDirectionalityLinearAttenuation (Common::T_ear ear) const
263+ {
264+ if (ear == Common::T_ear::LEFT )
265+ return reverbDirectionalityAttenuation.left ;
266+ if (ear == Common::T_ear::RIGHT )
267+ return reverbDirectionalityAttenuation.right ;
268+ return -1 .0f ;
269+ }
270+
253271 float CListener::CalculateReverbDirectionalityAttenuation (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+ v += std::pow ( CalculateDirectionalityLinearAttenuation ( directionalityExtend_dB, angle_rad), 2 );
262281 angle_rad += angleStep;
263282 }
264283
265- v = 0.5 * v / (NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB + 1 );
266-
267- v = std::pow (10.0 , v / 20.0 );
284+ v = std::sqrt (v / NUM_STEPS_TO_INTEGRATE_CARDIOID_FOR_REVERB );
268285
269286 return v;
270287 }
271288
272- float CListener::CalculateDirectionalityAttenuation ( float directionalityExtend, float angleToForwardAxis_rad)
289+ float CListener::CalculateDirectionalityLinearAttenuation ( float directionalityExtend, float angleToForwardAxis_rad)
273290 {
274- if (directionalityExtend > 30 ) directionalityExtend = 30 .0f ;
291+ if (directionalityExtend > 30 ) directionalityExtend = 30 .0f ;
292+ else if (directionalityExtend < 0 ) directionalityExtend = 0 .0f ;
293+
275294 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));
295+
296+ return 1 - directionalityFactor + directionalityFactor * std::cos (angleToForwardAxis_rad);
297+ }
298+
299+ float CListener::CalculateDirectionalityAttenuation_dB (float directionalityExtend, float angleToForwardAxis_rad)
300+ {
301+ return 20 .0f * log10 (CalculateDirectionalityLinearAttenuation (directionalityExtend, angleToForwardAxis_rad));
278302 }
303+
279304
280305 int CListener::GetHRTFResamplingStep () const
281306 {
0 commit comments