aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-06-17 15:21:08 -0700
committerChris Robinson <[email protected]>2020-06-17 16:25:40 -0700
commit3f26ce4a8251e5c55c38d4b550c6afc5afe3328f (patch)
treed92b574990172ea2a44b1126de9c222193023e55 /utils
parentbeba71a6f9f499932a941afd01332af51b5f7a08 (diff)
Add a makemhr option to use the farthest field only
All fields are used for equalization, but only the farthest field is resampled, reconstructed, normalized, and written to the mhr.
Diffstat (limited to 'utils')
-rw-r--r--utils/makemhr/makemhr.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/utils/makemhr/makemhr.cpp b/utils/makemhr/makemhr.cpp
index 07ac5f88..553b3a34 100644
--- a/utils/makemhr/makemhr.cpp
+++ b/utils/makemhr/makemhr.cpp
@@ -853,11 +853,11 @@ static void ReconstructHrirs(const HrirDataT *hData)
/* Count the number of IRs to process (excluding elevations that will be
* synthesized later).
*/
- size_t total{hData->mIrCount};
+ size_t total{0};
for(uint fi{0u};fi < hData->mFdCount;fi++)
{
- for(uint ei{0u};ei < hData->mFds[fi].mEvStart;ei++)
- total -= hData->mFds[fi].mEvs[ei].mAzCount;
+ for(uint ei{hData->mFds[fi].mEvStart};ei < hData->mFds[fi].mEvCount;ei++)
+ total += hData->mFds[fi].mEvs[ei].mAzCount;
}
total *= channels;
@@ -1377,8 +1377,9 @@ int PrepareHrirData(const uint fdCount, const double (&distances)[MAX_FD_COUNT],
* from standard input.
*/
static int ProcessDefinition(const char *inName, const uint outRate, const ChannelModeT chanMode,
- const uint fftSize, const int equalize, const int surface, const double limit,
- const uint truncSize, const HeadModelT model, const double radius, const char *outName)
+ const bool farfield, const uint fftSize, const int equalize, const int surface,
+ const double limit, const uint truncSize, const HeadModelT model, const double radius,
+ const char *outName)
{
char rateStr[8+1], expName[MAX_PATH_LEN];
HrirDataT hData;
@@ -1440,6 +1441,20 @@ static int ProcessDefinition(const char *inName, const uint outRate, const Chann
fprintf(stdout, "Performing diffuse-field equalization...\n");
DiffuseFieldEqualize(c, m, dfa.data(), &hData);
}
+ if(hData.mFds.size() > 1)
+ {
+ fprintf(stdout, "Sorting %zu fields...\n", hData.mFds.size());
+ std::sort(hData.mFds.begin(), hData.mFds.end(),
+ [](const HrirFdT &lhs, const HrirFdT &rhs) noexcept
+ { return lhs.mDistance < rhs.mDistance; });
+ if(farfield)
+ {
+ fprintf(stdout, "Clearing %zu near field%s...\n", hData.mFds.size()-1,
+ (hData.mFds.size()-1 != 1) ? "s" : "");
+ hData.mFds.erase(hData.mFds.cbegin(), hData.mFds.cend()-1);
+ hData.mFdCount = 1;
+ }
+ }
if(outRate != 0 && outRate != hData.mIrRate)
{
fprintf(stdout, "Resampling HRIRs...\n");
@@ -1471,6 +1486,7 @@ static void PrintHelp(const char *argv0, FILE *ofile)
fprintf(ofile, " resample the HRIRs accordingly.\n");
fprintf(ofile, " -m Change the data set to mono, mirroring the left ear for the\n");
fprintf(ofile, " right ear.\n");
+ fprintf(ofile, " -a Change the data set to single field, using the farthest field.\n");
fprintf(ofile, " -f <points> Override the FFT window size (default: %u).\n", DEFAULT_FFTSIZE);
fprintf(ofile, " -e {on|off} Toggle diffuse-field equalization (default: %s).\n", (DEFAULT_EQUALIZE ? "on" : "off"));
fprintf(ofile, " -s {on|off} Toggle surface-weighted diffuse-field average (default: %s).\n", (DEFAULT_SURFACE ? "on" : "off"));
@@ -1497,6 +1513,7 @@ int main(int argc, char *argv[])
HeadModelT model;
uint truncSize;
double radius;
+ bool farfield;
double limit;
int opt;
@@ -1519,8 +1536,9 @@ int main(int argc, char *argv[])
truncSize = DEFAULT_TRUNCSIZE;
model = DEFAULT_HEAD_MODEL;
radius = DEFAULT_CUSTOM_RADIUS;
+ farfield = false;
- while((opt=getopt(argc, argv, "r:mf:e:s:l:w:d:c:e:i:o:h")) != -1)
+ while((opt=getopt(argc, argv, "r:maf:e:s:l:w:d:c:e:i:o:h")) != -1)
{
switch(opt)
{
@@ -1537,6 +1555,10 @@ int main(int argc, char *argv[])
chanMode = CM_ForceMono;
break;
+ case 'a':
+ farfield = true;
+ break;
+
case 'f':
fftSize = static_cast<uint>(strtoul(optarg, &end, 10));
if(end[0] != '\0' || (fftSize&(fftSize-1)) || fftSize < MIN_FFTSIZE || fftSize > MAX_FFTSIZE)
@@ -1632,8 +1654,8 @@ int main(int argc, char *argv[])
}
}
- int ret = ProcessDefinition(inName, outRate, chanMode, fftSize, equalize, surface, limit,
- truncSize, model, radius, outName);
+ int ret = ProcessDefinition(inName, outRate, chanMode, farfield, fftSize, equalize, surface,
+ limit, truncSize, model, radius, outName);
if(!ret) return -1;
fprintf(stdout, "Operation completed.\n");