ese 519
mit_hrtf_lib.c@0:2076b4d80327, 2015-04-07 (annotated)
- Committer:
- niv17
- Date:
- Tue Apr 07 21:09:22 2015 +0000
- Revision:
- 0:2076b4d80327
sonic initial april 7
Who changed what in which revision?
User | Revision | Line number | New 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 | } |