ese 519

Dependents:   PROJECT_3D_AUDIO

Committer:
niv17
Date:
Tue Apr 07 21:09:22 2015 +0000
Revision:
0:2076b4d80327
sonic initial april 7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
niv17 0:2076b4d80327 1 /*############################################################################*/
niv17 0:2076b4d80327 2 /*# #*/
niv17 0:2076b4d80327 3 /*# MIT HRTF C Library #*/
niv17 0:2076b4d80327 4 /*# Copyright � 2007 Aristotel Digenis #*/
niv17 0:2076b4d80327 5 /*# #*/
niv17 0:2076b4d80327 6 /*# Filename: mit_hrtf_lib.c #*/
niv17 0:2076b4d80327 7 /*# Version: 0.1 #*/
niv17 0:2076b4d80327 8 /*# Date: 04/05/2007 #*/
niv17 0:2076b4d80327 9 /*# Author(s): Aristotel Digenis (adigenis@users.sourceforge.net) #*/
niv17 0:2076b4d80327 10 /*# Credit: Bill Gardner and Keith Martin #*/
niv17 0:2076b4d80327 11 /*# Licence: GNU Library or Lesser General Public License (LGPL) #*/
niv17 0:2076b4d80327 12 /*# #*/
niv17 0:2076b4d80327 13 /*############################################################################*/
niv17 0:2076b4d80327 14
niv17 0:2076b4d80327 15
niv17 0:2076b4d80327 16 #include "../include/mit_hrtf_lib.h"
niv17 0:2076b4d80327 17 #include "../MIT_HRTF_Library/source/normal/mit_hrtf_normal_44100.h"
niv17 0:2076b4d80327 18 #include "../MIT_HRTF_Library/source/diffuse/mit_hrtf_diffuse_44100.h"
niv17 0:2076b4d80327 19 #include "../MIT_HRTF_Library/source/normal/mit_hrtf_normal_48000.h"
niv17 0:2076b4d80327 20 #include "../MIT_HRTF_Library/source/diffuse/mit_hrtf_diffuse_48000.h"
niv17 0:2076b4d80327 21 #include "../MIT_HRTF_Library/source/normal/mit_hrtf_normal_88200.h"
niv17 0:2076b4d80327 22 #include "../MIT_HRTF_Library/source/diffuse/mit_hrtf_diffuse_88200.h"
niv17 0:2076b4d80327 23 #include "../MIT_HRTF_Library/source/normal/mit_hrtf_normal_96000.h"
niv17 0:2076b4d80327 24 #include "../MIT_HRTF_Library/source/diffuse/mit_hrtf_diffuse_96000.h"
niv17 0:2076b4d80327 25
niv17 0:2076b4d80327 26
niv17 0:2076b4d80327 27 /* Internal functions for handling the indexing of the -/+40 degree elevation
niv17 0:2076b4d80327 28 data which has irregular azimuth positions. */
niv17 0:2076b4d80327 29 int mit_hrtf_findAzimuthFor40Elev(int azimuth);
niv17 0:2076b4d80327 30 int mit_hrtf_findIndexFor40Elev(int azimuth);
niv17 0:2076b4d80327 31
niv17 0:2076b4d80327 32
niv17 0:2076b4d80327 33
niv17 0:2076b4d80327 34 unsigned int mit_hrtf_availability(int azimuth, int elevation, unsigned int samplerate, unsigned int diffused)
niv17 0:2076b4d80327 35 {
niv17 0:2076b4d80327 36 if(elevation > 90 || elevation < -40)
niv17 0:2076b4d80327 37 return 0;
niv17 0:2076b4d80327 38
niv17 0:2076b4d80327 39 if(azimuth > 180 || azimuth < -180)
niv17 0:2076b4d80327 40 return 0;
niv17 0:2076b4d80327 41
niv17 0:2076b4d80327 42 if(diffused > 1)
niv17 0:2076b4d80327 43 return 0;
niv17 0:2076b4d80327 44
niv17 0:2076b4d80327 45 if(samplerate == 44100)
niv17 0:2076b4d80327 46 return MIT_HRTF_44_TAPS;
niv17 0:2076b4d80327 47 else if(samplerate == 48000)
niv17 0:2076b4d80327 48 return MIT_HRTF_48_TAPS;
niv17 0:2076b4d80327 49 else if(samplerate == 88200)
niv17 0:2076b4d80327 50 return MIT_HRTF_88_TAPS;
niv17 0:2076b4d80327 51 else if(samplerate == 96000)
niv17 0:2076b4d80327 52 return MIT_HRTF_96_TAPS;
niv17 0:2076b4d80327 53
niv17 0:2076b4d80327 54 return 0;
niv17 0:2076b4d80327 55 }
niv17 0:2076b4d80327 56
niv17 0:2076b4d80327 57
niv17 0:2076b4d80327 58
niv17 0:2076b4d80327 59 unsigned int mit_hrtf_get(int* pAzimuth, int* pElevation, unsigned int samplerate, unsigned int diffused, short* psLeft, short* psRight)
niv17 0:2076b4d80327 60 {
niv17 0:2076b4d80327 61 int nInternalElevation = 0;
niv17 0:2076b4d80327 62 float fAzimuthIncrement = 0;
niv17 0:2076b4d80327 63 int nInternalAzimuth = 0;
niv17 0:2076b4d80327 64 int nSwitchLeftRight = 0;
niv17 0:2076b4d80327 65 int nAzimuthIndex = 0;
niv17 0:2076b4d80327 66 const mit_hrtf_filter_set_44* pFilter44 = 0;
niv17 0:2076b4d80327 67 const mit_hrtf_filter_set_48* pFilter48 = 0;
niv17 0:2076b4d80327 68 const mit_hrtf_filter_set_88* pFilter88 = 0;
niv17 0:2076b4d80327 69 const mit_hrtf_filter_set_96* pFilter96 = 0;
niv17 0:2076b4d80327 70 const short* psLeftTaps = 0;
niv17 0:2076b4d80327 71 const short* psRightTaps = 0;
niv17 0:2076b4d80327 72 const short* psTempTaps = 0;
niv17 0:2076b4d80327 73 unsigned int nTotalTaps = 0;
niv17 0:2076b4d80327 74 unsigned int niTap = 0;
niv17 0:2076b4d80327 75
niv17 0:2076b4d80327 76 //Check if the requested HRTF exists
niv17 0:2076b4d80327 77 if(!mit_hrtf_availability(*pAzimuth, *pElevation, samplerate, diffused))
niv17 0:2076b4d80327 78 return 0;
niv17 0:2076b4d80327 79
niv17 0:2076b4d80327 80 //Snap elevation to the nearest available elevation in the filter set
niv17 0:2076b4d80327 81 if(*pElevation < 0)
niv17 0:2076b4d80327 82 nInternalElevation = ((*pElevation - 5) / 10) * 10;
niv17 0:2076b4d80327 83 else
niv17 0:2076b4d80327 84 nInternalElevation = ((*pElevation + 5) / 10) * 10;
niv17 0:2076b4d80327 85
niv17 0:2076b4d80327 86 // Elevation of 50 has a maximum 176 in the azimuth plane so we need to handle that.
niv17 0:2076b4d80327 87 if(nInternalElevation == 50)
niv17 0:2076b4d80327 88 {
niv17 0:2076b4d80327 89 if(*pAzimuth < 0)
niv17 0:2076b4d80327 90 *pAzimuth = *pAzimuth < -176 ? -176 : *pAzimuth;
niv17 0:2076b4d80327 91 else
niv17 0:2076b4d80327 92 *pAzimuth = *pAzimuth > 176 ? 176 : *pAzimuth;
niv17 0:2076b4d80327 93 }
niv17 0:2076b4d80327 94
niv17 0:2076b4d80327 95 //Snap azimuth to the nearest available azimuth in the filter set.
niv17 0:2076b4d80327 96 switch(nInternalElevation)
niv17 0:2076b4d80327 97 {
niv17 0:2076b4d80327 98 case 0: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_00 - 1); break; // 180 5
niv17 0:2076b4d80327 99 case 10:
niv17 0:2076b4d80327 100 case -10: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_10 - 1); break; // 180 5
niv17 0:2076b4d80327 101 case 20:
niv17 0:2076b4d80327 102 case -20: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_20 - 1); break; // 180 5
niv17 0:2076b4d80327 103 case 30:
niv17 0:2076b4d80327 104 case -30: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_30 - 1); break; // 180 6
niv17 0:2076b4d80327 105 case 40:
niv17 0:2076b4d80327 106 case -40: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_40 - 1); break; // 180 6.43
niv17 0:2076b4d80327 107 case 50: fAzimuthIncrement = 176.f / (MIT_HRTF_AZI_POSITIONS_50 - 1); break; // 176 8
niv17 0:2076b4d80327 108 case 60: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_60 - 1); break; // 180 10
niv17 0:2076b4d80327 109 case 70: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_70 - 1); break; // 180 15
niv17 0:2076b4d80327 110 case 80: fAzimuthIncrement = 180.f / (MIT_HRTF_AZI_POSITIONS_80 - 1); break; // 180 30
niv17 0:2076b4d80327 111 case 90: fAzimuthIncrement = 0; break; // 0 1
niv17 0:2076b4d80327 112 };
niv17 0:2076b4d80327 113
niv17 0:2076b4d80327 114 if(*pAzimuth < 0)
niv17 0:2076b4d80327 115 {
niv17 0:2076b4d80327 116 nInternalAzimuth = (int)((int)((-*pAzimuth + fAzimuthIncrement / 2.f) / fAzimuthIncrement) * fAzimuthIncrement + 0.5f);
niv17 0:2076b4d80327 117 nSwitchLeftRight = 1;
niv17 0:2076b4d80327 118 }
niv17 0:2076b4d80327 119 else
niv17 0:2076b4d80327 120 {
niv17 0:2076b4d80327 121 nInternalAzimuth = (int)((int)((*pAzimuth + fAzimuthIncrement / 2.f) / fAzimuthIncrement) * fAzimuthIncrement + 0.5f);
niv17 0:2076b4d80327 122 }
niv17 0:2076b4d80327 123
niv17 0:2076b4d80327 124 //Determine array index for azimuth based on elevation
niv17 0:2076b4d80327 125 switch(nInternalElevation)
niv17 0:2076b4d80327 126 {
niv17 0:2076b4d80327 127 case 0: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_00 - 1)); break;
niv17 0:2076b4d80327 128 case 10:
niv17 0:2076b4d80327 129 case -10: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_10 - 1)); break;
niv17 0:2076b4d80327 130 case 20:
niv17 0:2076b4d80327 131 case -20: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_20 - 1)); break;
niv17 0:2076b4d80327 132 case 30:
niv17 0:2076b4d80327 133 case -30: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_30 - 1)); break;
niv17 0:2076b4d80327 134 case 40:
niv17 0:2076b4d80327 135 case -40: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_40 - 1)); break;
niv17 0:2076b4d80327 136 case 50: nAzimuthIndex = (int)((nInternalAzimuth / 176.f) * (MIT_HRTF_AZI_POSITIONS_50 - 1)); break;
niv17 0:2076b4d80327 137 case 60: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_60 - 1)); break;
niv17 0:2076b4d80327 138 case 70: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_70 - 1)); break;
niv17 0:2076b4d80327 139 case 80: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_80 - 1)); break;
niv17 0:2076b4d80327 140 case 90: nAzimuthIndex = (int)((nInternalAzimuth / 180.f) * (MIT_HRTF_AZI_POSITIONS_90 - 1)); break;
niv17 0:2076b4d80327 141 };
niv17 0:2076b4d80327 142
niv17 0:2076b4d80327 143 //The azimuths for +/- elevations need special handling
niv17 0:2076b4d80327 144 if(nInternalElevation == 40 || nInternalElevation == -40)
niv17 0:2076b4d80327 145 {
niv17 0:2076b4d80327 146 nInternalAzimuth = mit_hrtf_findAzimuthFor40Elev(nInternalAzimuth);
niv17 0:2076b4d80327 147 nAzimuthIndex = mit_hrtf_findIndexFor40Elev(nInternalAzimuth);
niv17 0:2076b4d80327 148 }
niv17 0:2076b4d80327 149
niv17 0:2076b4d80327 150 //Assign pointer to appropriate array depending on saple rate, normal or diffused filters, elevation, and azimuth index.
niv17 0:2076b4d80327 151 switch(samplerate)
niv17 0:2076b4d80327 152 {
niv17 0:2076b4d80327 153 case 44100:
niv17 0:2076b4d80327 154 if(diffused)
niv17 0:2076b4d80327 155 pFilter44 = &diffuse_44;
niv17 0:2076b4d80327 156 else
niv17 0:2076b4d80327 157 pFilter44 = &normal_44;
niv17 0:2076b4d80327 158
niv17 0:2076b4d80327 159 switch(nInternalElevation)
niv17 0:2076b4d80327 160 {
niv17 0:2076b4d80327 161 case -10: psLeftTaps = pFilter44->e_10[nAzimuthIndex].left;
niv17 0:2076b4d80327 162 psRightTaps = pFilter44->e_10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 163 case -20: psLeftTaps = pFilter44->e_20[nAzimuthIndex].left;
niv17 0:2076b4d80327 164 psRightTaps = pFilter44->e_20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 165 case -30: psLeftTaps = pFilter44->e_30[nAzimuthIndex].left;
niv17 0:2076b4d80327 166 psRightTaps = pFilter44->e_30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 167 case -40: psLeftTaps = pFilter44->e_40[nAzimuthIndex].left;
niv17 0:2076b4d80327 168 psRightTaps = pFilter44->e_40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 169 case 0: psLeftTaps = pFilter44->e00[nAzimuthIndex].left;
niv17 0:2076b4d80327 170 psRightTaps = pFilter44->e00[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 171 case 10: psLeftTaps = pFilter44->e10[nAzimuthIndex].left;
niv17 0:2076b4d80327 172 psRightTaps = pFilter44->e10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 173 case 20: psLeftTaps = pFilter44->e20[nAzimuthIndex].left;
niv17 0:2076b4d80327 174 psRightTaps = pFilter44->e20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 175 case 30: psLeftTaps = pFilter44->e30[nAzimuthIndex].left;
niv17 0:2076b4d80327 176 psRightTaps = pFilter44->e30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 177 case 40: psLeftTaps = pFilter44->e40[nAzimuthIndex].left;
niv17 0:2076b4d80327 178 psRightTaps = pFilter44->e40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 179 case 50: psLeftTaps = pFilter44->e50[nAzimuthIndex].left;
niv17 0:2076b4d80327 180 psRightTaps = pFilter44->e50[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 181 case 60: psLeftTaps = pFilter44->e60[nAzimuthIndex].left;
niv17 0:2076b4d80327 182 psRightTaps = pFilter44->e60[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 183 case 70: psLeftTaps = pFilter44->e70[nAzimuthIndex].left;
niv17 0:2076b4d80327 184 psRightTaps = pFilter44->e70[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 185 case 80: psLeftTaps = pFilter44->e80[nAzimuthIndex].left;
niv17 0:2076b4d80327 186 psRightTaps = pFilter44->e80[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 187 case 90: psLeftTaps = pFilter44->e90[nAzimuthIndex].left;
niv17 0:2076b4d80327 188 psRightTaps = pFilter44->e90[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 189 };
niv17 0:2076b4d80327 190
niv17 0:2076b4d80327 191 //How many taps to copy later to user's buffers
niv17 0:2076b4d80327 192 nTotalTaps = MIT_HRTF_44_TAPS;
niv17 0:2076b4d80327 193 break;
niv17 0:2076b4d80327 194 case 48000:
niv17 0:2076b4d80327 195 if(diffused)
niv17 0:2076b4d80327 196 pFilter48 = &diffuse_48;
niv17 0:2076b4d80327 197 else
niv17 0:2076b4d80327 198 pFilter48 = &normal_48;
niv17 0:2076b4d80327 199
niv17 0:2076b4d80327 200 switch(nInternalElevation)
niv17 0:2076b4d80327 201 {
niv17 0:2076b4d80327 202 case -10: psLeftTaps = pFilter48->e_10[nAzimuthIndex].left;
niv17 0:2076b4d80327 203 psRightTaps = pFilter48->e_10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 204 case -20: psLeftTaps = pFilter48->e_20[nAzimuthIndex].left;
niv17 0:2076b4d80327 205 psRightTaps = pFilter48->e_20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 206 case -30: psLeftTaps = pFilter48->e_30[nAzimuthIndex].left;
niv17 0:2076b4d80327 207 psRightTaps = pFilter48->e_30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 208 case -40: psLeftTaps = pFilter48->e_40[nAzimuthIndex].left;
niv17 0:2076b4d80327 209 psRightTaps = pFilter48->e_40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 210 case 0: psLeftTaps = pFilter48->e00[nAzimuthIndex].left;
niv17 0:2076b4d80327 211 psRightTaps = pFilter48->e00[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 212 case 10: psLeftTaps = pFilter48->e10[nAzimuthIndex].left;
niv17 0:2076b4d80327 213 psRightTaps = pFilter48->e10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 214 case 20: psLeftTaps = pFilter48->e20[nAzimuthIndex].left;
niv17 0:2076b4d80327 215 psRightTaps = pFilter48->e20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 216 case 30: psLeftTaps = pFilter48->e30[nAzimuthIndex].left;
niv17 0:2076b4d80327 217 psRightTaps = pFilter48->e30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 218 case 40: psLeftTaps = pFilter48->e40[nAzimuthIndex].left;
niv17 0:2076b4d80327 219 psRightTaps = pFilter48->e40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 220 case 50: psLeftTaps = pFilter48->e50[nAzimuthIndex].left;
niv17 0:2076b4d80327 221 psRightTaps = pFilter48->e50[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 222 case 60: psLeftTaps = pFilter48->e60[nAzimuthIndex].left;
niv17 0:2076b4d80327 223 psRightTaps = pFilter48->e60[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 224 case 70: psLeftTaps = pFilter48->e70[nAzimuthIndex].left;
niv17 0:2076b4d80327 225 psRightTaps = pFilter48->e70[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 226 case 80: psLeftTaps = pFilter48->e80[nAzimuthIndex].left;
niv17 0:2076b4d80327 227 psRightTaps = pFilter48->e80[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 228 case 90: psLeftTaps = pFilter48->e90[nAzimuthIndex].left;
niv17 0:2076b4d80327 229 psRightTaps = pFilter48->e90[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 230 };
niv17 0:2076b4d80327 231
niv17 0:2076b4d80327 232 //How many taps to copy later to user's buffers
niv17 0:2076b4d80327 233 nTotalTaps = MIT_HRTF_48_TAPS;
niv17 0:2076b4d80327 234 break;
niv17 0:2076b4d80327 235 case 88200:
niv17 0:2076b4d80327 236 if(diffused)
niv17 0:2076b4d80327 237 pFilter88 = &diffuse_88;
niv17 0:2076b4d80327 238 else
niv17 0:2076b4d80327 239 pFilter88 = &normal_88;
niv17 0:2076b4d80327 240
niv17 0:2076b4d80327 241 switch(nInternalElevation)
niv17 0:2076b4d80327 242 {
niv17 0:2076b4d80327 243 case -10: psLeftTaps = pFilter88->e_10[nAzimuthIndex].left;
niv17 0:2076b4d80327 244 psRightTaps = pFilter88->e_10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 245 case -20: psLeftTaps = pFilter88->e_20[nAzimuthIndex].left;
niv17 0:2076b4d80327 246 psRightTaps = pFilter88->e_20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 247 case -30: psLeftTaps = pFilter88->e_30[nAzimuthIndex].left;
niv17 0:2076b4d80327 248 psRightTaps = pFilter88->e_30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 249 case -40: psLeftTaps = pFilter88->e_40[nAzimuthIndex].left;
niv17 0:2076b4d80327 250 psRightTaps = pFilter88->e_40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 251 case 0: psLeftTaps = pFilter88->e00[nAzimuthIndex].left;
niv17 0:2076b4d80327 252 psRightTaps = pFilter88->e00[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 253 case 10: psLeftTaps = pFilter88->e10[nAzimuthIndex].left;
niv17 0:2076b4d80327 254 psRightTaps = pFilter88->e10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 255 case 20: psLeftTaps = pFilter88->e20[nAzimuthIndex].left;
niv17 0:2076b4d80327 256 psRightTaps = pFilter88->e20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 257 case 30: psLeftTaps = pFilter88->e30[nAzimuthIndex].left;
niv17 0:2076b4d80327 258 psRightTaps = pFilter88->e30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 259 case 40: psLeftTaps = pFilter88->e40[nAzimuthIndex].left;
niv17 0:2076b4d80327 260 psRightTaps = pFilter88->e40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 261 case 50: psLeftTaps = pFilter88->e50[nAzimuthIndex].left;
niv17 0:2076b4d80327 262 psRightTaps = pFilter88->e50[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 263 case 60: psLeftTaps = pFilter88->e60[nAzimuthIndex].left;
niv17 0:2076b4d80327 264 psRightTaps = pFilter88->e60[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 265 case 70: psLeftTaps = pFilter88->e70[nAzimuthIndex].left;
niv17 0:2076b4d80327 266 psRightTaps = pFilter88->e70[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 267 case 80: psLeftTaps = pFilter88->e80[nAzimuthIndex].left;
niv17 0:2076b4d80327 268 psRightTaps = pFilter88->e80[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 269 case 90: psLeftTaps = pFilter88->e90[nAzimuthIndex].left;
niv17 0:2076b4d80327 270 psRightTaps = pFilter88->e90[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 271 };
niv17 0:2076b4d80327 272
niv17 0:2076b4d80327 273 //How many taps to copy later to user's buffers
niv17 0:2076b4d80327 274 nTotalTaps = MIT_HRTF_88_TAPS;
niv17 0:2076b4d80327 275 break;
niv17 0:2076b4d80327 276 case 96000:
niv17 0:2076b4d80327 277 if(diffused)
niv17 0:2076b4d80327 278 pFilter96 = &diffuse_96;
niv17 0:2076b4d80327 279 else
niv17 0:2076b4d80327 280 pFilter96 = &normal_96;
niv17 0:2076b4d80327 281
niv17 0:2076b4d80327 282 switch(nInternalElevation)
niv17 0:2076b4d80327 283 {
niv17 0:2076b4d80327 284 case -10: psLeftTaps = pFilter96->e_10[nAzimuthIndex].left;
niv17 0:2076b4d80327 285 psRightTaps = pFilter96->e_10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 286 case -20: psLeftTaps = pFilter96->e_20[nAzimuthIndex].left;
niv17 0:2076b4d80327 287 psRightTaps = pFilter96->e_20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 288 case -30: psLeftTaps = pFilter96->e_30[nAzimuthIndex].left;
niv17 0:2076b4d80327 289 psRightTaps = pFilter96->e_30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 290 case -40: psLeftTaps = pFilter96->e_40[nAzimuthIndex].left;
niv17 0:2076b4d80327 291 psRightTaps = pFilter96->e_40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 292 case 0: psLeftTaps = pFilter96->e00[nAzimuthIndex].left;
niv17 0:2076b4d80327 293 psRightTaps = pFilter96->e00[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 294 case 10: psLeftTaps = pFilter96->e10[nAzimuthIndex].left;
niv17 0:2076b4d80327 295 psRightTaps = pFilter96->e10[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 296 case 20: psLeftTaps = pFilter96->e20[nAzimuthIndex].left;
niv17 0:2076b4d80327 297 psRightTaps = pFilter96->e20[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 298 case 30: psLeftTaps = pFilter96->e30[nAzimuthIndex].left;
niv17 0:2076b4d80327 299 psRightTaps = pFilter96->e30[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 300 case 40: psLeftTaps = pFilter96->e40[nAzimuthIndex].left;
niv17 0:2076b4d80327 301 psRightTaps = pFilter96->e40[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 302 case 50: psLeftTaps = pFilter96->e50[nAzimuthIndex].left;
niv17 0:2076b4d80327 303 psRightTaps = pFilter96->e50[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 304 case 60: psLeftTaps = pFilter96->e60[nAzimuthIndex].left;
niv17 0:2076b4d80327 305 psRightTaps = pFilter96->e60[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 306 case 70: psLeftTaps = pFilter96->e70[nAzimuthIndex].left;
niv17 0:2076b4d80327 307 psRightTaps = pFilter96->e70[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 308 case 80: psLeftTaps = pFilter96->e80[nAzimuthIndex].left;
niv17 0:2076b4d80327 309 psRightTaps = pFilter96->e80[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 310 case 90: psLeftTaps = pFilter96->e90[nAzimuthIndex].left;
niv17 0:2076b4d80327 311 psRightTaps = pFilter96->e90[nAzimuthIndex].right; break;
niv17 0:2076b4d80327 312 };
niv17 0:2076b4d80327 313
niv17 0:2076b4d80327 314 //How many taps to copy later to user's buffers
niv17 0:2076b4d80327 315 nTotalTaps = MIT_HRTF_96_TAPS;
niv17 0:2076b4d80327 316 break;
niv17 0:2076b4d80327 317 };
niv17 0:2076b4d80327 318
niv17 0:2076b4d80327 319 //Switch left and right ear if the azimuth is to the left of front centre (azimuth < 0)
niv17 0:2076b4d80327 320 if(nSwitchLeftRight)
niv17 0:2076b4d80327 321 {
niv17 0:2076b4d80327 322 psTempTaps = psRightTaps;
niv17 0:2076b4d80327 323 psRightTaps = psLeftTaps;
niv17 0:2076b4d80327 324 psLeftTaps = psTempTaps;
niv17 0:2076b4d80327 325 }
niv17 0:2076b4d80327 326
niv17 0:2076b4d80327 327 //Copy taps to user's arrays
niv17 0:2076b4d80327 328 for(niTap = 0; niTap < nTotalTaps; niTap++)
niv17 0:2076b4d80327 329 {
niv17 0:2076b4d80327 330 psLeft[niTap] = psLeftTaps[niTap];
niv17 0:2076b4d80327 331 psRight[niTap] = psRightTaps[niTap];
niv17 0:2076b4d80327 332 }
niv17 0:2076b4d80327 333
niv17 0:2076b4d80327 334 //Assign the real azimuth and elevation used
niv17 0:2076b4d80327 335 *pAzimuth = nInternalAzimuth;
niv17 0:2076b4d80327 336 *pElevation = nInternalElevation;
niv17 0:2076b4d80327 337
niv17 0:2076b4d80327 338 return nTotalTaps;
niv17 0:2076b4d80327 339 }
niv17 0:2076b4d80327 340
niv17 0:2076b4d80327 341
niv17 0:2076b4d80327 342
niv17 0:2076b4d80327 343 int mit_hrtf_findAzimuthFor40Elev(int azimuth)
niv17 0:2076b4d80327 344 {
niv17 0:2076b4d80327 345 if(azimuth >= 0 && azimuth < 4)
niv17 0:2076b4d80327 346 return 0;
niv17 0:2076b4d80327 347 else if(azimuth >= 4 && azimuth < 10)
niv17 0:2076b4d80327 348 return 6;
niv17 0:2076b4d80327 349 else if(azimuth >= 10 && azimuth < 17)
niv17 0:2076b4d80327 350 return 13;
niv17 0:2076b4d80327 351 else if(azimuth >= 17 && azimuth < 23)
niv17 0:2076b4d80327 352 return 19;
niv17 0:2076b4d80327 353 else if(azimuth >= 23 && azimuth < 30)
niv17 0:2076b4d80327 354 return 26;
niv17 0:2076b4d80327 355 else if(azimuth >= 30 && azimuth < 36)
niv17 0:2076b4d80327 356 return 32;
niv17 0:2076b4d80327 357 else if(azimuth >= 36 && azimuth < 43)
niv17 0:2076b4d80327 358 return 39;
niv17 0:2076b4d80327 359 else if(azimuth >= 43 && azimuth < 49)
niv17 0:2076b4d80327 360 return 45;
niv17 0:2076b4d80327 361 else if(azimuth >= 49 && azimuth < 55)
niv17 0:2076b4d80327 362 return 51;
niv17 0:2076b4d80327 363 else if(azimuth >= 55 && azimuth < 62)
niv17 0:2076b4d80327 364 return 58;
niv17 0:2076b4d80327 365 else if(azimuth >= 62 && azimuth < 68)
niv17 0:2076b4d80327 366 return 64;
niv17 0:2076b4d80327 367 else if(azimuth >= 68 && azimuth < 75)
niv17 0:2076b4d80327 368 return 71;
niv17 0:2076b4d80327 369 else if(azimuth >= 75 && azimuth < 81)
niv17 0:2076b4d80327 370 return 77;
niv17 0:2076b4d80327 371 else if(azimuth >= 81 && azimuth < 88)
niv17 0:2076b4d80327 372 return 84;
niv17 0:2076b4d80327 373 else if(azimuth >= 88 && azimuth < 94)
niv17 0:2076b4d80327 374 return 90;
niv17 0:2076b4d80327 375 else if(azimuth >= 94 && azimuth < 100)
niv17 0:2076b4d80327 376 return 96;
niv17 0:2076b4d80327 377 else if(azimuth >= 100 && azimuth < 107)
niv17 0:2076b4d80327 378 return 103;
niv17 0:2076b4d80327 379 else if(azimuth >= 107 && azimuth < 113)
niv17 0:2076b4d80327 380 return 109;
niv17 0:2076b4d80327 381 else if(azimuth >= 113 && azimuth < 120)
niv17 0:2076b4d80327 382 return 116;
niv17 0:2076b4d80327 383 else if(azimuth >= 120 && azimuth < 126)
niv17 0:2076b4d80327 384 return 122;
niv17 0:2076b4d80327 385 else if(azimuth >= 126 && azimuth < 133)
niv17 0:2076b4d80327 386 return 129;
niv17 0:2076b4d80327 387 else if(azimuth >= 133 && azimuth < 139)
niv17 0:2076b4d80327 388 return 135;
niv17 0:2076b4d80327 389 else if(azimuth >= 139 && azimuth < 145)
niv17 0:2076b4d80327 390 return 141;
niv17 0:2076b4d80327 391 else if(azimuth >= 145 && azimuth < 152)
niv17 0:2076b4d80327 392 return 148;
niv17 0:2076b4d80327 393 else if(azimuth >= 152 && azimuth < 158)
niv17 0:2076b4d80327 394 return 154;
niv17 0:2076b4d80327 395 else if(azimuth >= 158 && azimuth < 165)
niv17 0:2076b4d80327 396 return 161;
niv17 0:2076b4d80327 397 else if(azimuth >= 165 && azimuth < 171)
niv17 0:2076b4d80327 398 return 167;
niv17 0:2076b4d80327 399 else if(azimuth >= 171 && azimuth < 178)
niv17 0:2076b4d80327 400 return 174;
niv17 0:2076b4d80327 401 else
niv17 0:2076b4d80327 402 return 180;
niv17 0:2076b4d80327 403 };
niv17 0:2076b4d80327 404
niv17 0:2076b4d80327 405
niv17 0:2076b4d80327 406
niv17 0:2076b4d80327 407 int mit_hrtf_findIndexFor40Elev(int azimuth)
niv17 0:2076b4d80327 408 {
niv17 0:2076b4d80327 409 if(azimuth >= 0 && azimuth < 4)
niv17 0:2076b4d80327 410 return 0;
niv17 0:2076b4d80327 411 else if(azimuth >= 4 && azimuth < 10)
niv17 0:2076b4d80327 412 return 1;
niv17 0:2076b4d80327 413 else if(azimuth >= 10 && azimuth < 17)
niv17 0:2076b4d80327 414 return 2;
niv17 0:2076b4d80327 415 else if(azimuth >= 17 && azimuth < 23)
niv17 0:2076b4d80327 416 return 3;
niv17 0:2076b4d80327 417 else if(azimuth >= 23 && azimuth < 30)
niv17 0:2076b4d80327 418 return 4;
niv17 0:2076b4d80327 419 else if(azimuth >= 30 && azimuth < 36)
niv17 0:2076b4d80327 420 return 5;
niv17 0:2076b4d80327 421 else if(azimuth >= 36 && azimuth < 43)
niv17 0:2076b4d80327 422 return 6;
niv17 0:2076b4d80327 423 else if(azimuth >= 43 && azimuth < 49)
niv17 0:2076b4d80327 424 return 7;
niv17 0:2076b4d80327 425 else if(azimuth >= 49 && azimuth < 55)
niv17 0:2076b4d80327 426 return 8;
niv17 0:2076b4d80327 427 else if(azimuth >= 55 && azimuth < 62)
niv17 0:2076b4d80327 428 return 9;
niv17 0:2076b4d80327 429 else if(azimuth >= 62 && azimuth < 68)
niv17 0:2076b4d80327 430 return 10;
niv17 0:2076b4d80327 431 else if(azimuth >= 68 && azimuth < 75)
niv17 0:2076b4d80327 432 return 11;
niv17 0:2076b4d80327 433 else if(azimuth >= 75 && azimuth < 81)
niv17 0:2076b4d80327 434 return 12;
niv17 0:2076b4d80327 435 else if(azimuth >= 81 && azimuth < 88)
niv17 0:2076b4d80327 436 return 13;
niv17 0:2076b4d80327 437 else if(azimuth >= 88 && azimuth < 94)
niv17 0:2076b4d80327 438 return 14;
niv17 0:2076b4d80327 439 else if(azimuth >= 94 && azimuth < 100)
niv17 0:2076b4d80327 440 return 15;
niv17 0:2076b4d80327 441 else if(azimuth >= 100 && azimuth < 107)
niv17 0:2076b4d80327 442 return 16;
niv17 0:2076b4d80327 443 else if(azimuth >= 107 && azimuth < 113)
niv17 0:2076b4d80327 444 return 17;
niv17 0:2076b4d80327 445 else if(azimuth >= 113 && azimuth < 120)
niv17 0:2076b4d80327 446 return 18;
niv17 0:2076b4d80327 447 else if(azimuth >= 120 && azimuth < 126)
niv17 0:2076b4d80327 448 return 19;
niv17 0:2076b4d80327 449 else if(azimuth >= 126 && azimuth < 133)
niv17 0:2076b4d80327 450 return 20;
niv17 0:2076b4d80327 451 else if(azimuth >= 133 && azimuth < 139)
niv17 0:2076b4d80327 452 return 21;
niv17 0:2076b4d80327 453 else if(azimuth >= 139 && azimuth < 145)
niv17 0:2076b4d80327 454 return 22;
niv17 0:2076b4d80327 455 else if(azimuth >= 145 && azimuth < 152)
niv17 0:2076b4d80327 456 return 23;
niv17 0:2076b4d80327 457 else if(azimuth >= 152 && azimuth < 158)
niv17 0:2076b4d80327 458 return 24;
niv17 0:2076b4d80327 459 else if(azimuth >= 158 && azimuth < 165)
niv17 0:2076b4d80327 460 return 25;
niv17 0:2076b4d80327 461 else if(azimuth >= 165 && azimuth < 171)
niv17 0:2076b4d80327 462 return 26;
niv17 0:2076b4d80327 463 else if(azimuth >= 171 && azimuth < 178)
niv17 0:2076b4d80327 464 return 27;
niv17 0:2076b4d80327 465 else
niv17 0:2076b4d80327 466 return 28;
niv17 0:2076b4d80327 467 }